Kubernetes Nedir? Container Orkestrasyon'u Sıfırdan Anlamak
Docker'ı öğrendiniz. Container çalıştırıyorsunuz. Uygulama ayağa kalkıyor, her yerde aynı çalışıyor. Mükemmel.
Şimdi production'a alacaksınız. Tek bir container yetmez — yüksek trafik için birden fazla instance gerekiyor. Bir container çökünce otomatik yeniden başlatılmalı. Trafik arttığında yeni instance'lar eklenmeli. Yeni versiyon deploy edilirken eski versiyon hâlâ çalışmalı. Tüm bu container'ların sağlığı izlenmeli.
Bunu elle yapmak mümkün değil. Kubernetes bu problemi çözüyor.
Kubernetes Nedir?
Kubernetes (K8s), container'ların dağıtımını, ölçeklenmesini ve yönetimini otomatikleştiren açık kaynak bir orkestrasyon platformudur. Google tarafından geliştirildi, 2014'te açık kaynak yapıldı. Bugün cloud-native yazılımın fiili standardıdır.
Kubernetes'in temel vaadi şudur: siz uygulamanın ne olmasını istediğinizi tanımlarsınız, Kubernetes bunu nasıl gerçekleştireceğini halleder.
# "Her zaman 3 instance çalışsın" — Kubernetes halleder replicas: 3
Bir instance çökerse Kubernetes yenisini başlatır. Bir node (sunucu) kapanırsa container'ları başka node'lara taşır. Trafik arttığında yeni instance ekler.
Temel Kavramlar
Pod: Kubernetes'in en küçük deploy edilebilir birimidir. Bir veya birden fazla container içerir. Aynı pod'daki container'lar aynı ağı ve depolama alanını paylaşır.
apiVersion: v1 kind: Pod metadata: name: my-app spec: containers: - name: app image: my-app:v1.0 ports: - containerPort: 3000 env: - name: NODE_ENV value: production
Node: Pod'ların çalıştığı fiziksel veya sanal sunucu. Kubernetes bir cluster'daki node'ları yönetir — hangi pod'un hangi node'da çalışacağına karar verir (scheduling).
Cluster: Birden fazla node'dan oluşan Kubernetes ortamı. Bir control plane (master node) cluster'ı yönetir, worker node'lar iş yükünü çalıştırır.
Cluster:
┌─────────────────────────────────────────┐
│ Control Plane │
│ (API Server, Scheduler, etcd) │
├────────────┬────────────┬───────────────┤
│ Node 1 │ Node 2 │ Node 3 │
│ Pod A │ Pod A │ Pod B │
│ Pod B │ Pod C │ Pod C │
└────────────┴────────────┴───────────────┘
Deployment: Pod'ları Yönetmek
Pod'ları direkt oluşturmak yerine genellikle Deployment kullanılır. Deployment, kaç pod çalışması gerektiğini, hangi image'ın kullanılacağını ve güncelleme stratejisini tanımlar.
apiVersion: apps/v1 kind: Deployment metadata: name: my-app spec: replicas: 3 # 3 pod her zaman ayakta olsun selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: containers: - name: app image: my-app:v1.0 resources: requests: memory: "128Mi" cpu: "250m" limits: memory: "256Mi" cpu: "500m" readinessProbe: httpGet: path: /health port: 3000 initialDelaySeconds: 5 periodSeconds: 10
readinessProbe kritik: Kubernetes pod'un gerçekten hazır olup olmadığını bunu kullanarak anlıyor. Probe başarısız olursa o pod'a trafik gönderilmiyor.
Rolling update: Yeni image deploy edildiğinde Kubernetes eski pod'ları birer birer kapatır, yeni pod'ları birer birer başlatır. Hiç downtime olmadan versiyon güncellenir.
# Yeni versiyon deploy et kubectl set image deployment/my-app app=my-app:v2.0 # Durumu izle kubectl rollout status deployment/my-app # Sorun olursa geri al kubectl rollout undo deployment/my-app
Service: Pod'lara Ulaşmak
Pod'ların IP adresleri sürekli değişir — yeniden başladığında yeni IP alır. Service, pod'lar önüne sabit bir endpoint koyar.
apiVersion: v1 kind: Service metadata: name: my-app-service spec: selector: app: my-app # bu label'a sahip pod'lara yönlendir ports: - port: 80 targetPort: 3000 type: ClusterIP # sadece cluster içinden erişilebilir
Service türleri: ClusterIP (cluster içi), NodePort (her node'da belirli port), LoadBalancer (cloud provider'dan external IP alır).
Ingress: Dış Dünyaya Açılmak
LoadBalancer her servis için ayrı external IP alır — pahalı. Ingress, tek bir external endpoint üzerinden birden fazla servise yönlendirme yapar.
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-ingress spec: rules: - host: api.example.com http: paths: - path: /users pathType: Prefix backend: service: name: user-service port: number: 80 - path: /orders pathType: Prefix backend: service: name: order-service port: number: 80
api.example.com/users → user-service, api.example.com/orders → order-service. Tek IP, birden fazla servis.
ConfigMap ve Secret: Konfigürasyon Yönetimi
# ConfigMap: hassas olmayan konfigürasyon apiVersion: v1 kind: ConfigMap metadata: name: app-config data: DATABASE_HOST: postgres-service LOG_LEVEL: info MAX_CONNECTIONS: "100" --- # Secret: hassas bilgiler (base64 encoded) apiVersion: v1 kind: Secret metadata: name: app-secrets type: Opaque data: DATABASE_PASSWORD: cGFzc3dvcmQxMjM= # base64 JWT_SECRET: c2VjcmV0a2V5MTIz # base64
Pod'da kullanımı:
spec: containers: - name: app envFrom: - configMapRef: name: app-config - secretRef: name: app-secrets
HorizontalPodAutoscaler: Otomatik Ölçeklendirme
apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: my-app-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: my-app minReplicas: 2 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 70
CPU kullanımı %70'i geçince Kubernetes otomatik yeni pod ekler. Düşünce otomatik azaltır. Siz bir şey yapmadan.
Kubernetes Ne Zaman Gerekli?
Kubernetes güçlü ama maliyetli — öğrenme eğrisi, operasyonel karmaşıklık, kaynak gereksinimi.
Henüz Kubernetes gerekmez: Tek sunucuda çalışan küçük uygulama, 5 kişiden az ekip, basit deployment ihtiyaçları.
Kubernetes değerlendirin: Birden fazla servis bağımsız ölçeklenmeli, yüksek availability gerekli, ekip CI/CD olgunluğuna ulaştı, cloud-native altyapı kuruluyor.
Docker'ı anlamadan Kubernetes'e geçmek karanlıkta yürümektir. Ama Docker'ı anladıktan sonra Kubernetes, production'da container yönetiminin kaçınılmaz bir sonraki adımıdır.