İçeriğe geç
10 dk okuma DevOps

Calico Kurulumu: Kubernetes Network Policy

Calico Nedir ve Neden Kullanmalısınız?

Container Networking Interface (CNI) dünyasında Calico, Kubernetes ağ güvenliği ve network policy konusunda en güçlü çözümlerden biri olarak öne çıkan bir açık kaynak projesidir. Tigera tarafından geliştirilen Calico, sadece ağ bağlantısı sağlamakla kalmaz, aynı zamanda fine-grained network policy'ler aracılığıyla mikro segmentasyon ve zero-trust güvenlik modeli uygulamanıza olanak tanır.

Calico'nun temel farkı, Linux kernel içinde eBPF (Extended Berkeley Packet Filter) kullanarak yüksek performanslı packet filtering sağlamasıdır. Geleneksel iptables tabanlı çözümlerin aksine, Calico packet'leri kernel seviyesinde işleyerek çok daha düşük gecikme süreleri ve yüksek throughput elde eder. Bu özellik, özellikle büyük ölçekli Kubernetes cluster'larında kritik önem taşır.

Bu makalede Calico'nun temel kavramlarını, kurulum sürecini, network policy yapılandırmasını ve production ortamları için en iyi uygulamaları detaylı olarak inceleyeceğiz.

Calico'nun Temel Özellikleri

Calico, bir CNI plugin'i olarak Kubernetes pod'ları arasında ağ bağlantısı sağlamanın yanı sıra, zengin bir network policy engine sunar. Bu özellikler Calico'yu diğer CNI çözümlerinden ayrıştırır ve enterprise ortamları için ideal bir seçim haline getirir.

İlk olarak, Calico'nun label tabanlı policy yaklaşımını anlamak önemlidir. Geleneksel firewall kuralları IP adresleri üzerinden çalışırken, Calico Kubernetes label'larını kullanarak policy tanımlar. Bu yaklaşım, pod'ların dinamik olarak scale up ve scale down olduğu Kubernetes ortamlarında çok daha esnek ve yönetilebilir bir güvenlik modeli sunar. Bir pod'un IP adresi değişse bile, label'ları sabit kaldığı sürece policy kuralları geçerliliğini korur.

eBPF Performans Avantajı

Calico'nun eBPF tabanlı data plane'i, ağ trafiğini işlemek için Linux kernel içinde çalışan programlar kullanır. Bu yaklaşım, kullanıcı alanı (user space) ile kernel alanı (kernel space) arasında veri taşıma overhead'ini ortadan kaldırır. Sonuç olarak, geleneksel iptables tabanlı çözümlere kıyasla önemli ölçüde düşük CPU kullanımı ve daha tutarlı latency değerleri elde edilir.

eBPF'nin bir diğer avantajı, dinamik olarak yüklenebilen programlar aracılığıyla kernel davranışını değiştirebilmesidir. Bu sayede, yeni özellikler eklemek veya güvenlik yamaları uygulamak için kernel yeniden derlemeye gerek kalmaz. Calico, bu gücü kullanarak yeni güvenlik özelliklerini production ortamlarına hızlı bir şekilde dağıtabilir.

Calico Kurulumu

Calico'yu Kubernetes cluster'ınıza kurmak için birden fazla yöntem mevcuttur. En yaygın ve önerilen yöntem, manifest dosyaları kullanarak Kubernetes native kurulum yapmaktır. Bu yöntem, herhangi bir özel operatore ihtiyaç duymadan doğrudan kubectl komutlarıyla kurulumu gerçekleştirir.

Ön Gereksinimler

Kuruluma başlamadan önce, cluster'ınızın aşağıdaki gereksinimleri karşıladığından emin olun:

  • Kubernetes 1.20 veya üzeri
  • kubectl erişimi ve yetkili bir kubeconfig dosyası
  • Cluster'da çalışan node'ların en az 2 CPU çekirdeği ve 4GB RAM'e sahip olması
  • Node'ların birbirleriyle network iletişiminin açık olması

Cluster durumunu kontrol etmek için:

kubectl cluster-info
kubectl get nodes

Kubernetes Manifest ile Kurulum

Calico'yu manifest dosyaları kullanarak kurmak için aşağıdaki adımları izleyin. İlk olarak, Calico custom resource definitions (CRD) dosyalarını oluşturun:

kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.28.0/manifests/custom-resources.yaml

Bu komut, Calico'nun ihtiyaç duyduğu custom resource definition'ları cluster'a ekler. Ardından Tigera operator'ü kurun:

kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.28.0/manifests/tigera-operator.yaml

Operator'ün çalışıp çalışmadığını kontrol edin:

kubectl get pods -n tigera-operator

Tüm pod'ların Running durumuna geçmesini bekleyin. Bu işlem birkaç dakika sürebilir. Son olarak, Calico installation custom resource oluşturun:

kubectl create -f - 

Kurulum tamamlandığında, Calico pod'larının çalıştığını doğrulayın:

kubectl get pods -n calico-system

Helm ile Kurulum

Helm kullanarak kurulum, özellikle package manager deneyimi olan ekipler için daha kolay yönetim sağlar. İlk olarak Helm repo ekleyin:

helm repo add calico https://docs.tigera.io/calico/charts
helm repo update

Ardından Calico'yu kurun:

helm install calico calico/calico \
  --namespace calico-system \
  --create-namespace

Helm ile kurulum, upgrade ve rollback işlemlerini kolaylaştırır. Özellikle production ortamlarında bu yaklaşım önerilir.

Network Policy Temelleri

Calico'nun en güçlü özelliklerinden biri, Kubernetes NetworkPolicy API'sini genişleten zengin bir policy modeli sunmasıdır. Calico network policy'ler, sadece pod'lar arası trafiği değil, aynı zamanda host interface'leri arasındaki trafiği de kontrol edebilir.

Kubernetes NetworkPolicy ile Başlangıç

Kubernetes NetworkPolicy, Calico'nun sunduğu zengin özelliklerden bağımsız olarak kullanılabilir. Temel bir network policy oluşturmak için namespace ve pod selector'lar kullanılır. Öncelikle, bir namespace oluşturun ve nginx deployment yapın:

kubectl create ns policy-demo
kubectl create deployment nginx --image=nginx -n policy-demo
kubectl expose deployment nginx --port=80 -n policy-demo

Ardından, bu namespace'deki tüm pod'lar için default deny policy uygulayın:

kubectl apply -f - 

Bu policy, policy-demo namespace'indeki tüm pod'lara gelen ve giden trafiği varsayılan olarak engeller. Artık sadece açıkça izin verilen trafik akışına izin verilir.

Ingress Policy Oluşturma

Gelen trafik için izin kuralları tanımlamak için ingress kuralları ekleyin. Örneğin, bir frontend pod'unun backend pod'una erişmesine izin vermek için:

kubectl apply -f - 

Bu policy, sadece app=frontend label'lı pod'lardan app=backend label'lı pod'ların 8080 portuna TCP trafiğine izin verir.

Egress Policy Oluşturma

Giden trafik için de benzer şekilde kurallar tanımlanabilir. Bir pod'un sadece belirli harici servislere erişmesine izin vermek için:

kubectl apply -f - 

Bu örnek, client pod'unun sadece 10.0.0.0/8 CIDR bloğundaki 443 portuna ve DNS servislerine erişmesine izin verir.

Calico Özellikli Network Policy

Calico, Kubernetes NetworkPolicy'yi birçok yönden genişleten ek özellikler sunar. Bu özellikler, daha karmaşık güvenlik senaryolarını uygulamayı mümkün kılar ve enterprise ortamları için kritik avantajlar sağlar.

Global Network Policy

Calico'nun GlobalNetworkPolicy'si, namespace'ler arası ve hatta cluster dışı kaynaklara uygulanabilen policy'ler tanımlamanıza olanak tanır. Global policy'ler, namespaced olmayan kaynaklardır ve cluster genelinde geçerlidir:

kubectl apply -f - 

Bu policy, kube-system ve calico-system hariç tüm namespace'lerde default deny uygular. GlobalNetworkPolicy kullanarak tek bir policy ile tüm cluster'ı koruma altına alabilirsiniz.

Policy Order ve Öncelik Sıralaması

Calico, policy'lerin uygulanma sırasını kontrol etmek için order alanını destekler. Düşük order değerine sahip policy'ler önce uygulanır:

kubectl apply -f - 

Bu örnekte, DNS trafiğine izin veren kural (order: 10), genel deny kuralından (order sonsuz varsayılır) önce uygulanır. Bu sayede, önce izin verilen trafik belirlenir, ardından kalan trafik engellenir.

IP Block ve CIDR Eşleştirme

Calico, policy kurallarında IP adresleri ve CIDR blokları doğrudan kullanmanıza olanak tanır. Bu özellik, cluster dışı kaynaklarla iletişimi kontrol etmek için kullanışlıdır:

kubectl apply -f - 

Bu policy, sadece belirli CIDR bloklarından gelen trafiğe izin verir. IP block'lar, hem ingress hem de egress kurallarında kullanılabilir.

Calicoctl Kullanımı

Calico'nun yönetim aracı olan calicoctl, policy'leri oluşturmak, görüntülemek ve yönetmek için kullanılır. calicoctl, Kubernetes API'si veya etcd veritabanı ile doğrudan çalışabilir.

calicoctl Kurulumu

calicoctl'yi indirin ve PATH'e ekleyin:

curl -O https://docs.tigera.io/calico/v3.28.0/binaries/x86_64/calicoctl
chmod +x calicoctl
sudo mv calicoctl /usr/local/bin/

Kubernetes datastore kullanmak için calicoctl yapılandırın:

calicoctl create -f - 

Aslında, çoğu durumda calicoctl otomatik olarak Kubernetes API'sini kullanır ve ek yapılandırma gerektirmez.

Policy Yönetimi

calicoctl kullanarak policy oluşturma ve yönetme örnekleri:

calicoctl get networkpolicy -n policy-demo
calicoctl get globalnetworkpolicy
calicoctl apply -f my-policy.yaml
calicoctl delete policy allow-frontend -n policy-demo

calicoctl, policy'leri YAML dosyalarından oluşturmanıza ve mevcut policy'leri kolayca değiştirmenize olanak tanır.

En İyi Uygulamalar

Production ortamlarında Calico kullanırken dikkat edilmesi gereken önemli noktalar vardır. Bu best practice'ler, güvenlik, performans ve yönetilebilirlik açısından kritik öneme sahiptir.

Default Deny Policy Uygulaması

Güvenlik açısından en iyi uygulama, önce tüm trafiği engelleyen ve ardından gerekli trafiği açıkça izin veren bir model uygulamaktır. Bu yaklaşım, zero-trust güvenlik modelinin temelini oluşturur. İlk olarak global bir default deny policy oluşturun:

kubectl apply -f - 

Ardından, namespace bazında gerekli izinleri veren policy'ler ekleyin. Bu yaklaşım, saldırı yüzeyini minimuma indirir ve olası bir ihlal durumunda hasarı sınırlandırır.

Label Standardizasyonu

Etkili network policy yazımı için tutarlı bir label şeması kullanmak kritik önem taşır. Organizasyonunuz için standart label'lar belirleyin ve tüm ekiplerin bu standardı takip ettiğinden emin olun:

  • Uygulama adı için: app, app.kubernetes.io/name
  • Ortam için: environment (production, staging, development)
  • Tenant için: tenant, team
  • Versiyon için: version, app.kubernetes.io/version

Tutarlı label kullanımı, policy yazımını basitleştirir ve hata olasılığını azaltır.

Policy Staging ve Testing

Yeni policy'leri production'a uygulamadan önce staging ortamında test etmek önemlidir. Calico Enterprise'da policy staging özelliği bulunur, ancak açık kaynak versiyonunda manual olarak test yapabilirsiniz:

kubectl apply -f - 

Staging ortamında test edilen policy'ler, doğrulandıktan sonra production'a aktarılmalıdır.

Performance İyileştirmeleri

Büyük ölçekli cluster'larda policy performansını optimize etmek için bazı noktalara dikkat edin:

  • Mümkün olduğunca az selector kullanın
  • Geniş CIDR blokları yerine spesifik IP ranges tercih edin
  • Birden fazla kural tek policy'de gruplandırın
  • Gereksiz policy'leri temizleyin

Aşırı sayıda selector içeren policy'ler, her paket için daha fazla hesaplama gerektirir ve network latency'yi artırabilir.

Monitoring ve Logging

Calico'nun network policy etkinliğini izlemek için Prometheus metriklerini kullanın. Önemli metrikler arasında policy evaluate count, deny count ve flow log'ları yer alır:

kubectl get pods -n calico-system -l k8s-app=calico-node
kubectl logs -n calico-system -l k8s-app=calico-node --tail=100

Deny edilen trafik miktarını izlemek, potansiyel saldırıları veya yanlış yapılandırmaları tespit etmenize yardımcı olur.

Sonuç

Calico, Kubernetes ortamlarında güçlü ağ güvenliği ve network policy yönetimi sağlayan olgun bir çözümdür. eBPF tabanlı yüksek performansı, zengin policy özellikleri ve esneklik, Calico'yu enterprise Kubernetes deployment'ları için ideal bir seçim haline getirir.

Zero-trust güvenlik modeli uygulamak isteyen ekipler için Calico, gerekli tüm araçları sunar. Label tabanlı policy yaklaşımı, dinamik Kubernetes ortamlarında bile tutarlı güvenlik politikaları uygulamanızı sağlar. Doğru yapılandırma ve en iyi uygulamalarla, Calico cluster'ınızın ağ güvenliğini önemli ölçüde artırabilirsiniz.