Cilium Kurulumu: eBPF Tabanlı Kubernetes Networking
Cilium Nedir ve Neden Kullanmalıyız?
Cilium, Linux kernel içinde çalışan eBPF (Extended Berkeley Packet Filter) teknolojisini kullanan açık kaynaklı bir Kubernetes networking, güvenlik ve gözlemleme çözümüdür. Geleneksel CNI eklentileri iptables'a bağımlıyken, Cilium eBPF programlarını doğrudan kernel içinde çalıştırarak önemli ölçüde daha iyi performans, güvenlik ve gözlemleme yetenekleri sunar.
eBPF, güvenlik duvarı kuralları ve ağ yönlendirmesi gibi kritik kodları kullanıcı alanı yerine doğrudan kernel içinde çalıştırmayı sağlar. Bu yaklaşım, veri kernel ile kullanıcı alanı arasında taşınma overhead'ini ortadan kaldırır. Cilium, bu teknolojiyi Kubernetes ortamlarında kullanarak, geleneksel çözümlerin sunamayacağı performans seviyelerine ulaşır.
Cilium'un temel avantajları şunlardır: eBPF destekli yüksek performans, kimlik tabanlı güvenlik politikaları, built-in Hubble gözlemleme, service mesh entegrasyonu, kube-proxy yerine geçebilme, ve L7 protokol farkındalığı. Özellikle yüksek ölçekli Kubernetes cluster'ları ve mikroservis mimarileri için ideal bir çözümdür.
eBPF Teknolojisi ve Avantajları
eBPF, Linux kernel içinde güvenli bir şekilde çalışan programlar yazmayı sağlayan bir teknolojidir. Geleneksel kernel modüllerinin aksine, eBPF programları kernel kaynak kodunu değiştirmeden kernel fonksiyonelliğini genişletir. Bu yaklaşım, güvenlik ve stabilite açısından büyük avantaj sağlar.
Cilium, ağ paketlerini işlemek için eBPF programlarını kullanır. Bir paket cluster'dan geçerken, Cilium'un eBPF programları kernel içinde çalışarak paketi inceler, filtreler ve yönlendirir. Bu sayede, iptables zincirlerinin yol açtığı performans kaybı yaşanmaz. Özellikle binlerce kural içeren güvenlik politikalarında bu fark belirgin şekilde hissedilir.
Geleneksel CNI vs Cilium
Geleneksel CNI eklentileri genellikle iptables veya ipvs kullanarak ağ politikalarını uygular. Kural sayısı arttıkça, her paket için tüm kurallardan geçirilmesi gerektiğinden performans doğrusal olmayan şekilde düşer. Cilium ise eBPF hash table'larını kullandığı için, kural sayısından bağımsız olarak O(1) karmaşıklıkta arama yapar.
Bu mimari fark, büyük ölçekli production ortamlarında Cilium'un en büyük avantajıdır. Yüzlerce pod ve binlerce kural içeren bir cluster'da bile, ağ gecikmesi minimal seviyede kalır.
Cilium Kurulumu Kubernetes Ortamında
Cilium'u Kubernetes'e kurmanın birkaç yolu vardır. En yaygın kullanılan yöntemler Helm chart ve Cilium CLI'dır. Her iki yöntem de desteklenir ve kendi avantajlarına sahiptir.
Ön Gereksinimler
Kuruluma başlamadan önce, Kubernetes cluster'ınızın aşağıdaki gereksinimleri karşıladığından emin olun: Kubernetes 1.20 veya üzeri, Linux kernel 5.10 veya üzeri, ve Helm 3 kurulu olmalıdır. Ayrıca, root veya sudo erişimi gereklidir.
Kernel versiyonunu kontrol etmek için:
uname -r
Helm kurulumu için:
curl -fsSL https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
Helm ile Kurulum
Cilium Helm repository'sini ekleyin:
helm repo add cilium https://helm.cilium.io/
helm repo update
Varsayılan değerlerle kurulum için:
helm install cilium cilium/cilium --namespace kube-system
Production ortamları için, ek konfigürasyonlarla kurulum önerilir:
helm install cilium cilium/cilium \
--namespace kube-system \
--set ipam.mode=cluster-pool \
--set ipv4.enabled=true \
--set ipv6.enabled=false \
--set hubble.enabled=true \
--set hubble.ui.enabled=true \
--set prometheus.enabled=true \
--set operator.replicas=2
Bu konfigürasyon, IPv4 desteği, Hubble gözlemleme arayüzü ve Prometheus metriklerini etkinleştirir.
Cilium CLI ile Kurulum
Cilium CLI, kurulum ve yönetim için alternatif bir yol sunar. İlk olarak CLI'yi indirin:
CILIUM_CLI_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/cilium-cli/main/version.txt)
CLI_ARCH=amd64
if [ "$(uname -m)" = "aarch64" ]; then CLI_ARCH=arm64; fi
curl -L --fail --remote-name-all https://github.com/cilium/cilium-cli/releases/download/${CILIUM_CLI_VERSION}/cilium-${CLI_ARCH}-linux.tar.gz{,.sha256sum}
sha256sum --check cilium-${CLI_ARCH}-linux.tar.gz.sha256sum
sudo tar -xzvf cilium-${CLI_ARCH}-linux.tar.gz -C /usr/local/bin
rm cilium-${CLI_ARCH}-linux.tar.gz*
Ardından cluster'a Cilium'u kurun:
cilium install --version 1.14.0
Kurulum durumunu kontrol edin:
cilium status --wait
Temel Konfigürasyon ve Ayarlar
Cilium kurulduktan sonra, temel konfigürasyon ayarlarını yapılandırmak önemlidir. Bu bölümde en sık kullanılan konfigürasyon seçeneklerini inceleyeceğiz.
IPAM Konfigürasyonu
Cilium, pod IP adreslerini yönetmek için farklı IPAM modları sunar. Cluster-pool mod, en yaygın kullanılan ve önerilen moddur. Bu modda, her node'a bir IP pool'u atanır ve pod'lar bu pool'dan IP alır.
helm upgrade cilium cilium/cilium \
--namespace kube-system \
--set ipam.mode=cluster-pool \
--set ipam.operator.clusterPoolIPv4PodCIDR=10.0.0.0/16 \
--set ipam.operator.clusterPoolIPv4MaskSize=24
Bu konfigürasyon, 10.0.0.0/16 CIDR bloğundan 24 bit subnet'ler oluşturur ve her node'a bir subnet atar.
Kube-proxy Replacement
Cilium, kube-proxy'nin yaptığı işlevlerin bir kısmını üstlenebilir. Bu özellik, service load balancing ve NodePort hizmetleri için iptables yerine eBPF kullanır. Performans iyileştirmesi sağlar.
helm upgrade cilium cilium/cilium \
--namespace kube-system \
--set kubeProxyReplacement=strict \
--set hostServices.enabled=true \
--set externalIPs.enabled=true \
--set nodePort.enabled=true
Bu ayar etkinleştirildiğinde, kube-proxy devre dışı bırakılabilir veya tamamen kaldırılabilir:
kubectl delete ds kube-proxy -n kube-system
kubectl delete deploy kube-proxy -n kube-system
Hubble Gözlemleme
Hubble, Cilium'un built-in ağ ve güvenlik gözlemleme aracıdır. Service graph, network flow'lar, güvenlik politikası etkinlikleri ve diagnostik bilgiler sunar.
helm upgrade cilium cilium/cilium \
--namespace kube-system \
--set hubble.enabled=true \
--set hubble.ui.enabled=true \
--set hubble.relay.enabled=true \
--set prometheus.enabled=true \
--set prometheus.port=9965
Hubble UI'ya erişmek için port forwarding yapın:
kubectl port-forward -n kube-system svc/hubble-ui 8081:80
Tarayıcıda http://localhost:8081 adresine giderek Hubble arayüzüne ulaşabilirsiniz.
Ağ Politikaları ve Güvenlik
Cilium'un en güçlü özelliklerinden biri, kimlik tabanlı ağ güvenlik politikalarıdır. Geleneksel IP tabanlı yaklaşımın aksine, Cilium pod etiketlerini kullanarak politikalar tanımlar. Bu yaklaşım, dinamik Kubernetes ortamlarında çok daha esnek ve yönetilebilir bir güvenlik modeli sunar.
CiliumNetworkPolicy
Temel ağ politikası oluşturmak için CiliumNetworkPolicy kaynağını kullanın. Aşağıdaki örnek, frontend pod'larının yalnızca backend pod'larıyla iletişim kurmasına izin verir:
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: frontend-to-backend
namespace: demo
spec:
endpointSelector:
matchLabels:
app: backend
ingress:
- fromEndpoints:
- matchLabels:
app: frontend
Bu politika, backend pod'larına yalnızca frontend pod'larından gelen trafiğe izin verir. IP adresleri yerine etiketler kullanıldığı için, pod'lar yeniden başlatıldığında veya IP değiştirdiğinde politika otomatik olarak güncellenir.
L3-L7 Politikaları
Cilium, Layer 3 ve Layer 7'de detaylı politikalar tanımlamayı destekler. HTTP metodları, path'ler ve header'lar üzerinde kontrol sağlar:
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: api-restrictions
namespace: demo
spec:
endpointSelector:
matchLabels:
app: api
ingress:
- fromEndpoints:
- matchLabels:
app: frontend
toPorts:
- port: "80"
protocol: TCP
rules:
http:
- method: "GET"
path: "/api/v1/.*"
Bu politika, yalnızca GET metodunu ve /api/v1/ ile başlayan path'leri izin verir. Diğer tüm istekler engellenir.
DNS Politikaları
Cilium, DNS tabanlı politikalar da destekler. Belirli domain'lere erişimi kısıtlayabilirsiniz:
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: dns-restrictions
namespace: demo
spec:
endpointSelector:
matchLabels:
app: webapp
egress:
- toEndpoints:
- matchLabels:
k8s:io.kubernetes.pod.namespace: kube-system
k8s-app: kube-dns
toPorts:
- port: "53"
protocol: UDP
- toFQDNs:
- matchName: "api.trusted-domain.com"
Bu politika, webapp pod'larının yalnızca cluster DNS'ine ve api.trusted-domain.com domain'ine erişmesine izin verir.
Hubble ile Ağ İzleme
Hubble, Cilium'un gözlemleme ve troubleshoot aracıdır. Ağ akışlarını gerçek zamanlı izlemeyi, güvenlik politikası etkinliklerini analiz etmeyi ve ağ problemlerini diagnostik etmeyi sağlar.
Flow İzleme
Belirli bir pod'un ağ akışlarını izlemek için:
cilium hubble observe --namespace demo --pod frontend-7d9f8b6c4-x2z8m
Bu komut, frontend pod'unun tüm ağ trafiğini gösterir. İzin verilen ve reddedilen bağlantılar farklı renklerle işaretlenir.
Belirli bir servise giden trafiği izlemek için:
cilium hubble observe --to-service backend --namespace demo
Politika Etkinlikleri
Güvenlik politikası eşleşmelerini izlemek için:
cilium hubble observe --type policy-verdict --namespace demo
Bu komut, hangi politikaların eşleştiğini, hangi trafiğin izin verildiğini veya reddedildiğini gösterir. Troubleshooting sırasında çok faydalıdır.
Grafana Entegrasyonu
Hubble metriklerini Grafana'da görüntülemek için, Prometheus data source olarak ekleyin ve Cilium dashboard'larını import edin. Dashboard'lar ağ throughput, paket kayıp oranları, politik eşleşme istatistikleri ve daha birçok metriği içerir.
Grafana dashboard import için:
kubectl get configmap -n kube-system cilium-hubble-dashboards -o yaml > dashboard.yaml
kubectl apply -f dashboard.yaml -n monitoring
Service Mesh Entegrasyonu
Cilium, service mesh yeteneklerini de sunar. Geleneksel sidecar tabanlı service mesh'lerin aksine, eBPF tabanlı mimari ile çalışır. Bu yaklaşım, daha düşük kaynak tüketimi ve daha yüksek performans sağlar.
Cilium Service Mesh
Cilium'un service mesh özelliklerini etkinleştirmek için:
helm upgrade cilium cilium/cilium \
--namespace kube-system \
--set envoy.enabled=true \
--set cilium.envoy.enabled=true
Bu ayar, Envoy proxy'yi Cilium'un bir parçası olarak etkinleştirir. mTLS, traffic splitting, circuit breaking gibi ileri düzey mesh özellikleri kullanılabilir hale gelir.
Traffic Management
Cilium ile traffic splitting yapılandırmak için:
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: traffic-split
namespace: demo
spec:
endpointSelector:
matchLabels:
app: paymentservice
ingress:
- fromEndpoints:
- matchLabels:
app: api-gateway
toPorts:
- port: "80"
protocol: TCP
loadBalancer:
algorithm: round_robin
targetGroups:
- serviceName: paymentservice-v1
weight: 90
- serviceName: paymentservice-v2
weight: 10
Bu konfigürasyon, gelen trafiğin %90'ını v1, %10'unu v2 versiyonuna yönlendirir. Canary deployment stratejileri için idealdir.
En İyi Uygulamalar ve İpuçları
Cilium'u production ortamında kullanırken dikkat edilmesi gereken bazı en iyi uygulamalar vardır. Bu öneriler, güvenlik, performans ve yönetilebilirlik açısından kritiktir.
Politika Oluşturma
Yeni politikalar oluştururken, önce allow-all politikasıyla başlayın ve trafiği gözlemleyin. Sorun yoksa, kısıtlamaları kademeli olarak ekleyin. Bu yaklaşım, yanlışlıkla bağlantı kesilmesini önler.
Kimlik tabanlı politikalar kullanın. IP adresleri yerine pod etiketlerini tercih edin. Bu sayede, pod yeniden başladığında veya IP değiştirdiğinde politika otomatik olarak çalışmaya devam eder.
Hubble Etkinleştirme
Hubble'ı kurulumdan itibaren etkinleştirin. Gözlemleme, troubleshooting için kritiktir. Sorun oluştuktan sonra observability eklemek çok daha zordur.
Prometheus ile entegrasyon yaparak metrikleri uzun süreli saklayın ve analiz yapın. Bu, trendleri belirlemek ve kapasite planlaması için gereklidir.
Kaynak Yönetimi
eBPF map'lerinin kapasite limitlerini izleyin. Map dolduğunda, yeni bağlantılar reddedilir. Bu durumu önlemek için map boyutlarını yapılandırın:
helm upgrade cilium cilium/cilium \
--namespace kube-system \
--set bpf.mapSize.connectionTracking=1000000 \
--set bpf.mapSize.neigh=1000000
Node başına düşen pod sayısına göre bu değerleri ayarlayın.
Bağlantı Testi
Cilium'un bağlantı testini düzenli olarak çalıştırın:
cilium connectivity test
Bu test, cluster içi ve dışı tüm bağlantıları doğrular. CI/CD pipeline'larına entegre edilmesi önerilir.
Sonuç
Cilium, Kubernetes ortamları için güçlü bir ağ ve güvenlik çözümüdür. eBPF teknolojisi sayesinde, geleneksel çözümlerin sunamayacağı performans seviyelerine ulaşır. Kimlik tabanlı güvenlik politikaları, dinamik mikroservis ortamlarında esneklik ve yönetilebilirlik sağlar.
Hubble ile entegre gözlemleme yetenekleri, ağ problemlerinin hızlı bir şekilde teşhis edilmesini sağlar. Service mesh entegrasyonu ise ileri düzey trafik yönetimi gereksinimlerini karşılar.
Yüksek ölçekli Kubernetes cluster'ları, mikroservis mimarileri ve güvenlik odaklı altyapılar için Cilium, en iyi seçeneklerden biridir. Doğru konfigürasyon ve en iyi uygulamalarla, production ortamlarında güvenilir ve yüksek performanslı bir ağ altyapısı kurabilirsiniz.