İçeriğe geç
11 dk okuma DevOps

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.