📌 Hızlı Özet & Temel Çıkarım:
Production Seviyesinde Kubernetes Mimarisi, container’ların salt ayağa kaldırılmasından öte; trafik dalgalanmalarına göre otomatik ölçeklenen (HPA), cert-manager ile Let’s Encrypt TLS sertifikalarını otomatik yenileyen, Pod Disruption Budget ile sıfır kesintili güncelleme (zero-downtime rolling update) sunan ve NGINX Ingress Controller ile uç güvenliği sağlayan yüksek dayanımlı bir küme orkestrasyonudur.
1. Kubernetes Kümesinde Yüksek Erişilebilirlik (HA) Temelleri
Bir Kubernetes kümesini canlıya alırken en kritik hedef tek arıza noktası (SPOF) bırakmamaktır:
- Control Plane (Master Düğümler): etcd veritabanının quorum sağlayabilmesi için en az 3 tek sayılı master düğüm çalıştırılmalıdır.
- Worker Düğümleri: Servis pod’ları farklı fiziksel sunuculara veya bulut kullanılabilirlik bölgelerine (Availability Zones)
podAntiAffinitykurallarıyla dağıtılmalıdır. - Sağlık Probları (Probes): Kubernetes’in arızalı pod’ları otomatik tespit edip yeniden başlatması için
livenessProbeve trafiği kesmesi içinreadinessProbemutlaka tanımlanmalıdır.
2. Production NGINX Ingress ve Otomatik TLS Yapılandırması
Dış dünyadan gelen HTTP/HTTPS isteklerini küme içindeki doğru servislere yönlendiren katman Ingress Controller’dır.
Aşağıdaki bildirim (manifest), modern NGINX Ingress kuralları ile otomatik Let’s Encrypt TLS entegrasyonunu sergiler:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: core-api-ingress
namespace: production
annotations:
kubernetes.io/ingress.class: "nginx"
cert-manager.io/cluster-issuer: "letsencrypt-prod"
nginx.ingress.kubernetes.io/ssl-redirect: "true"
nginx.ingress.kubernetes.io/proxy-body-size: "10m"
nginx.ingress.kubernetes.io/proxy-connect-timeout: "15"
nginx.ingress.kubernetes.io/proxy-read-timeout: "60"
nginx.ingress.kubernetes.io/limit-rps: "50" # Rate limiting korumasi
spec:
tls:
- hosts:
- api.aksoy.com
secretName: aksoy-api-tls-cert
rules:
- host: api.aksoy.com
http:
paths:
- path: /v1
pathType: Prefix
backend:
service:
name: core-api-service
port:
number: 8080
Bu yapılandırma ile cert-manager arka planda ACME challenge döngüsünü tamamlar, sertifikayı çeker ve Secret olarak bağlar. Süresi dolmadan 30 gün önce sertifika otomatik olarak sıfır kesintiyle yenilenir.
3. Horizontal Pod Autoscaler (HPA) ve Kaynak Rezervasyonları
Kubernetes scheduler’ının pod’ları doğru yerleştirebilmesi için her container’ın resources.requests ve resources.limits değerleri açıkça belirlenmelidir.
HPA, CPU veya bellek tüketimi belirlenen eşiği (örneğin %70) aştığında saniyeler içinde yeni pod replikaları başlatır:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: core-api-hpa
namespace: production
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: core-api-deployment
minReplicas: 3
maxReplicas: 20
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
4. İlgili Konular ve İç Bağlantılar
- Docker ve Container Kaynak İzolasyonu — Kubelet üzerinde çalışan container’ların çekirdek sınırları.
- Event-Driven Mikroservislerde Apache Kafka ve RabbitMQ — Küme içi asenkron mesajlaşma servisleri.
- Modern CI/CD Hatlarında DevSecOps — Manifest’lerin GitOps ile otomatik kümeye dağıtımı.
5. Sıkça Sorulan Sorular
Pod Disruption Budget (PDB) neden zorunludur?
Düğüm bakım çalışmaları veya Kubernetes sürüm güncellemeleri sırasında kubectl drain çalıştırıldığında, PDB tanımlanmamışsa tüm pod’lar aynı anda sonlandırılabilir ve geçici kesinti yaşanır. PDB, “en az 2 pod her an ayakta kalmalıdır” garantisi verir.
Ingress ile API Gateway (Kong, Envoy) arasındaki fark nedir?
Ingress temel seviyede yönlendirme (routing), TLS sonlandırma ve basit rate-limit sağlar. Eğer detaylı JWT doğrulama, dinamik eklentiler ve gelişmiş metrik toplama gerekiyorsa Ingress arkasında veya yerine Kong / Envoy tabanlı bir API Gateway konuşlandırılır.
6. Pod Security Standards (PSS) ve Ağ İlkeleri (NetworkPolicies) ile Sıfır Güven (Zero-Trust)
Kubernetes kümesinde varsayılan olarak her pod, aynı kümedeki diğer tüm pod’larla kısıtlamasız haberleşebilir. Bu durum bir frontend pod’u ele geçirildiğinde saldırganın doğrudan iç veritabanı portlarına (örneğin port 5432) erişebilmesi anlamına gelir.
Bunu önlemek için Kubernetes NetworkPolicy uygulanarak katı izolasyon sağlanır:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: database-access-policy
namespace: production
spec:
podSelector:
matchLabels:
app: postgres-db
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: backend-api # Sadece backend pod'larindan gelen trafige izin ver
ports:
- protocol: TCP
port: 5432
Bu kural sayesinde frontend veya analiz servisleri veritabanı IP’sine ping dahi atamaz; ağ seviyesinde paketler çekirdek (iptables/eBPF) tarafından sessizce düşürülür.
7. Kubernetes Kümesinde Graceful Shutdown ve PreStop Kancaları
Canlı sistemlerde pod’lar yeniden başlatılırken veya HPA ile pod sayısı azaltılırken (scale down), o anda pod üzerinde işlem gören kullanıcı isteklerinin yarıda kesilmemesi gerekir.
Kubernetes bir pod’u sonlandırırken önce SIGTERM sinyali gönderir, 30 saniye sonra yanıt alamazsa SIGKILL ile zorla kapatır.
Trafik kaybını sıfırlamak için Deployment yapılandırmasına preStop Lifecycle Hook eklenmelidir:
lifecycle:
preStop:
exec:
command: ["/bin/sh", "-c", "sleep 10"]
Bu 10 saniyelik bekleme komutu, Ingress ve yük dengeleyicinin (kube-proxy) ilgili pod’un IP adresini yönlendirme tablosundan çıkarması için yeterli süreyi tanır. Yeni gelen istekler diğer sağlıklı pod’lara aktarılırken, mevcut pod elindeki son işlemleri tamamlar ve temiz bir şekilde kapanır.
8. Kubernetes Kümesinde Kaynak Limitleri ve OOM-Killed Senaryolarının Yönetimi
Container’lar bellek sınırını (memory limit) aştığında Linux çekirdeği anında Out of Memory (OOM) Killer mekanizmasını devreye sokarak pod’u 137 çıkış koduyla sonlandırır.
Bu beklenmedik çöküşleri engellemek için:
- Bellek Profili Çıkarma: Pod’un normal çalışma anındaki ve ani yük altındaki RAM tüketimi Prometheus üzerinde en az 7 gün boyunca izlenmelidir.
- Limit Marjı (%25 Kuralı):
memory.limitdeğeri, gözlemlenen tepe tüketimin en az %25-30 üzerinde tanımlanmalıdır. - CPU Throttle İncelemesi: CPU limitleri pod’u öldürmez ancak işlemciyi yavaşlatır (throttling).
container_cpu_cfs_throttled_periods_totalmetriği izlenerek mikroservisin haksız yere frenlenip frenlenmediği doğrulanmalıdır. Bu dikkatli kapasite planlaması, Kubernetes kümesinin fırtınalı trafik günlerinde bile sarsılmadan ayakta kalmasını sağlar.