Kubernetes Temelleri: Container Orchestration
Kubernetes Nedir?
Kubernetes (kısaca K8s), Google tarafından geliştirilen ve şu anda Cloud Native Computing Foundation (CNCF) tarafından yönetilen açık kaynaklı bir container orchestration platformudur. Konteynerleştirilmiş uygulamalarınızı otomatik olarak dağıtmanızı, ölçeklendirmenizi ve yönetmenizi sağlar. Mikro hizmet mimarilerinin yaygınlaşmasıyla birlikte Kubernetes, modern yazılım altyapısının vazgeçilmez bir bileşeni haline gelmiştir.
Geleneksel monolitik uygulamalar tek bir sunucuda çalışırken, bugünün uygulamaları onlarca hatta yüzlerce konteynerde dağıtık olarak çalışır. Bu konteynerlerin koordinasyonunu manuel olarak yapmak neredeyse imkansızdır; işte tam bu noktada Kubernetes devreye girer.
Temel Kavramlar
Pod
Kubernetes'in en küçük dağıtım birimidir. Bir Pod, bir veya daha fazla konteyneri içerebilir. Aynı Pod içindeki konteynerler aynı ağ alanını ve depolama birimlerini paylaşır. Pratikte çoğu Pod tek bir konteyner barındırır, ancak sidecar pattern gibi durumlarda birden fazla konteyner kullanılır.
Node
Pod'ların üzerinde çalıştığı fiziksel veya sanal makinelerdir. Her node üzerinde kubelet (node agent), kube-proxy (ağ kurallarını yöneten bileşen) ve bir container runtime (örneğin containerd) çalışır.
Cluster
Bir veya daha fazla control plane node'u ile birlikte çalışan worker node'larının oluşturduğu bütüne cluster denir. Control plane; API Server, etcd, Scheduler ve Controller Manager gibi bileşenlerden oluşur ve kümenin tüm karar mekanizmasını yönetir.
Service
Pod'lar geçicidir ve herhangi bir zamanda yeniden oluşturulabilir. Service, bir grup Pod'a sabit bir ağ adresi ve DNS adı sağlayarak bu dinamik yapıyı soyutlar. ClusterIP, NodePort ve LoadBalancer olmak üzere üç temel Service türü vardır.
Deployment
Uygulamanızın istenen durumunu tanımlayan üst düzey bir kaynaktır. Kaç replika çalışacağını, hangi container imajının kullanılacağını ve güncelleme stratejisini belirtir. Kubernetes, mevcut durumu sürekli olarak istenen durumla karşılaştırır ve gerekli düzeltmeleri otomatik yapar.
Kubernetes Mimarisi
Kubernetes mimarisi control plane ve data plane olmak üzere iki ana katmandan oluşur:
- API Server (kube-apiserver): Tüm iç ve dış iletişimin merkezi noktasıdır. kubectl komutları, diğer bileşenler ve dış araçlar bu API üzerinden iletişim kurar.
- etcd: Kümenin tüm yapılandırma ve durum bilgisini saklayan dağıtık anahtar-değer deposudur. Kümenin "beyni" olarak düşünülebilir.
- Scheduler: Yeni oluşturulan Pod'ları uygun node'lara atamaktan sorumludur. Kaynak gereksinimleri, kısıtlamalar ve affinite kurallarını değerlendirerek en uygun node'u seçer.
- Controller Manager: Kümedeki çeşitli kontrol döngülerini çalıştırır. Deployment Controller, ReplicaSet Controller ve Node Controller gibi bileşenler burada yer alır.
Pratik Uygulama: İlk Deployment
Bir Nginx web sunucusunu Kubernetes üzerinde çalıştırmak için aşağıdaki YAML dosyasını kullanabilirsiniz:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.27
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
Bu dosyayı uygulamak için:
kubectl apply -f nginx-deployment.yaml
Deployment durumunu kontrol etmek için:
kubectl get deployments
kubectl get pods -l app=nginx
kubectl describe deployment nginx-deployment
Şimdi bu Pod'lara erişim sağlamak için bir Service tanımlayalım:
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer
Ölçeklendirme ve Güncelleme
Kubernetes'in en güçlü özelliklerinden biri yatay ölçeklendirme yeteneğidir. Replika sayısını artırmak tek bir komutla mümkündür:
kubectl scale deployment nginx-deployment --replicas=5
Otomatik ölçeklendirme için Horizontal Pod Autoscaler (HPA) kullanabilirsiniz. HPA, CPU veya bellek kullanımına göre Pod sayısını dinamik olarak ayarlar:
kubectl autoscale deployment nginx-deployment --min=2 --max=10 --cpu-percent=70
Uygulama güncellemeleri için Kubernetes rolling update stratejisini varsayılan olarak kullanır. Bu strateji, eski Pod'ları kademeli olarak yeni sürümle değiştirir ve sıfır kesinti sağlar:
kubectl set image deployment/nginx-deployment nginx=nginx:1.28
Bir güncelleme sorun çıkarırsa anında geri alabilirsiniz:
kubectl rollout undo deployment/nginx-deployment
Namespace ile İzolasyon
Namespace'ler, aynı küme içinde mantıksal izolasyon sağlar. Farklı ekipler veya ortamlar (geliştirme, test, üretim) için ayrı namespace'ler oluşturabilirsiniz:
kubectl create namespace development
kubectl create namespace production
kubectl get pods --namespace=development
Resource Quota ile her namespace'in kullanabileceği kaynakları sınırlayabilirsiniz; bu, paylaşılan kümelerde adil kaynak dağılımı açısından kritik öneme sahiptir.
ConfigMap ve Secret Yönetimi
Uygulama yapılandırmasını konteyner imajından ayırmak en iyi pratiklerden biridir. ConfigMap ortam değişkenleri ve yapılandırma dosyaları için, Secret ise parola ve API anahtarları gibi hassas veriler için kullanılır:
kubectl create configmap app-config --from-literal=DB_HOST=postgres.default.svc
kubectl create secret generic db-credentials --from-literal=password=guclu-sifre-123
Sağlık Kontrolleri
Kubernetes, konteynerlerin sağlığını izlemek için üç tür probe sunar:
- Liveness Probe: Konteynerin çalışıp çalışmadığını kontrol eder. Başarısız olursa konteyner yeniden başlatılır.
- Readiness Probe: Konteynerin trafik almaya hazır olup olmadığını belirler. Hazır olmayan Pod'lar Service'den çıkarılır.
- Startup Probe: Yavaş başlayan uygulamalar için başlangıç süresini kontrol eder.
Sonuç ve İleri Adımlar
Kubernetes, konteyner yönetiminin karmaşıklığını büyük ölçüde azaltır ve uygulamalarınızı daha dayanıklı, ölçeklenebilir ve yönetilebilir hale getirir. Bu yazıda ele aldığımız temel kavramları anladıktan sonra şu ileri konulara yönelebilirsiniz:
- Helm Charts ile paket yönetimi ve şablon oluşturma
- Ingress Controller ile gelişmiş trafik yönlendirme ve TLS sonlandırma
- Persistent Volumes ile kalıcı veri depolama stratejileri
- RBAC (Role-Based Access Control) ile güvenlik politikaları
- Service Mesh (Istio, Linkerd) ile mikro hizmetler arası iletişim yönetimi
- GitOps yaklaşımı ile ArgoCD veya Flux kullanarak deklaratif dağıtım
Yerel ortamınızda pratik yapmak için minikube veya kind (Kubernetes in Docker) araçlarını kullanarak hızlıca bir test kümesi kurabilirsiniz. Kubernetes ekosistemini keşfettikçe, modern yazılım altyapısını daha güvenli ve verimli şekilde yönetme beceriniz önemli ölçüde artacaktır.