Tekton Pipeline ile Kubernetes Üzerinde Gerçek Cloud Native CI/CD Implementasyonu

 · 

Tekton Pipeline ile Kubernetes Üzerinde Gerçek Cloud Native CI/CD Implementasyonu

Tekton Pipeline ile Kubernetes Üzerinde Gerçek Cloud Native CI/CD Implementasyonu

Gelişen konteynerize uygulama ekosisteminde, CI/CD süreçlerinin Kubernetes’in doğasına uygun, esnek ve ölçeklenebilir olması bir zorunluluktur. Tekton Pipeline, bu ihtiyacı karşılamak üzere Kubernetes-native bir çözüm sunar. Jenkins veya GitLab CI gibi geleneksel araçların Kubernetes üzerinde çalıştırılması, genellikle ayrı bir sanal makine veya pod içinde bir CI/CD sunucusu gerektirirken, Tekton doğrudan Kubernetes API’sini kullanarak deklaratif pipeline’lar oluşturur. Bu, tüm CI/CD yaşam döngüsünün Kubernetes kaynakları olarak yönetilebildiği, daha tutarlı ve verimli bir ortam sağlar.

Tekton'un Temelleri: Neden Kubernetes-Native?

Tekton, Kubernetes custom resources (CRD'ler) üzerine inşa edilmiştir. Bu mimari, CI/CD bileşenlerinin Kubernetes kaynakları gibi davranmasını sağlar. Bir `Task` ya da `PipelineRun` oluşturduğunuzda, Kubernetes API sunucusuna bir istek gönderirsiniz ve Kubernetes denetleyicileri (controllers) bu kaynakları yönetir. Bu yaklaşım, Kubernetes'in yerleşik yeteneklerinden (ölçeklenebilirlik, hata toleransı, kaynak izolasyonu) doğrudan faydalanmayı mümkün kılar. Her adım bir Pod içinde izole bir şekilde çalışır, bu da güvenlik ve tekrarlanabilirlik açısından önemli avantajlar sunar.

Tekton Bileşenleri

  • Tasks: Bir veya daha fazla adımdan (step) oluşan, tekrar kullanılabilir en küçük iş birimidir. Örneğin, kodu klonlama, bağımlılıkları yükleme, testleri çalıştırma veya bir Docker imajı oluşturma birer `Task` olabilir.
  • Pipelines: Belirli bir sıraya göre veya paralel olarak yürütülen `Task` dizilerini tanımlar. Bir uygulamanın uçtan uca CI/CD sürecini (build, test, deploy) temsil eder.
  • PipelineRuns: Bir `Pipeline`'ın belirli bir çalıştırmasını temsil eden bir Kubernetes kaynağıdır. `Pipeline`'a giriş parametreleri ve kaynaklar sağlar.
  • TaskRuns: Bir `Task`'ın belirli bir çalıştırmasını temsil eder. Genellikle `PipelineRun` tarafından oluşturulur, ancak bağımsız olarak da çalıştırılabilir.
  • Workspaces: `Task`'lar ve `Pipeline`'lar arasında dosya sistemini paylaşmak için kullanılır. PersistentVolumeClaim (PVC) veya EmptyDir gibi Kubernetes depolama seçenekleriyle entegre olur.

Tekton Task Tanımlama: Bir Basit Örnek

Bir `Task`, genellikle bir Docker imajı içinde belirli komutları çalıştırır. Aşağıdaki örnek, bir Git deposunu klonlayan basit bir `Task` tanımlar.

apiVersion: tekton.dev/v1beta1kind: Taskmetadata:  name: git-clone-taskspec:  params:    - name: repo-url      type: string      description: Klonlanacak Git deposunun URL'si    - name: branch      type: string      description: Klonlanacak dalın adı      default: main  workspaces:    - name: output      description: Klonlanan repo'nun depolanacağı yer  steps:    - name: clone-repo      image: alpine/git      script: |        #!/bin/sh        git clone $(params.repo-url) $(workspaces.output.path)/repo        cd $(workspaces.output.path)/repo        git checkout $(params.branch)

Bu `Task`, `repo-url` ve `branch` parametrelerini alır ve `output` adında bir `Workspace`'e klonlama işlemini gerçekleştirir. Her `step`, kendi konteynerinde çalışır ve izole bir ortam sunar.

Tekton Pipeline Oluşturma ve Çalıştırma

Bir `Pipeline`, birden fazla `Task`'ı bir araya getirerek daha büyük bir iş akışı oluşturur. Aşağıdaki örnek, önceki `git-clone-task` ile bir uygulamayı derleyen (build) basit bir `Pipeline`'ı gösterir.

apiVersion: tekton.dev/v1beta1kind: Pipelinemetadata:  name: build-app-pipeline  spec:  workspaces:    - name: shared-workspace  tasks:    - name: clone-source      taskRef:        name: git-clone-task      workspaces:        - name: output          workspace: shared-workspace      params:        - name: repo-url          value: https://github.com/my-org/my-app.git        - name: branch          value: develop    - name: build-image      runAfter:        - clone-source      taskSpec:        params:          - name: context-dir            type: string            default: repo        workspaces:          - name: source            description: Kaynak kodun bulunduğu yer        steps:          - name: build            image: gcr.io/kaniko-project/executor:latest            args:              - --dockerfile=Dockerfile              - --destination=my-registry/my-app:$(results.commit-sha)              - --context=$(workspaces.source.path)/$(params.context-dir)            results:              - name: commit-sha                description: Son commit'in SHA'sı              script: |                #!/bin/sh                cd $(workspaces.source.path)                COMMIT_SHA=$(git rev-parse HEAD)                echo -n "$COMMIT_SHA" > $(results.commit-sha)

Bu `Pipeline`, önce `git-clone-task`'ı çalıştırır, ardından klonlanan kaynak kodu kullanarak Kaniko ile bir Docker imajı oluşturur. `shared-workspace`, iki `Task` arasında kaynak kodun paylaşımını sağlar. `PipelineRun` ile bu `Pipeline`'ı çalıştırabiliriz:

apiVersion: tekton.dev/v1beta1kind: PipelineRunmetadata:  name: build-app-pipeline-run-1spec:  pipelineRef:    name: build-app-pipeline  workspaces:    - name: shared-workspace      volumeClaimTemplate:        spec:          accessModes:            - ReadWriteOnce          resources:            requests:              storage: 1Gi

Bu `PipelineRun`, `build-app-pipeline`'ı çalıştırır ve `shared-workspace` için dinamik olarak bir `PersistentVolumeClaim` oluşturur.

Üretim Senaryosu: Mikroservis Dağıtımı

Bir e-ticaret platformunda çalışan mikroservis mimarisi düşünelim. `product-catalog` servisi için bir kod değişikliği yapıldığında, Tekton Pipeline'ın otomatik olarak yeni bir imaj oluşturması, testleri çalıştırması ve Kubernetes kümesindeki dağıtımı güncellemesi gerekir. İşte bu senaryonun Tekton ile nasıl orkestra edileceğine dair bir çerçeve:

Senaryo Detayları

  • Kod Değişikliği: Geliştirici, `product-catalog` mikroservisinde bir değişiklik yapar ve kodu Git deposuna push eder.
  • Webhook Tetikleyici: Git deposu (örneğin GitHub veya GitLab), bir push olayını Tekton Trigger'a (veya bir özel webhook'a) bildirir.
  • Tekton Pipeline Başlatma: Tetikleyici, `product-catalog-ci-cd-pipeline`'ı başlatır. Bu pipeline şunları yapar:
    • Kodu Klonlama: `git-clone-task` ile güncel kodu çeker.
    • Unit ve Entegrasyon Testleri: Kod tabanında tanımlı testleri (örneğin Maven, npm test) çalıştırır. Testler başarısız olursa pipeline durur.
    • Docker İmajı Oluşturma: `kaniko-build-task` ile yeni bir Docker imajı oluşturur (örneğin `product-catalog:v1.2.3-commitsha`).
    • İmajı Kayıt Defterine Push Etme: Oluşturulan imajı şirket içi Docker kayıt defterine (örneğin Amazon ECR, GitLab Container Registry) gönderir.
    • Helm Chart Güncelleme: Uygulamanın Helm chart'ını (varsayılan imaj etiketini yeni imaj etiketiyle güncelleyerek) günceller.
    • Helm Deploy: Güncellenmiş Helm chart'ı kullanarak `product-catalog` servisini Kubernetes kümesinde dağıtır veya günceller.
    • Entegre Testler (İsteğe Bağlı): Dağıtım sonrası uçtan uca (e2e) testler çalıştırır.

Bu senaryo için basitleştirilmiş bir `Pipeline` taslağı:

apiVersion: tekton.dev/v1beta1kind: Pipelinemetadata:  name: product-catalog-ci-cd-pipeline  spec:  params:    - name: git-repo-url      type: string    - name: git-branch      type: string      default: main    - name: image-registry      type: string    - name: image-name      type: string    - name: helm-chart-path      type: string  workspaces:    - name: shared-workspace  tasks:    - name: clone-repo      taskRef:        name: git-clone-task      workspaces:        - name: output          workspace: shared-workspace      params:        - name: repo-url          value: $(params.git-repo-url)        - name: branch          value: $(params.git-branch)    - name: run-tests      runAfter:        - clone-repo      taskRef:        name: maven-test-task # Varsayalım ki böyle bir Tekton Task'ımız var      workspaces:        - name: source          workspace: shared-workspace      params:        - name: project-path          value: $(workspaces.source.path)/repo/product-catalog    - name: build-and-push-image      runAfter:        - run-tests      taskRef:        name: kaniko-build-and-push-task # Varsayalım ki bu Task imajı build edip push ediyor      workspaces:        - name: source          workspace: shared-workspace      params:        - name: image-registry          value: $(params.image-registry)        - name: image-name          value: $(params.image-name)        - name: dockerfile-path          value: $(workspaces.source.path)/repo/product-catalog/Dockerfile        - name: context-path          value: $(workspaces.source.path)/repo/product-catalog    - name: deploy-to-kubernetes      runAfter:        - build-and-push-image      taskRef:        name: helm-upgrade-task # Varsayalım ki bu Task Helm chart'ı deploy ediyor      workspaces:        - name: source          workspace: shared-workspace      params:        - name: chart-path          value: $(params.helm-chart-path)        - name: release-name          value: product-catalog        - name: namespace          value: default        - name: new-image-tag          value: $(tasks.build-and-push-image.results.image-tag) # Önceki task'ın sonucunu kullan

Bu yapılandırma, tüm CI/CD adımlarını Kubernetes'in deklaratif yapısına entegre eder. Her adım, ayrı bir Pod içinde çalıştığı için, bir adımın başarısız olması diğerlerini etkilemez ve hata ayıklaması kolaylaşır. Kaynak tüketimi Kubernetes tarafından yönetildiği için, CI/CD altyapısının ölçeklenebilirliği ve maliyet etkinliği artar.

Gelişmiş Konular ve Entegrasyonlar

  • Tekton Triggers: Git depolarından gelen webhook'lar veya manuel tetiklemelerle `PipelineRun`'ları otomatik olarak başlatmak için kullanılır. `EventListeners`, `Triggers` ve `TriggerBindings` gibi bileşenleri içerir.
  • GitOps Yaklaşımı: Tekton, aracıların Kubernetes kümesi içinde çalışması nedeniyle GitOps ile mükemmel bir uyum içindedir. Dağıtım yapılandırmalarını Git'te tutarak, Tekton pipeline'larını bu değişikliklere tepki verecek şekilde ayarlayabilirsiniz. Argo CD veya Flux gibi araçlarla entegrasyon, dağıtım süreçlerinin deklaratif ve otomatik olmasını sağlar.
  • Güvenlik ve Yetkilendirme: Tekton, Kubernetes'in RBAC (Role-Based Access Control) mekanizmalarını kullanarak pipeline'lara ve task'lara erişimi ve yetkilendirmeyi yönetir. `ServiceAccount`'lar, `Task`'ların hangi Kubernetes kaynaklarına erişebileceğini belirlemek için kullanılır.

Tekton Pipeline, modern bulut yerel uygulama geliştirme süreçleri için güçlü, esnek ve Kubernetes'in tüm avantajlarından yararlanan bir CI/CD çözümüdür. Geleneksel CI/CD araçlarının karmaşıklığını ortadan kaldırırken, geliştiricilere deklaratif ve versiyonlanabilir pipeline'lar tanımlama imkanı sunar. Kubernetes ekosistemine derinlemesine entegre olması, Tekton'u özellikle mikroservis tabanlı ve konteynerize iş yükleri için vazgeçilmez bir araç haline getirir.

← Blog Listesine Dön