Kubernetes (kısaca K8s), Google’ın kendi iç altyapısında yıllarca kullandığı sistemden esinlenerek geliştirdiği, bugün container orkestrasyonunda fiili standart haline gelmiş açık kaynak bir platformdur. İlk bakışta terminolojisi göz korkutucu gelebilir, ama temelde yaptığı şey Docker Swarm ile aynıdır: “bu uygulamanın şu kadar kopyası her zaman ayakta olsun” dediğiniz bir istenen durumu sürekli sağlamaya çalışır. Fark, bunu çok daha esnek ve genişletilebilir bir şekilde yapmasıdır.
Küme mimarisi: Control Plane ve Node’lar
Bir Kubernetes kümesi iki ana parçadan oluşur:
- Control Plane: Kümenin “beyni”. API sunucusu, zamanlayıcı (scheduler) ve küme durumunu tutan veritabanı (etcd) buradadır. Siz kümeye komut verdiğinizde aslında Control Plane’deki API sunucusuyla konuşursunuz.
- Worker node’lar: Asıl uygulamalarınızın (Pod’ların) çalıştığı sunuculardır. Her node üzerinde
kubeletadlı bir ajan çalışır ve Control Plane’in talimatlarını uygular.
Pod: Kubernetes’in en küçük yapı taşı
Docker’da doğrudan container çalıştırırsınız; Kubernetes’te en küçük dağıtım birimi container değil, Pod‘dur. Bir Pod, genellikle tek bir container’ı sarmalar, ama bazen ağ ve depolamayı paylaşan birden fazla sıkı bağlı container’ı bir arada barındırabilir (örneğin ana uygulama + log toplayıcı yan container’ı).
# En basit haliyle bir Pod tanımı (pod.yaml)
apiVersion: v1
kind: Pod
metadata:
name: merhaba-web
spec:
containers:
- name: web
image: nginx:1.27
ports:
- containerPort: 80
kubectl apply -f pod.yaml
kubectl get pods
Deployment: Pod’ları yönetmenin doğru yolu
Pod’ları doğrudan elle oluşturmak pratikte pek yapılmaz, çünkü bir Pod çökerse kendi kendine yeniden başlamaz. Bunun yerine bir Deployment tanımlarsınız — Deployment, “bu Pod şablonundan her zaman N kopya çalışsın” der ve eksik kalan kopyaları otomatik olarak yeniden oluşturur:
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-deployment
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: web
image: nginx:1.27
ports:
- containerPort: 80
kubectl apply -f deployment.yaml
kubectl scale deployment/web-deployment --replicas=6
kubectl set image deployment/web-deployment web=nginx:1.28
Service: Pod’lara sabit bir adres kazandırmak
Pod’lar tek başına kararsızdır — bir Pod yeniden oluşturulduğunda yeni bir IP adresi alır. Bu yüzden diğer uygulamaların (veya dış dünyanın) doğrudan Pod IP’sine güvenmesi işe yaramaz. Service, belirli etiketlere (label) sahip Pod grubuna sabit, değişmeyen tek bir adres ve isim üzerinden erişim sağlar; trafiği o an ayakta olan Pod’lar arasında otomatik olarak dengeler:
# service.yaml
apiVersion: v1
kind: Service
metadata:
name: web-service
spec:
selector:
app: web
ports:
- port: 80
targetPort: 80
type: ClusterIP
Pod → Deployment → Service üçlüsü Kubernetes’in en temel deseni: Deployment Pod’ların hayatta kalmasını garanti eder, Service ise bu Pod’lara sabit bir “kapı” sağlar. Dış dünyadan erişim için genellikle bir de Ingress kaynağı eklenir.
Docker Compose’dan gelen biri için hızlı çeviri tablosu
| Docker Compose | Kubernetes karşılığı |
|---|---|
docker-compose.yml |
Birden fazla YAML manifesti (Deployment, Service, …) |
services: altındaki bir servis |
Deployment + Service ikilisi |
docker compose up |
kubectl apply -f . |
replicas (Compose’da sınırlı) |
spec.replicas (tam otomatik ölçekleme ile) |
ports: |
Service + isteğe bağlı Ingress |
Bu temel üçlüyü (Pod, Deployment, Service) anladıktan sonra Kubernetes’in geri kalanı — ConfigMap, Secret, Ingress, StatefulSet gibi kaynaklar — bu temel üzerine katman katman eklenir. Bu portaldaki Mimari Oluşturucu aracıyla, bu kaynakların gerçek bir manifestte nasıl bir araya geldiğini görsel olarak inceleyebilirsiniz.