Skip to main content

Welcome to a Grasp lesson

Create a free account to keep studying and create your own study path.

Lesson 32

Automate Kubernetes Image Tag Updates in CI/CD

Recommended resources

Merhaba! Önceki dersimizde, CI iş akışımıza GitOps depomuza yazma izni vererek CI ve CD dünyaları arasında bir köprü kurduk. actions/checkout ve bir Personal Access Token (PAT) kullanarak başka bir depoya git push yapabileceğimizi kanıtladık.

Şimdi bu köprünün üzerinden anlamlı bir trafik geçirme zamanı. Bu derste, CI sürecinde oluşturulan yeni Docker imaj etiketini alıp, bu bilgiyi GitOps deposundaki Kubernetes manifestolarını otomatik olarak güncellemek için kullanacağız. Bu adım, CI'dan CD'ye geçişi tam anlamıyla otomatikleştirecektir.

Bugünkü öğrenme hedefimiz: Bir CI işi içinde bir Kubernetes manifestosunun imaj etiketini otomatikleştirecek şekilde güncellemek ve bu değişikliği depoya geri commit'lemek.

Bu dersin sonunda, bir uygulama değişikliğinin, GitOps deposunda nasıl otomatik bir manifest güncellemesine dönüştüğünü ve bu sürecin CI/CD boru hattımızı nasıl tamamladığını tam olarak anlamış olacaksınız.

CI/CD Otomasyon Döngüsünü Tamamlamak

Kurduğumuz mimariyi tekrar gözden geçirelim. Nihai hedefimiz, uygulama kodunda yapılan bir değişikliğin, herhangi bir manuel müdahale olmadan Kubernetes kümesinde çalışan yeni bir sürüme dönüşmesidir.

Automated CI/CD Pipeline with GitOps for Kubernetes
Bu şema, inşa ettiğimiz otomasyon akışını özetlemektedir. Uygulama deposuna yapılan bir `commit` (1), GitHub Actions'ı (2) tetikler. Bu iş akışı, yeni bir konteyner imajı oluşturup kayıt defterine (container registry) gönderir (3). Bugünkü odak noktamız ise 4. adım: GitHub Actions'ın, bu yeni imaj etiketini alıp GitOps deposundaki (Configuration repository) manifestoyu güncellemesi. Bu güncelleme, Fleet/Flux gibi bir GitOps operatörü (5) tarafından algılanarak yeni sürümün kümede dağıtılmasını (6) sağlar.

Önceki derste bu güncelleme için izni aldık. Bugün ise bu güncellemenin nasıl yapılacağını öğreneceğiz.


Yöntem 1: Basit Metin Değişikliği (sed)

Manifesto güncellemenin en basit yollarından biri, YAML dosyasını bir metin dosyası olarak ele alıp sed gibi komut satırı araçlarıyla düzenlemektir. sed (stream editor), metin üzerinde bul ve değiştir işlemleri yapmak için güçlü bir araçtır.

Bu yaklaşım, CI iş akışında şu şekilde işler:

  1. CI işi, yeni imaj etiketini (örneğin Git commit SHA'sının kısa hali) bir değişkene alır.
  2. GitOps deposunu klonlar.
  3. sed komutunu kullanarak ilgili manifest dosyasındaki image: satırını bulur ve etiketi yeni değerle değiştirir.
  4. Değiştirilen dosyayı GitOps deposuna commit'ler ve push'lar.

Kubernetes CI/CD: Build a Pipeline (ArgoCD + Github Actions)

Bu video, ArgoCD kullanan bir CI/CD boru hattı kurmayı gösterse de, temel prensipler bizim için de geçerlidir. Videonun bu bölümü, sed kullanarak bir dağıtım manifestosunun imaj etiketinin bir GitHub Actions iş akışı içinde nasıl güncellendiğini ve ardından bu değişikliğin GitOps deposuna nasıl commit'lendiğini adım adım gösteriyor.

Videonun 13:59 - 22:02 arasındaki bölümünü izleyin. Özellikle "Update gitops repository" adımında kullanılan run bloğundaki shell komutlarını inceleyin. sed komutunun YAML dosyasındaki image alanını nasıl hedef aldığını ve yeni imaj etiketiyle nasıl güncellediğini anlamaya odaklanın. Ayrıca, git komutlarının bu değişikliği nasıl commit'lediğine dikkat edin.

sed yaklaşımı hızlı ve basittir ancak bazı dezavantajları vardır:

  • Kırılganlık: YAML dosyasının yapısındaki (örn. girinti) küçük bir değişiklik bile sed komutunun başarısız olmasına neden olabilir.
  • Bakım Zorluğu: Karmaşık manifestolarda doğru satırı hedeflemek için yazılan regex ifadeleri karmaşıklaşabilir.

Bu yüzden, daha sağlam ve Kubernetes'e özel bir aracı incelemek genellikle daha iyi bir yaklaşımdır.


Yöntem 2: Kustomize ile Yapısal Güncelleme (Önerilen Yöntem)

  1. Modül'de Rancher Fleet için overlay yapısını öğrendiğinizde aslında Kustomize'ın temel prensipleriyle tanıştınız. Kustomize, Kubernetes için şablon-serbest (template-free) bir yapılandırma yönetim aracıdır ve YAML dosyalarını "anlayarak" düzenler. Bu, onu sed gibi metin tabanlı araçlardan çok daha güvenilir kılar.

Fleet'in overlay mekanizması, Kustomize'ı temel alır. Bu nedenle, GitOps deponuzu güncellemek için kustomize CLI aracını kullanmak, mevcut yapınızla mükemmel bir uyum içinde olacaktır.

Yapacağımız işlem kustomize edit set image komutunu kullanmaktır. Bu komut, belirtilen imajın etiketini kustomization.yaml dosyasında akıllıca günceller.

Kustomize explained in 60 minutes with detailed GitHub notes | Demo Included

Bu video Kustomize'ı detaylıca açıklıyor. Özellikle bu bölüm, kustomization.yaml içindeki images transformer'ını kullanarak bir imaj etiketinin, ana manifesto dosyasına dokunmadan nasıl güncellenebileceğini gösteriyor. Biz bu işlemi komut satırından yapacağız, ancak mantık aynı.

Videonun 31:58 - 35:30 arasındaki bölümünü izleyin. images bloğunun bir kustomization.yaml dosyasına nasıl eklendiğini ve newName ile newTag direktiflerinin imajı nasıl değiştirdiğini gözlemleyin. Bu, kustomize edit set image komutunun arka planda ne yaptığını anlamanıza yardımcı olacaktır.


Uygulama: GitHub Actions ile Kustomize Entegrasyonu

Şimdi, kustomize aracını CI iş akışımıza entegre ederek imaj etiketini otomatik olarak güncelleyelim.

İş akışımız şu adımları izleyecek:

  1. Uygulama kodunu ve GitOps manifestolarını checkout et.
  2. (Varsayım) Kodu test et, Docker imajını oluştur ve github.sha gibi bir etiketle container registry'ye push'la.
  3. kustomize CLI aracını runner'a kur.
  4. kustomize edit set image komutunu kullanarak ilgili overlay içindeki kustomization.yaml dosyasını güncelle.
  5. Değişikliği GitOps deposuna commit'le ve push'la.

Aşağıda, bu adımları içeren bir GitHub Actions iş akışı parçası bulunmaktadır. Bunu mevcut ci.yml dosyanıza entegre edebilirsiniz.




# .github/workflows/ci.yml




# ... (on: push, pull_request vb. tanımlamaları)

jobs:
  build-test-and-update-manifest:
    runs-on: ubuntu-latest
    steps:



      # Adım 1: Gerekli repoları checkout etme
      - name: Checkout Application Repo
        uses: actions/checkout@v4
        with:
          path: app

      - name: Checkout GitOps Repo
        uses: actions/checkout@v4
        with:
          repository: <github_kullanici_adiniz>/<gitops_repo_adiniz>
          path: gitops
          token: ${{ secrets.GITOPS_REPO_PAT }} # Önceki derste oluşturduğumuz secret




      # Adım 2: İmaj etiketini belirleme (Bu adımlar Docker build'den sonra gelir)
      # Örnek olarak kısa commit SHA'sını kullanıyoruz
      - name: Get Short SHA for Image Tag
        id: sha
        run: echo "tag=$(echo ${GITHUB_SHA::7})" >> $GITHUB_OUTPUT




      # Adım 3: Kustomize'ı kurma
      - name: Install Kustomize
        run: |
          curl -s "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh" | bash
          sudo mv kustomize /usr/local/bin/




      # Adım 4: Kustomize ile imaj etiketini güncelleme
      # 'overlays/dev' ve 'your-registry/pyspark-etl' kısımlarını kendi yapınıza göre düzenleyin
      - name: Update Image Tag in Kustomization
        run: |
          cd gitops/overlays/dev
          kustomize edit set image your-registry/pyspark-etl=your-registry/pyspark-etl:${{ steps.sha.outputs.tag }}
          echo "--- kustomization.yaml after update ---"
          cat kustomization.yaml




      # Adım 5: Değişiklikleri GitOps deposuna commit'leme ve push'lama
      # `EndBug/add-and-commit` eylemi bu işi bizim için basitleştirir
      - name: Commit and Push Manifest Changes
        uses: EndBug/add-and-commit@v9
        with:
          cwd: './gitops' # Çalışma dizinini gitops olarak ayarla
          add: 'overlays/dev/kustomization.yaml' # Sadece değiştirilen dosyayı ekle
          author_name: 'github-actions[bot]'
          author_email: 'github-actions[bot]@users.noreply.github.com'
          message: 'ci(dev): Update pyspark-etl image to ${{ steps.sha.outputs.tag }}'
          push: true

YAML Dosyasındaki Önemli Noktalar:

  • kustomize edit set image ...: Bu komutun formatı kustomize edit set image <orijinal_imaj_adi>=<yeni_imaj_adi_ve_etiketi> şeklindedir. İmaj adınız değişmiyorsa, sadece etiketi güncellersiniz. Bu komut, kustomization.yaml dosyanızda aşağıdaki gibi bir images bloğu oluşturur veya günceller:

    images:
    - name: your-registry/pyspark-etl
      newTag: <yeni_sha_degeri>
    
  • EndBug/add-and-commit@v9: Bu popüler GitHub Action, git komutlarını manuel olarak yazma zahmetinden kurtarır. cwd (current working directory) parametresi ile gitops dizini içinde çalışmasını, add ile hangi dosyayı commit'leyeceğini ve message ile commit mesajını belirtiriz. push: true ile de commit'in otomatik olarak gönderilmesini sağlarız.

İş akışınız başarıyla tamamlandığında, GitOps deponuzda aşağıdaki gibi bir commit görmelisiniz.

Automated Image Tag Update in a Kubernetes Manifest via Git Commit
Bu görüntü, bir CI botu tarafından otomatik olarak oluşturulmuş bir commit'i göstermektedir. Commit, `kustomization.yaml` dosyasındaki `newTag` değerini `1.0.1`'den `1.0.2`'ye güncelliyor. Bizim iş akışımız da benzer şekilde, imaj etiketini yeni Git SHA değeriyle güncelleyen bir commit oluşturacaktır.

Özet ve Sonuç

Bu dersle birlikte, CI/CD boru hattımızın en kritik otomasyon adımlarından birini tamamladık. Artık CI sürecimiz, sadece test ve imaj oluşturmakla kalmıyor, aynı zamanda oluşturduğu yeni imajı dağıtmak üzere CD sürecini tetikleyecek şekilde manifestolarımızı akıllıca güncelliyor.

Temel Çıkarımlar:

  • Kubernetes manifestolarını CI içinde güncellemek için sed gibi metin araçları kullanılabilir, ancak Kustomize gibi yapısal araçlar daha sağlam ve güvenilirdir.
  • kustomize edit set image komutu, imaj etiketlerini kustomization.yaml dosyasında güncellemek için standart ve hataya daha az açık bir yöntemdir.
  • GitHub Actions iş akışları, kustomize CLI'yı kurup çalıştırabilir ve EndBug/add-and-commit gibi yardımcı eylemlerle yapılan değişiklikleri kolayca GitOps deposuna commit'leyebilir.
  • Bu otomasyon, uygulama kodundaki bir değişikliğin, GitOps deposundaki "istenilen durum" tanımına otomatik olarak yansımasını sağlar.

Gelecek Dersin Önizlemesi:
Tüm parçaları birleştirdik! CI boru hattımız artık test ediyor, lint denetimi yapıyor, Docker imajı oluşturuyor ve GitOps manifestosunu güncelliyor. GitOps aracımız (Fleet) ise bu manifestoyu izleyerek dağıtımı yapıyor. Bir sonraki dersimizde, bu tam entegre boru hattını baştan sona çalıştıracak, süreci izleyecek ve bir geliştirme ortamı için kod değişikliğinden otomatik dağıtıma kadar tüm akışı gözlemleyeceğiz.