Kubernetes'te kesintisiz deploy için kontrol listesi
Test edildiği sürüm: Kubernetes 1.35
Deployment stratejisini RollingUpdate yapmak, yayın sırasında hiçbir isteğin düşmeyeceği anlamına gelmiyor. Bizim ekipte her deploy’da birkaç yüz adet 502 görüyorduk ve sebebi üç ayrı ayarın eksik olmasıydı.
1. Readiness probe
Readiness probeReadiness probe Kubernetes’in bir pod’a trafik göndermeden önce, uygulamanın istek almaya hazır olup olmadığını kontrol ettiği sağlık denetimi. Tüm terimler → tanımlı değilse, pod Running durumuna geçtiği an trafik almaya başlar. Uygulama henüz veritabanı bağlantı havuzunu kurmadıysa ilk istekler hata verir.
readinessProbe: httpGet: path: /healthz/ready port: 8080 periodSeconds: 5 failureThreshold: 2Not
Readiness endpoint’i gerçekten bağımlılıkları kontrol etmeli, sadece 200 OK dönmemeli. Ancak liveness probe’u aynı endpoint’e bağlamayın: veritabanı kısa süre erişilemez olduğunda tüm pod’lar yeniden başlar.
2. Graceful shutdown
Pod silinirken Kubernetes iki işi aynı anda başlatır: SIGTERM gönderir ve pod’u endpoint listesinden çıkarır. Endpoint güncellemesinin tüm node’lara ulaşması birkaç saniye sürebilir. Bu sürede gelen istekler kapanmakta olan pod’a düşer.
Sıralama şöyle işliyor:
En basit çözüm kısa bir preStop beklemesi:
lifecycle: preStop: exec: command: ["sleep", "10"]terminationGracePeriodSeconds: 40Uygulamanın da SIGTERM aldığında yeni bağlantı kabul etmeyi bırakıp mevcut istekleri bitirmesi gerekir. Go’da bu http.Server.Shutdown ile yapılır.
3. PodDisruptionBudget
Node bakımı sırasında birden fazla pod aynı anda tahliye edilebilir. PDB bunu sınırlar:
apiVersion: policy/v1kind: PodDisruptionBudgetmetadata: name: apispec: minAvailable: 2 selector: matchLabels: app: apiSonuç
Bu üç değişiklikten sonra deploy sırasındaki hata sayısı sıfıra indi. Aynı ayarları yeni servis şablonumuza varsayılan olarak ekledik.