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.