kertenkerem_
· DevOps · 7 dk okuma

GitOps: Altyapınızın Orkestra Şefi Artık Git!

Merhaba! Bugün son zamanlarda adını sıkça duyduğumuz, hatta belki de “yeni nesil IaC” olarak nitelendirebileceğimiz bir konuyu konuşacağız: GitOps.

“Infrastructure as Code” (IaC) zaten hayatımızdaydı, değil mi? `CloudFormation`, `Terraform`, `Ansible` gibi araçlarla altyapımızı kod olarak tanımlıyor, versiyonluyor ve otomatikleştiriyorduk. O hâlde GitOps neyi farklı yapıyor, neden şimdi herkes ondan söz ediyor? GitOps’ta Git yalnızca uygulama kodumuzun değil, tüm altyapımızın “tek doğruluk kaynağı” (single source of truth) oluyor. Altyapı yönetimini yazılım geliştirme pratiklerinin en iyi yönleriyle birleştirerek daha güvenilir, daha şeffaf ve daha hızlı bir yol sunuyor. Kısacası altyapınızın orkestra şefi artık Git.

GitOps nedir? Orkestrayı kim yönetiyor?

GitOps’u anlamanın en kolay yolu bir orkestra metaforu. Orkestranın her üyesi (sunucular, veritabanları, ağ bileşenleri, Kubernetes Pod’ları) kendi enstrümanını çalıyor. Bu kalabalığı yöneten şef ise GitOps’ta Git deponuz (Git repository).

GitOps’un temel felsefesi üç sütuna dayanır:

  1. Deklaratif tanımlama (Declarative Configuration): Altyapınızın mevcut durumunu değil, olması gereken durumunu tanımlarsınız. “Şu sunucuyu kur” demek yerine “şöyle bir sunucu olsun” dersiniz. Bu tanımlar `YAML` veya `JSON` gibi deklaratif dillerle Git deponuzda durur. Depo, orkestranın çalacağı notaların yazılı olduğu partisyon gibidir.
  2. Versiyonlama ve değişiklik takibi (Versioned and Tracked Changes): Altyapınızdaki her değişiklik, uygulama kodunuzdaki gibi Git üzerinde bir `commit` olarak kaydedilir. İstediğiniz an altyapınızın geçmişteki bir durumuna geri dönebilir (rollback), kimin ne zaman hangi değişikliği yaptığını kolayca görebilirsiniz. Partisyonun her revizyonu kayıtlıdır: Önceki versiyonlara bakabilir, hatalı bir notayı düzeltebilirsiniz.
  3. Otomatikleştirilmiş senkronizasyon (Automated Synchronization): Git deponuzdaki tanımlar ile canlı altyapınız arasındaki senkronizasyon sürekli ve otomatik sağlanır. Git’teki partisyon değişince orkestra (altyapı) yeni notaları çalmaya başlar. Bu işi genellikle bir “operatör” ya da “agent” üstlenir. Operatör Git deponuzu sürekli izler, bir değişiklik olduğunda canlı altyapıyı Git’teki duruma getirmek için gereken aksiyonları alır. İnsan hatası riski minimuma iner, dağıtım süreçleri hızlanır.

GitOps’ta altyapınızdaki tüm değişiklikler Git deponuza gönderilen bir `commit` ve `pull request` ile yapılır. Canlı ortama doğrudan müdahale etmek yerine Git üzerinden dolaylı ve kontrollü ilerlersiniz. Bu hem güvenliği artırır hem de denetlenebilirliği maksimize eder.

Kubernetes ve GitOps neden iyi bir ikili?

Kubernetes doğası gereği deklaratif bir sistemdir. `Deployment`, `Service`, `Pod` gibi kaynakları `YAML` dosyalarıyla tanımlar, Kubernetes’e “benim altyapım böyle olsun” dersiniz. Kubernetes de bu tanıma ulaşmak için elinden geleni yapar. Bu deklaratif yapı GitOps ile Kubernetes’i birbirine çok iyi oturtuyor.

Geleneksel Kubernetes yönetiminde geliştiriciler veya operasyon ekipleri genellikle `kubectl apply -f my-app.yaml` gibi komutlarla doğrudan cluster’a müdahale eder. Küçük projelerde sorun çıkarmasa da büyük ve dinamik ortamlarda ciddi problemlere yol açabilir:

  • Drift (sapma): Canlı cluster’daki durum ile `YAML` dosyalarınızdaki tanımlar arasında zamanla farklar oluşabilir. Biri cluster’da elle bir değişiklik yapar ama bu değişiklik Git’e yansımaz. Ortaya “Benim makinemde çalışıyordu!” sendromunun altyapı versiyonu çıkar.
  • Denetlenebilirlik eksikliği: Kimin ne zaman hangi değişikliği yaptığını takip etmek zorlaşır. Güvenlik ve uyumluluk açısından büyük bir risktir.
  • Manuel hatalar: İnsan faktörü, özellikle stresli anlarda, yanlış komutların çalıştırılmasına ve kesintilere neden olabilir.

GitOps bu sorunların hepsine zarif bir çözüm sunar. Git deponuz, Kubernetes cluster’ınızın tek ve nihai doğruluk kaynağıdır. Cluster’da bir değişiklik mi yapmak istiyorsunuz? `kubectl` yerine Git deponuzdaki ilgili `YAML` dosyasını günceller, bir `commit` yapar ve bir `pull request` açarsınız. Bu `pull request` incelenir, onaylanır ve `merge` edilir. GitOps operatörü değişikliği algılayıp Kubernetes cluster’ınızı otomatik olarak yeni duruma getirir.

Böylece:

  • Drift ortadan kalkar: Cluster her zaman Git’teki durumu yansıtır.
  • Tam denetlenebilirlik sağlanır: Her değişiklik Git geçmişinde kayıtlıdır.
  • Manuel hatalar azalır: Dağıtım süreçleri otomatikleşir ve insan müdahalesi minimuma iner.
  • Geri alma (Rollback) kolaylaşır: Hatalı bir dağıtımda Git geçmişindeki önceki bir `commit`’e dönmek yeter.

Kubernetes’in deklaratif API’si ile Git’in versiyon kontrol yetenekleri birleşince altyapı yönetimi, uygulama geliştirme kadar çevik, güvenilir ve tekrarlanabilir hale gelir.

Popüler GitOps araçları

GitOps felsefesini hayata geçirmek için birçok araç var. En bilinen ikisine bakalım.

Argo CD

`Argo CD`, Kubernetes için deklaratif, `GitOps` tabanlı bir sürekli dağıtım (Continuous Delivery) aracıdır. En belirgin özelliği “pull” tabanlı çalışmasıdır: `Argo CD` cluster’ınızda bir `agent` olarak çalışır ve Git deponuzu sürekli izler. Git’teki tanımlarla canlı cluster arasında bir fark (drift) tespit ettiğinde cluster’ı otomatik olarak Git’teki duruma senkronize eder.

`Argo CD`’nin öne çıkan özellikleri:

  • Pull-based dağıtım: Cluster’ın içinden Git deponuzu izler ve değişiklikleri çeker. Cluster’a dışarıdan erişim izni vermeniz gerekmediği için güvenlik açısından avantajlıdır.
  • Zengin web arayüzü: `Argo CD`, dağıtılan uygulamalarınızın durumunu, senkronizasyon sağlığını ve geçmişini görsel olarak takip edebileceğiniz kullanıcı dostu bir web arayüzüne sahiptir. Büyük ve karmaşık ortamlarda sorun giderme ve izleme için paha biçilmezdir.
  • Otomatik senkronizasyon ve sağlık kontrolü: Git’teki değişiklikleri otomatik olarak algılar ve cluster’a uygular. Dağıtılan kaynakların sağlığını da sürekli kontrol eder.
  • Rollback ve roll-forward: Hatalı dağıtımları kolayca geri alabilir ya da yeni bir `commit` ile ileriye doğru düzeltebilirsiniz.
  • Çoklu cluster desteği: Birden fazla Kubernetes cluster’ını tek bir `Argo CD` örneği üzerinden yönetebilirsiniz.

Flux CD

`Flux CD`, `Cloud Native Computing Foundation` (CNCF) bünyesinde geliştirilen bir başka popüler GitOps aracıdır. `Argo CD` gibi `Flux` da “pull” tabanlı çalışır ve Git deponuzu tek doğruluk kaynağı kabul eder. Özellikle `kustomize` ve `Helm` gibi Kubernetes paketleme araçlarıyla güçlü entegrasyonuyla bilinir.

`Flux CD`’nin temel özellikleri:

  • Git merkezli yaklaşım: `Flux`, Git deponuzu merkeze alır ve tüm dağıtım süreçlerini buradan yönetir.
  • CNCF projesi: `CNCF` çatısı altında olması, projenin uzun vadeli sürdürülebilirliği ve topluluk desteği açısından güven verir.
  • Kustomize ve Helm entegrasyonu: `kustomize` ile Kubernetes manifestlerini özelleştirebilir, `Helm` ile uygulamaları kolayca paketleyip dağıtabilirsiniz. `Flux` bu araçlarla sorunsuz çalışır.
  • Operatör modeli: Kubernetes cluster’ında çalışan bir dizi operatörden oluşur. Bu operatörler Git deponuzu izler ve cluster’daki kaynakları senkronize eder.
  • Genişletilebilirlik: `notification-controller`, `image-reflector-controller` gibi çeşitli bileşenlerle genişletilebilir.
  • Sürekli senkronizasyon: Git deponuzdaki değişiklikleri algılar ve cluster’ı otomatik olarak günceller.

İki araç da GitOps felsefesini başarıyla uygular, ama arayüz, özellik seti ve topluluk yaklaşımı bakımından farklıdırlar. Seçiminiz projenizin ihtiyaçlarına ve ekibinizin tercihlerine göre değişebilir.

İpuçları ve en iyi pratikler (Tips & Tricks)

GitOps yolculuğunuzda işinize yarayacak birkaç ipucu ve en iyi pratik:

Repo yapılandırması: uygulama kodu ve altyapı/konfigürasyon repolarını ayırın

GitOps’a başlarken sık yapılan hatalardan biri, uygulama kodu ile altyapı/konfigürasyon tanımlarını aynı Git deposunda tutmaktır. Başta kolay görünür ama zamanla karmaşıklığı artırır ve sorumlulukları bulanıklaştırır. En iyi pratik, bu iki alanı ayrı depolarda yönetmektir:

  • Uygulama kodu reposu: Yalnızca uygulamanızın kaynak kodunu, testlerini ve `Dockerfile` gibi uygulamaya özel dosyaları içerir.
  • Altyapı/konfigürasyon reposu (Config Repo): Kubernetes manifestlerini (`Deployment`, `Service`, `Ingress` vb.), `Helm` chart’larını, `kustomize` dosyalarını ve diğer altyapı tanımlarını içerir.

Bu ayrım birçok fayda sağlar:

  • Sorumluluk ayrımı: Geliştiriciler uygulama koduna, operasyon ekipleri altyapı konfigürasyonlarına odaklanabilir.
  • Daha hızlı dağıtım: Uygulama kodu değişince yalnızca uygulamanın `CI/CD` pipeline’ı tetiklenir. Altyapı değişince yalnızca GitOps pipeline’ı çalışır.
  • Gelişmiş güvenlik: Uygulama koduna erişimi olan herkesin altyapı konfigürasyonlarını değiştirmesini engeller.
  • Daha temiz Git geçmişi: Her deponun kendi alanına özel, anlamlı bir `commit` geçmişi olur.

Gizli bilgilerin (secrets) yönetimi: Git’te şifreli saklayın

GitOps’un temel prensibi her şeyin Git’te olmasıdır. Ancak bu, veritabanı şifreleri ve API anahtarları gibi hassas bilgileri (secrets) açık metin olarak Git’e koymanız gerektiği anlamına gelmez. Bu büyük bir güvenlik açığıdır. `Secrets` yönetimi, GitOps’ta en dikkatli olunması gereken alanlardan biridir.

Çözüm, `secrets`’ları Git’te şifreli saklamak ve yalnızca Kubernetes cluster’ında deşifre edilmesini sağlamaktır. Bunun için kullanabileceğiniz popüler araçlar şunlar:

  • Sealed Secrets: `Bitnami` tarafından geliştirilen bu araçla `secrets`’larınızı Kubernetes cluster’ınızın anahtarlarıyla şifrelersiniz. Şifrelenmiş `secret`’ı Git’e `commit` edersiniz, `Sealed Secrets` operatörü de cluster’da bu `secret`’ı deşifre ederek normal bir Kubernetes `Secret` objesine dönüştürür. Böylece `secret`’lar Git’te güvenle saklanır, yalnızca yetkili cluster’lar tarafından kullanılabilir.
  • HashiCorp Vault: Daha gelişmiş ve merkezi bir `secret` yönetimi çözümü arıyorsanız `Vault` iyi bir seçenektir. `Vault`, `secrets`’ları güvenle depolar ve Kubernetes cluster’ınızdaki uygulamaların bunlara erişmesini sağlar. Entegrasyon genellikle `Vault Agent Injector` veya `External Secrets Operator` gibi araçlarla yapılır.

`secrets`’ları asla açık metin olarak Git’e koymayın.

Pull request (PR) kültürü: her değişiklik bir incelemeden geçsin

GitOps yalnızca araçlardan ibaret değildir, aynı zamanda bir kültürdür. Bu kültürün merkezinde Pull Request (PR) mekanizması yer alır. Altyapınızda yapacağınız her değişiklik, küçük de olsa büyük de olsa, bir `pull request` üzerinden yapılmalıdır.

`PR` kültürünün size sağladığı faydalar:

  • Kod incelemesi (Code Review): Her değişikliği ekip üyeleri inceler. Bu, hataların erken yakalanmasını, en iyi pratiklerin uygulanmasını ve bilgi paylaşımını teşvik eder.
  • Denetlenebilirlik ve onay süreci: `PR`’lar, değişikliklerin ne zaman, kim tarafından ve hangi amaçla yapıldığını gösteren resmi bir kayıt tutar. Ayrıca değişikliklerin canlı ortama uygulanmadan önce onaylanmasını gerektiren bir süreç oluşturur. Uyumluluk gereksinimleri olan sektörler için bu hayati öneme sahiptir.
  • İşbirliği ve bilgi paylaşımı: `PR`’lar, ekip üyelerinin birbirlerinin çalışmalarından haberdar olmasını ve altyapı hakkında ortak bir anlayış geliştirmesini sağlar.
  • Otomatik testler: `PR`’lar, otomatik testlerin (linting, statik analiz, entegrasyon testleri) tetiklenmesi için çok uygun bir noktadır. Bu testler değişikliklerin kalitesini ve güvenliğini artırır.

Her `commit` bir `PR`’a, her `PR` bir incelemeye, her `merge` bir otomatik dağıtıma dönüşmelidir. GitOps’un gücü bu döngüden gelir.

Sonuç

GitOps, altyapı yönetimini yazılım geliştirmenin en iyi pratikleriyle buluşturan, devrim niteliğinde bir yaklaşımdır. Altyapınız artık uygulama kodunuz gibi versiyonlanabilir, denetlenebilir ve otomatikleştirilebilir bir varlık. Git deponuz altyapınızın tek doğruluk kaynağı olurken `Argo CD` ve `Flux CD` gibi araçlar bu vizyonu gerçeğe dönüştürüyor.

GitOps bir araç setinden fazlası, bir kültür. Deklaratif tanımlar, versiyon kontrolü ve sürekli otomasyon prensiplerini benimseyen ekipler daha güvenilir, daha şeffaf ve daha verimli çalışabilir. Altyapınızdaki “drift” kabusuna son verin, manuel hataları minimuma indirin, geliştirici verimliliğini artırın.

Henüz GitOps’a başlamadıysanız şimdi tam zamanı. Kubernetes ile uyumu sayesinde, bulut yerel uygulamalarınızı yönetme şeklinizi kökten değiştirecek bu felsefeyi denemekten çekinmeyin. Altyapınızın orkestra şefliğini Git’e devredin.

Bir sonraki yazıda görüşmek üzere, kodunuz bol, sunucularınız stabil olsun.