İçeriğe geç
NetDevOps
11 dk okuma DevOps

Flux CD ile Kubernetes GitOps: Kapsamlı Kurulum ve Yapılandırma Rehberi

Kubernetes ortamlarında uygulama dağıtımı ve konfigürasyon yönetimi gün geçtikçe karmaşıklaşıyor. Ekiplerin birden fazla cluster, environment ve uygulama ile uğraştığı durumlarda manuel deployment süreçleri hata yapma riskini artırıyor ve operasyonel overheadı yükseltiyor. Bu noktada GitOps metodolojisi, altyapı ve uygulama yönetiminde devrim niteliğinde bir yaklaşım sunuyor. GitOps'un temel prensibi, sistemin istenen durumunu Git repositorylerinde declaratif olarak tanımlamak ve bu durumu otomatik olarak cluster'a senkronize etmektir. Flux CD, bu prensibi hayata geçiren en güçlü açık kaynak araçlarından biridir ve CNCF graduated projesi olarak endüstri standardı haline gelmiştir.

Bu makalede Flux CD'nin mimarisinden kurulumuna, temel konseptlerinden ileri düzey kullanım senaryolarına kadar kapsamlı bir inceleme yapacağız. Özellikle çoklu tenant destekleyen clusterlarda güvenli kullanım, Helm entegrasyonu ve Kustomize ile birlikte kullanımı detaylı örneklerle ele alacağız.

Flux CD Nedir ve Neden Kullanılmalıdır

Flux CD, Kubernetes clusterlarını Git repositorylerinden ve diğer kaynaklardan gelen declarative konfigürasyonlarla senkronize eden bir set Kubernetes controller'ından oluşur. Geleneksel CI/CD pipeline'larının aksine, Flux sürekli olarak cluster'ın mevcut durumunu Git'de tanımlanan istenen durumla karşılaştırır ve farklılıkları otomatik olarak düzeltir. Bu yaklaşım, "single source of truth" prensibini uygulayarak altyapı kodunun her zaman güncel ve izlenebilir olmasını sağlar.

Flux'un temel avantajları arasında tamamen Git-merkezili çalışması, built-in UI olmaması (bu da saldırı yüzeyini azaltır), küçük footprint (yaklaşık 150 MB RAM), multi-cluster yönetim desteği ve güçlü multi-tenancy özellikleri yer alır. ArgoCD ile karşılaştırıldığında, Flux daha minimal bir yaklaşım benimser ve CLI-first bir deneyim sunar. Ancak her iki araç da aynı problemi çözer ve seçim ekip tercihlerine bağlıdır.

Flux Bileşenleri ve Mimarisi

Flux CD, dört ana controller'dan oluşur ve her biri belirli bir sorumluluk alanına sahiptir. Source Controller, Git repositoryler, Helm repositoryleri, OCI artifactları ve S3 bucketları gibi kaynaklardan içerik çeker. Kustomize Controller, bu kaynaklardan gelen manifestleri işler ve Kustomize overlay'leri uygulayarak cluster'a deploy eder. Helm Controller, Helm chart release'lerini yönetir ve chart güncellemelerini takip eder. Notification Controller ise Flux olaylarını Slack, Microsoft Teams, Discord gibi harici sistemlere bildirir.

Bu controller'lar Kubernetes custom resource definitions (CRD) üzerinden yönetilir. Kullanıcılar YAML manifestleri oluşturarak Flux'a ne deploy edeceğini, hangi aralıklarla kontrol edeceğini ve hangi koşullarda bildirim göndereceğini belirtir. Tüm bu konfigürasyonlar Git'te version-controlled olarak tutulur ve her değişiklik audit trail bırakır.

Flux CLI Kurulumu ve Bootstrap Süreci

Flux'u bir Kubernetes cluster'ına kurmak için öncelikle flux CLI'ın yerel makineye kurulması gerekir. Linux sistemlerde aşağıdaki komutla kurulum yapılabilir:

curl -s https://fluxcd.io/install.sh | sudo bash

Kurulum tamamlandıktan sonra flux versiyonunu kontrol edin:

flux --version

Flux'un cluster'da çalışabilmesi için belirli ön koşulların sağlanması gerekir. Kubernetes 1.20 veya üzeri bir cluster, kubectl konfigürasyonu ve cluster-admin yetkileri yeterlidir. Ön koşulları kontrol etmek için:

flux check --pre

GitHub ile Bootstrap

Flux bootstrap komutu, tüm Flux bileşenlerini cluster'a kurar ve bir Git repository'si ile bağlar. Bu tek komut, source-controller, kustomize-controller, helm-controller ve notification-controller'ları oluşturur, gerekli CRD'leri yükler ve repository'den cluster'a senkronizasyonu başlatır. Bootstrap için bir GitHub personal access token gerekir ve bu token repo yetkisine sahip olmalıdır.

Aşağıdaki örnek, GitHub kullanarak Flux'u bootstrap etme sürecini gösterir:

export GITHUB_TOKEN=<your-token>
export GITHUB_USER=<your-username>
export GITHUB_REPO=<your-repo-name>

flux bootstrap github   --owner=$GITHUB_USER   --repository=$GITHUB_REPO   --branch=main   --path=./clusters/production   --personal

Bu komut çalıştırıldığında Flux, belirtilen GitHub repository'sinde clusters/production dizinini oluşturur ve Flux bileşen manifestlerini bu dizine commit eder. Ardından bu manifestleri cluster'a uygular ve repository'yi izlemeye başlar. Artık cluster'ın durumu tamamen Git tarafından kontrol ediliyor demektir.

Flux Temel Kaynakları

Flux ile çalışırken anlaşılması gereken birkaç temel custom resource vardır. GitRepository, bir Git repository'sinin Flux tarafından izlenmesini sağlar. HelmRepository, Helm chart repositorylerini tanımlar. Kustomize, Kubernetes manifestlerinin Kustomize ile işlenmesini yönetir. HelmRelease ise Helm chart deploymantlarını declaratif olarak tanımlar.

GitRepository Oluşturma

Bir GitRepository kaynağı, Flux'un hangi repository'yi hangi branch veya tag'i izleyeceğini belirtir:

apiVersion: source.toolkit.fluxcd.io/v1
kind: GitRepository
metadata:
  name: applications
  namespace: flux-system
spec:
  interval: 1m
  url: https://github.com/myorg/applications
  ref:
    branch: main
  secretRef:
    name: github-credentials

Bu örnekte, applications repository'sinin main branch'i her dakika kontrol edilir. Credentials kullanılarak private repository'lere de erişilebilir. interval alanı, Flux'un kaynağı ne sıklıkla kontrol edeceğini belirler ve GitOps döngüsünün hızını belirler.

HelmRepository Tanımlama

Helm chart'ları için bir HelmRepository oluşturmak, Flux'a chart kaynaklarını bildirir:

apiVersion: source.toolkit.fluxcd.io/v1
kind: HelmRepository
metadata:
  name: bitnami
  namespace: flux-system
spec:
  interval: 1h
  url: https://charts.bitnami.com/bitnami
  type: "public"

Bitnami repository'si public olduğu için secret gerekmez. Private Helm repository'ler için credentials secret olarak tanımlanmalı ve secretRef ile referans verilmelidir. interval değeri, repository'nin indeksini ne sıklıkla yenileyeceğini belirler.

Kustomization ve HelmRelease Kullanımı

Flux'un gücü, Kustomize ve Helm entegrasyonlarında yatar. Bu iki araç kombinasyonu, farklı environment'lar için farklı konfigürasyonlar tanımlamayı ve tek bir base manifest setinden production, staging, development ortamları oluşturmayı mümkün kılar.

Kustomization ile Uygulama Deploy Etme

Bir Kustomization kaynağı, GitRepository'den gelen manifestlerin nasıl uygulanacağını belirtir:

apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
  name: myapp
  namespace: flux-system
spec:
  interval: 10m
  path: "./apps/myapp"
  prune: true
  sourceRef:
    kind: GitRepository
    name: applications
  healthChecks:
    - apiVersion: apps/v1
      kind: Deployment
      name: myapp
      namespace: myapp
  timeout: 5m

Bu konfigürasyonda, myapp uygulaması her 10 dakikada bir kontrol edilir. path alanı, GitRepository'deki hangi dizinin uygulanacağını belirtir. prune: true parametresi, artık Git'de bulunmayan kaynakların cluster'dan silinmesini sağlar. healthChecks ise deployment'ın sağlıklı kabul edilmesi için gerekli koşulları tanımlar.

HelmRelease ile Chart Deploy Etme

HelmRelease, Helm chart'larını Flux ile declaratif olarak deploy etmeyi sağlar:

apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
  name: redis
  namespace: cache
spec:
  interval: 30m
  chart:
    spec:
      chart: redis
      version: "18.x"
      sourceRef:
        kind: HelmRepository
        name: bitnami
        namespace: flux-system
  targetNamespace: cache
  values:
    architecture: standalone
    auth:
      enabled: true

Bu örnek, Bitnami repository'sinden Redis chart'ını version 18.x ile deploy eder. values alanı, chart'a özgü değerleri belirtir ve traditional Helm values dosyaları ile aynı formatı kullanır. interval, chart güncellemelerinin ne sıklıkla kontrol edileceğini belirler.

Multi-Tenancy ve Güvenlik

Flux CD, paylaşılan Kubernetes clusterlarında birden fazla tenant'ın güvenli bir şekilde çalışmasını destekler. Multi-tenancy yapılandırması, tenant'ların birbirlerinin kaynaklarına erişmesini engellemek ve her tenant'ın yalnızca kendi namespace'lerinde çalışmasını sağlamak için Kubernetes RBAC ve namespace izolasyonunu kullanır.

Multi-Tenancy Lockdown

Flux'u multi-tenant bir cluster'da güvenli şekilde çalıştırmak için bootstrap sırasında özel argumentler kullanılmalıdır:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - gotk-components.yaml
  - gotk-sync.yaml
patches:
  - patch: |
    - op: add
      path: /spec/template/spec/containers/0/args/-
      value: --no-cross-namespace-refs=true
    target:
      kind: Deployment
      name: "(kustomize-controller|helm-controller|notification-controller|image-reflector-controller|image-automation-controller)"
  - patch: |
    - op: add
      path: /spec/template/spec/containers/0/args/-
      value: --no-remote-bases=true
    target:
      kind: Deployment
      name: "kustomize-controller"
  - patch: |
    - op: add
      path: /spec/template/spec/containers/0/args/-
      value: --default-service-account=default
    target:
      kind: Deployment
      name: "(kustomize-controller|helm-controller)"

Bu konfigürasyon, Flux controller'larını çeşitli güvenlik kısıtlamalarıyla çalıştırır. --no-cross-namespace-refs, Flux custom resource'larına cross-namespace erişimini engeller, böylece bir tenant diğer tenant'ın kaynaklarına erişemez. --no-remote-bases, Kustomize remote base'lerini devre dışı bırakarak yalnızca Flux Sources'un cluster durumunu etkilemesini sağlar. --default-service-account ise service account belirtilmeyen Kustomization ve HelmRelease'lerin default service account kullanmasını engeller.

Service Account Impersonation

Flux'un en güçlü güvenlik özelliklerinden biri service account impersonation'dır. Her Kustomization veya HelmRelease, spec.serviceAccountName alanında bir service account belirterek, Flux controller'larının o service account'un yetkileriyle kaynak oluşturmasını sağlar:

apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
  name: team-alpha
  namespace: team-alpha
spec:
  serviceAccountName: team-alpha-deploy
  interval: 5m
  path: "./apps"
  prune: true
  sourceRef:
    kind: GitRepository
    name: team-alpha-repo

Bu örnekte, team-alpha-deploy service account, Kustomization'ın oluşturduğu tüm kaynaklar için kullanılır. Platform admin, bu service account'a yalnızca team-alpha namespace'inde yetki vererek, tenant'ın cluster'ın geri kalanını etkilemesini engeller.

Flux ile CI/CD Pipeline Entegrasyonu

Flux CD, mevcut CI/CD pipeline'larını tamamlayıcı bir rol üstlenir. Geleneksel CI/CD sistemleri (GitLab CI, GitHub Actions, Jenkins) kod derleme, test çalıştırma ve container image oluşturma işlemlerini yaparken, Flux CD deployment ve konfigürasyon senkronizasyonunu üstlenir. Bu ayrım, sorumlulukların net şekilde ayrılmasını ve "separation of concerns" prensibinin uygulanmasını sağlar.

Image Update Automation

Flux, container image güncellemelerini otomatik olarak takip edebilir ve Git'te manifest güncellemeleri yapabilir. Bu özellik, ImageRepository ve ImagePolicy kaynakları kullanılarak etkinleştirilir:

apiVersion: image.toolkit.fluxcd.io/v1beta1
kind: ImageRepository
metadata:
  name: myapp
  namespace: flux-system
spec:
  image: registry.myorg.com/myapp
  interval: 1m
---
apiVersion: image.toolkit.fluxcd.io/v1beta1
kind: ImagePolicy
metadata:
  name: myapp
  namespace: flux-system
spec:
  imageRef: myapp
  policy:
    semver:
      range: ">=1.0.0 2.0.0"
---
apiVersion: image.toolkit.fluxcd.io/v1beta1
kind: ImageUpdateAutomation
metadata:
  name: myapp
  namespace: flux-system
spec:
  interval: 1m
  sourceRef:
    kind: GitRepository
    name: applications
  git:
    branch: main
  commit:
    author:
      email: flux@myorg.com
      name: flux
  update:
    path: "./apps/myapp"

Bu konfigürasyon, myapp image'ının yeni versiyonlarını takip eder ve semver politikasına göre uygun güncellemeleri yapar. ImageUpdateAutomation, her yeni image push edildiğinde apps/myapp dizinindeki manifestleri güncelleyecek ve commit edecektir. Bu sayede image güncellemeleri tamamen otomatik hale gelir.

En İyi Uygulamalar ve İpuçları

Flux CD kullanırken production ortamlarında güvenlik ve güvenilirlik için bazı en iyi uygulamaları takip etmek önemlidir. İlk olarak, tüm Flux konfigürasyonlarını Git'te tutun ve bu repository'leri ayrı ayrı yönetin. Platform yöneticileri için bir "infrastructure" repository, tenant'lar için ayrı repository'ler kullanılması önerilir. İkinci olarak, multi-tenancy lockdown'ı paylaşılan clusterlarda mutlaka etkinleştirin. Üçüncü olarak, health check'leri tanımlayarak deployment'ların sağlıklı olduğundan emin olun.

Notification konfigürasyonu, operasyonel görünürlük için kritiktir. Slack, Microsoft Teams veya webhook tabanlı sistemler için bildirimler kurarak, Flux'un başarısız veya başarılı senkronizasyonları hakkında bilgi alın. Ayrıca, Flux loglarını düzenli olarak gözden geçirin ve olası sorunları erken tespit edin. Son olarak, Flux versiyonlarını düzenli olarak güncelleyin ve güncellemeleri önce staging ortamında test edin.

Sonuç

Flux CD, Kubernetes GitOps implementasyonu için güçlü ve esnek bir çözümdür. Tamamen Git-merkezili yaklaşımı, küçük footprint'i, güçlü multi-tenancy desteği ve güvenlik özellikleri onu enterprise ortamları için ideal kılar. Özellikle ArgoCD'nin sunduğu web UI'ya ihtiyaç duymayan, CLI-odaklı ekipler için Flux, daha minimalist ve güvenli bir alternatif sunar.

Bu makalede ele aldığımız konular, Flux CD'ye başlamak ve production'da güvenli şekilde kullanmak için gerekli temel bilgileri kapsar. Controller'ların mimarisi, bootstrap süreci, temel kaynaklar (GitRepository, HelmRepository, Kustomization, HelmRelease), multi-tenancy konfigürasyonu ve en iyi uygulamalar, Flux ile etkili GitOps pipeline'ları oluşturmak için bilmeniz gereken temel konulardır. Flux CD'yi kullanarak Kubernetes deployment süreçlerinizi otomatikleştirebilir, güvenliği artırabilir ve operasyonel overhead'ı azaltabilirsiniz.