← Back to list

CI/CD Süreçlerinde Istio ve Calico Politikalarını GitOps ile Yönetmek

GitOps Yaklaşımıyla Güvenli Mikroservis Yönetimi

Pinarrozkanli in SabancıDx · 2025-05-09 08:32 · 301 claps · 7.7 min read
#devsecops #gitops #kubernetes #istio
Open on Medium ↗
Wiki topics: ☁️ · DevOps & Cloud

CI/CD Süreçlerinde Istio ve Calico Politikalarını GitOps ile Yönetmek

GitOps Yaklaşımıyla Güvenli Mikroservis Yönetimi

image from GoOps

image from GoOps

Bir önceki yazımda, OpenShift ortamında Istio Service Mesh ve Calico’yu entegre ederek hem ağ hem de servis seviyesinde güvenliği nasıl sağladığımızı paylaşmıştım.

Bu yazıda artık bu yapının bir adım ötesine geçiyoruz. Konumuz: güvenlik politikalarının CI/CD süreçlerine entegre edilmesi. Yani sadece uygulamaları değil, ağ ve servis erişim politikalarını da kod gibi yönetmek.

Modern Kubernetes altyapılarında multi-tenant yapıların yaygınlaşması, ağ güvenliği ve erişim kontrolü konularını daha karmaşık hale getirmiştir. Bu karmaşıklığın en belirgin olduğu alanlardan biri de CI/CD süreçlerinde ağ politikalarının ve güvenlik kurallarının otomatik ve kontrollü bir şekilde yönetilmesidir. Günümüzde firmalar, service mesh (Istio) ve network policy (Calico) çözümlerini kullanarak mikroservisler arasında detaylı trafik kontrolü sağlamakta; ancak bu politikaların yönetimi çoğu zaman manuel, riskli ve sürdürülemez bir hale gelmektedir.

Bu noktada devreye GitOps yaklaşımı giriyor. GitOps, uygulama ve altyapı konfigürasyonlarının kod olarak tanımlanmasını ve bu konfigürasyonların Git üzerinden yönetilmesini sağlayarak, hem görünürlük hem de denetlenebilirlik sağlar. Fakat uygulamada sadece konfigürasyonların Git’e alınması yeterli değildir; bu politikaların farklı tenant yapıları için test edilebilir, onay mekanizmalarına tabi ve otomatik uygulanabilir olması gerekir.

Uygulama kodlarını nasıl CI/CD ile yönetiyorsak, artık ağ ve erişim politikalarını da kod gibi versiyonlamamız, test etmemiz ve otomatik deploy etmemiz gerekiyor. Bu sadece bir verimlilik konusu değil; güvenlik, regülasyon uyumu ve sistem kararlılığı için kritik. Bu yaklaşım neden gerekli, hangi sorunlara çözüm oluyor, birlikte inceleyelim.

Bu yazıda, sahada karşılaştığımız gerçek problemler üzerinden hareketle;

  • Istio ve Calico politikalarının GitOps ile nasıl yönetileceğini,
  • Ortak bir policy deployment yapısının nasıl kurulacağını,
  • Tenant bazlı politika izolasyonunun nasıl sağlanacağını,
  • Ve son olarak, OPA Gatekeeper ile policy test, validasyon ve uyumluluk süreçlerinin nasıl otomatize edileceğini detaylı şekilde ele alacağız.

Neden Böyle Bir Yaklaşıma İhtiyaç Duyduk?

Mikroservis mimarileri işimizi hızlandırdı, evet. Ama beraberinde yönetilmesi ve güvenliği zorlaşan bir ortam da getirdi.

Sahada karşılaşılan güvenlik sorunları, çoğu zaman sistemsel zafiyetlerden değil, süreç eksikliklerinden kaynaklanıyor. Örneğin, “Policy Hell” olarak adlandırabileceğimiz bir senaryoda, test ortamında geçici olarak dış trafiğe açılan bir servis, farkında olunmadan production ortamına da aynı şekilde kopyalanabiliyor. Güvenlik tarayıcıları bu açığı tespit ettiğinde ise genellikle iş işten geçmiş oluyor. Bu tür durumların temel nedeni, politikaların versiyonlanmaması ve ortama özel ayrıştırılmamasıdır. Benzer şekilde, “Gölge Erişim” durumunda erişimle ilgili bir sorun yaşandığında, sistemde kimin, ne zaman, hangi politikayı değiştirdiği bilinmeyebiliyor. Audit log’ların yetersiz olması, Git geçmişinin tutulmaması ve açıklayıcı bir dokümantasyonun eksikliği, süreci tamamen kaotik bir hale getirebiliyor. Bu durum, KVKK, ISO 27001 gibi regülasyonlar karşısında ciddi riskler doğuruyor. Bir diğer problem ise “Çakışan Politikalar” vakasında karşımıza çıkıyor. Aynı namespace üzerinde çalışan farklı geliştiriciler, birbirinden habersiz şekilde çelişen politikalar tanımladığında — örneğin biri servisi erişime kapatırken, diğeri açmaya çalıştığında — sistemde çatışmalar meydana geliyor ve sonuç olarak hiçbir şey düzgün çalışmıyor. Bu tür karmaşalar, merkezi ve senkronize bir policy yönetiminin ne kadar kritik olduğunu ortaya koyuyor. Son olarak, “Sürümsüz Güvenlik” vakasında, yapılan bir politika değişikliği sistemi bozduğunda, eski haline dönmek mümkün olmayabiliyor. Çünkü önceki policy’nin yedeği tutulmamışsa, neyin nerede olduğu bilinmiyorsa ve geçmiş versiyonlara erişilemiyorsa, sistemin eski haline getirilmesi imkansız hale geliyor. Kod gibi versiyonlanmayan her şey gibi, güvenlik politikaları da bu durumda sürdürülebilirliğini kaybediyor. Tüm bu örnekler, güvenliğin yalnızca teknik değil, aynı zamanda operasyonel bir disiplin olduğunu da açıkça gösteriyor.

Gelin, birkaç gerçek örnekle bu ihtiyacı daha somut hale getirelim:

  • Bir geliştirici, test ortamında geçici olarak bir servisi tüm trafiğe açtı. Sonra aynı policy, farkında olmadan production’a taşındı.
  • Yeni bir mikroservis deploy edildi, ancak servis erişim politikaları manuel yazıldığı için, sadece gece saatlerinde fark edilen bir servis kesintisi yaşandı.
  • Güvenlik ekibi, production ortamında hangi politikaların ne zaman değiştiğini denetleyemediği için regülasyon denetiminde zorlandı.
  • İki farklı geliştiricinin aynı namespace’e yaptığı ayrı policy değişiklikleri birbirini ezdi ve servisler birbirine erişemez hale geldi.

Bu örnekler, size de tanıdık geliyor olabilir. Özellikle yüksek regülasyon ve çok ekipli organizasyonlar için bu tarz problemler sadece teknik değil, operasyonel ve yönetimsel riskler de taşıyor.

İşte bu yüzden bu sorulara kalıcı bir yanıt aradık:

  • Politikaları sürümleyip, test edip, güvenle deploy edemez miyiz?
  • CI/CD süreçlerine dahil ederek, her adımı şeffaf ve izlenebilir hale getiremez miyiz?
  • Ortama özel, versiyonlanabilir güvenlik kontrolleriyle hataları en aza indirmek mümkün değil mi?

Cevabımız: Elbette mümkün. Üstelik bu artık bir lüks değil, modern mikroservis mimarisinde bir gereklilik.

Bu yazıda, bu ihtiyaca nasıl bir çözüm getirdiğimizi adım adım paylaşıyorum. Kullanacağımız teknolojiler arasında GitOps (ArgoCD), Conftest, OPA Rego, Tekton veya GitHub Actions ve yapılandırma yönetiminde Helm/Kustomize yer alıyor.

Amacımız:

· Politika değişikliklerini tıpkı kod gibi versiyonlamak

· Her değişikliği test ederek hataları önceden yakalamak

· Güvenli, kontrollü ve otomatize bir dağıtım süreci kurmak

Hadi şimdi bu yapının teknik bileşenlerine ve süreçlerine birlikte bakalım.

Adım Adım Süreç: Politika Otomasyonu Nasıl Kurulur?

1. Politikaları Git ile Yönet

GitOps ile Çözüm: Tek Kaynak, Çok Tenant

Bu problemi çözmek için GitOps yaklaşımıyla merkezi bir policy yönetim modeli uygulanabilir:

1.1 Policy Şablonlarının Kodu

Ortak kurallar, base klasörü altında şablon (template) olarak tanımlanır. Bu şablonlar kustomize veya helm gibi araçlarla parametrik hale getirilir:

# base/network-policy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny
  namespace: {{ .Values.namespace }}
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  - Egress

1.2. Tenant’a Özel Overlays

Her tenant için ayrı bir klasör (overlays/tenant-a, overlays/tenant-b) oluşturulur ve namespace gibi özel parametreler burada belirtilir.

1.3. ArgoCD veya Flux ile Dağıtım

Bu Git reposu ArgoCD gibi bir GitOps aracı ile izlenir. Her tenant’ın overlay klasörü ayrı bir ArgoCD uygulaması olarak tanımlanır. Böylece her tenant’a aynı kural şablonları, farklı namespace’lere otomatik ve tutarlı şekilde uygulanır.

1.4. Versiyon Kontrolü ve Geri Alım

Her değişiklik Git üzerinden takip edilir. Gerekirse geçmişe dönülebilir, hangi tenant’ta hangi policy’lerin geçerli olduğu izlenebilir.

Bu çözüm sayesinde:

  • Ortak kurallar merkezi ve tekrar kullanılabilir hale gelir,
  • Hatalı konfigürasyon riski azalır,
  • Değişiklikler otomatik yayılır ve denetlenebilir olur.

Tüm politikalarımız artık Git’te.

repo-root/
├── policies/
│   ├── istio/
│   │   └── authz-orders.yaml
│   └── calico/
│       └── netpol-orders.yaml

Bu yapı sayesinde kim, ne zaman, hangi policy’yi değiştirmiş görebiliyor, hatta onay mekanizmaları kurabiliyoruz.

2. CI Aşamasında Politika Doğrulama

Kod yazarken test yapıyoruz, değil mi? Aynı şeyi güvenlik politikaları için de yapmalıyız.

conftest ve OPA Rego ile yazdığımız basit kurallar sayesinde hatalı policy’lerin cluster’a ulaşmasını engelleyebiliriz.

Kurumsal Kubernetes ortamlarında güvenlik politikalarının (örneğin NetworkPolicy, AuthorizationPolicy, PeerAuthentication) doğrudan prod ortamlara uygulanması birçok riski beraberinde getirir. En sık karşılaşılan problemler:

  • Yanlış yazılmış bir NetworkPolicy tüm trafiği engeller, uygulamalar erişilemez hale gelir.
  • Istio AuthorizationPolicy ile uygulamaya dışarıdan erişim tamamen kesilir.
  • Geri dönüş için manuel müdahale gerekir ve bu da zaman kaybı ve kesinti anlamına gelir.

Bu problemler, politikaların önce test edilmeden prod ortamına alınmasından kaynaklanır. Özellikle çok sayıda tenant’ın bulunduğu ortamlarda bir hatalı policy tüm müşterileri etkileyebilir.

Örnek Vaka:

Bir müşterinin namespace’ine aşağıdaki AuthorizationPolicy tanımı uygulanıyor:

apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: deny-all
  namespace: tenant-x
spec:
  {}

Bu policy hiçbir kaynak tanımı içermediği için Istio default olarak tüm trafiği engeller. Hedeflenen erişim kısıtlaması yerine tüm servisler dış erişime kapanır. Eğer bu tanım doğrudan prod ortamına uygulanırsa, müşteri sistemleri erişilemez hale gelir.

Bunun yerine AuthorizationPolicy nesnesinde güvenlik açığına yol açabilecek bir yapı olup olmadığını kontrol eden bir policy validation (doğrulama) kuralı uygulayabiliriz.

rego

deny[msg] {
  input.kind == "AuthorizationPolicy"
  input.spec.action == "ALLOW"
  not input.spec.rules[_].from
  msg := "AuthorizationPolicy tanımında kaynak belirtilmemiş"
}

Özellikle Kubernetes ortamlarında, OPA Gatekeeper veya Conftest gibi araçlarla policy kontrolleri yapılırken, bu kod yapısı, yanlış yapılandırılmış ve herkese açık hale gelebilecek AuthorizationPolicy nesnelerinin küme içine alınmasını önler.

Not: Bu Rego kuralı, ALLOW tipindeki AuthorizationPolicy nesnelerinde from belirtilmemişse reddedilmesini ister. Çünkü bu durum, herhangi bir kaynak (source) kısıtlaması olmadan erişim izni verilmesi anlamına gelir.

Bu test, pipeline’ın bir aşamasında otomatik olarak çalıştırılır ve başarısızsa deployment durdurulur.

3. ArgoCD ile Otomatik Uygulama

CI aşamasını geçen her değişiklik, Git’e commitlendiğinde ArgoCD bunu otomatik olarak algılar ve cluster’a uygular.

syncPolicy:
  automated:
    prune: true
    selfHeal: true

Bu sayede operasyon ekibi elle müdahale etmeden tüm güvenlik politikaları doğru namespace’e uygulanmış olur.

4. Ortama Özel Şablonlama

Geliştirme, test ve prod ortamları arasında farklılıklar olabilir. Örneğin sadece prod ortamında bazı servislerin dış dünyaya açılması gerekebilir.

Bunu çözmek için Helm veya Kustomize gibi araçlarla şablonlama yapıyoruz.

yaml

# values.yaml
namespace: prod
app: orders
# templates/authz.yaml
spec:
  rules:
    - from:
        - source:
            namespaces: ["{{ .Values.namespace }}"]

Artık tek bir tanım ile tüm ortamlarda aynı yapıyı sürdürebilir hale geldik.

Gerçek Hayattan Bir Senaryo

Haydi bu yapıyı bir örnekle somutlaştıralım.

orders-service adlı bir mikroservisimiz var. Bu servise sadece frontend namespace’indeki diğer servislerin erişmesini istiyoruz. Ve trafiğin mTLS ile şifrelenmesini şart koşuyoruz.

Bu durumda:

  • Geliştirici, policy dosyasını oluşturup Git’e push eder.
  • CI pipeline dosyayı test eder, onay verirse
  • ArgoCD otomatik olarak bu policy’yi cluster’a uygular.
  • Calico sadece frontend’den gelen trafiğe izin verir.
  • Istio ise servis içi trafiği mTLS ile şifreler ve kimlik doğrulaması yapar.

Kodu yazan ekip, ağ güvenliğini de sürüm kontrolüne dahil etmiş olur. Her şey belgelenmiş, otomatize edilmiş ve geri alınabilir.

Güvenlik Katmanlarını Artırmak İçin Neler Yapabiliriz?

  • CODEOWNERS dosyası ile sadece belirli kişilerin belirli dosyaları değiştirmesine izin verebiliriz.
  • Pull request’ler için Conftest testlerinin geçmesi zorunlu hale getirilebilir.
  • ArgoCD, yapılan tüm değişikliklerin geçmişini tuttuğu için geri dönüş mümkündür.
  • Bildirim mekanizmaları ile (örneğin Slack entegrasyonu) yapılan değişiklikler ekiplerle paylaşılabilir.

Buradan Sonra Ne Olmalı?

Bu yapıyı kurduktan sonra fark edileceği üzere, her namespace’e özel policy yönetmek bile yeterli değil. Çünkü artık aynı cluster üzerinde farklı tenant’lara (müşteri, ekip, uygulama grubu) hizmet veren yapılarda, daha katmanlı bir kontrol modeline ihtiyaç var.

Tenant Bazlı Policy Yönetimine Geçiş

Tenant’lar arasında hem ağ hem servis seviyesinde izolasyon kritik hale geliyor. Bu durumda:

  • Her tenant’ın kendi policy setine,
  • Bu policy’lerin yukarıdan aşağıya kontrol edilmesine (OPA Gatekeeper gibi),
  • Ve tanımlanan kuralların sadece deploy öncesi değil, çalışma zamanında da denetlenmesine ihtiyaç var.

Bu noktada devreye OPA Gatekeeper giriyor.

OPA Gatekeeper ile Kuralları Enforcement Etmek

Gatekeeper, Kubernetes’e entegre çalışan bir politika enforcement mekanizması. Bu yapı sayesinde:

· Tenant’lar sadece belirlenen label ve namespace altında kaynak tanımlayabilir

· Belirli policy’ler dışında hiçbir erişim şekli kabul edilmez

· Yeni policy eklemek bile, Gatekeeper kurallarına uymak zorundadır

· Politikalar YAML değil, kurallarla yönetildiğinden sürprizlerle karşılaşılmaz

Örnek bir Gatekeeper constraint’i şöyle görünür:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sRequiredLabels
metadata:
  name: tenant-namespace-labels
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Namespace"]
  parameters:
    labels: ["tenant", "environment"]

Bu örnekte her namespace tanımı, tenant ve environment label’larını taşımak zorundadır. Aksi halde Kubernetes objesi reddedilir.

Buraya Kadar Güzel: Peki ya Multi-Tenant Ortamlar?

Şimdi geldik bir diğer kritik noktaya: Sistemde farklı ekiplerin, farklı müşterilerin, yani farklı tenant’ların olduğunu düşünün.

Her birinin:

  • Kendi namespace’i var,
  • Farklı servis erişim ihtiyaçları var,
  • Güvenlik seviyeleri farklı.

Bu ortamda genel geçer bir policy tanımı artık yeterli değil. Daha gelişmiş, tenant bazlı bir kontrol yapısına ihtiyacımız var.

Tenant Bazlı Politika Yönetimi ve OPA Gatekeeper

Burada devreye OPA Gatekeeper giriyor. Gatekeeper sayesinde:

  • Her tenant için ayrı constraint set’leri oluşturabiliyoruz.
  • Örneğin, “finans tenant’ı sadece internal network ile konuşabilir” gibi kurallar tanımlayabiliyoruz.
  • Bir geliştirici bu kurala aykırı bir şey deploy etmek isterse, admission controller bunu engelliyor.

Örnek Constraint (Gatekeeper için):

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sRequiredLabels
metadata:
  name: tenant-namespace-labels
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Namespace"]
  parameters:
    labels: ["tenant", "environment"]

Bu örnekle, her namespace’in tenant ve environment etiketi taşımasını zorunlu hale getiriyoruz.

Policy Rehberi Olarak Repo Kullanımı

GitOps ile bu constraint’ler ve policy dosyaları versiyon kontrolü altında tutulur. Her tenant için özel dizin yapıları oluşturularak politika yönetimi sadeleştirilir:

policies/
  tenant-x/
    istio/
    calico/
    gatekeeper/
  tenant-y/
    ...

CI/CD ile Otomatik Validasyon

Her pull request şu aşamalardan geçer:

  • OPA test runner ile Rego kuralları test edilir.
  • kubectl gatekeeper validate ile policy’lerin uygunluğu sınanır.
  • kustomize build ile tüm yapı doğrulanır.
  • Uygunsa otomatik olarak tenant ortamına deploy edilir.

Sonuç: Güvenlik, Otomasyon ve Denetlenebilirlik Aynı Anda Mümkün

Bu yapının sonunda geldiğimiz noktada şunu net şekilde gördük:

  • Güvenlik politikaları yalnızca bir güvenlik ekip işi değil ve kod gibi yönetilebilir hale geldi
  • Değişiklikler daha şeffaf, izlenebilir ve denetlenebilir oldu
  • Farklı ortamlarda tutarlı politikalar sağlandı
  • Hatalı policy’ler CI seviyesinde yakalanabilir hale geldi
  • Tenant bazlı özel güvenlik kuralları tanımlanabildi
  • Mikroservis geliştiren her ekibin doğrudan sorumluluğunda olan,
  • Süreçlere entegre bir parça haline gelmeli.

Hem hataları önceden yakalayabildik, hem ortamlar arasında tutarlılık sağladık, hem de denetlenebilirliği üst seviyeye taşıdık.

Eğer bu yazı sizin için faydalı olduysa, takipte kalın. Yorumlarınızı, sorularınızı veya yaşadığınız benzer problemleri benimle paylaşmanız beni çok mutlu eder!


메타데이터
post_id
772bb0bd30de
slug
ci-cd-süreçlerinde-istio-ve-calico-politikalarını-gitops-ile-yönetmek-772bb0bd30de
url
https://medium.com/sabancidx/ci-cd-s%C3%BCre%C3%A7lerinde-istio-ve-calico-politikalar%C4%B1n%C4%B1-gitops-ile-y%C3%B6netmek-772bb0bd30de
canonical_url
https://medium.com/sabancidx/ci-cd-s%C3%BCre%C3%A7lerinde-istio-ve-calico-politikalar%C4%B1n%C4%B1-gitops-ile-y%C3%B6netmek-772bb0bd30de
author_url
https://medium.com/@pinarrozkanli
status
ok
fetched_at
2026-06-10 18:44:10