Kubernetes'te kesintisiz deploy için kontrol listesi

1 dk okumaBu yazının İngilizcesi de var →

Test edildiği sürüm: Kubernetes 1.35

İçindekiler
  1. 1. Readiness probe
  2. 2. Graceful shutdown
  3. 3. PodDisruptionBudget
  4. Sonuç

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.

deployment.yaml
readinessProbe:
httpGet:
path: /healthz/ready
port: 8080
periodSeconds: 5
failureThreshold: 2

Not

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:

preStop kancası (sleep 10) Pod'u endpoint listesinden çıkar SIGTERM Açık istekleri bitir, kapan Güncelleme node'lara yayılıyor Kubelet Pod Endpoint denetleyicisi kube-proxy (node'lar)
Pod silinirken olan olaylar

En basit çözüm kısa bir preStop beklemesi:

deployment.yaml
lifecycle:
preStop:
exec:
command: ["sleep", "10"]
terminationGracePeriodSeconds: 40

Uygulamanı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:

pdb.yaml
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: api
spec:
minAvailable: 2
selector:
matchLabels:
app: api

Sonuç

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.

Değişiklik geçmişi (1)
  1. Alt bilgiye build imzası, 404 ve çevrimdışı sayfalarına terminal görünümü ekleae75462

Klavye kısayolları

Arama ve komutlar
K
Ara
/
Ana sayfa
gh
Yazılar
gy
Notlar
gn
Kod parçacıkları
gk
Arşiv
ga
Projeler
gp
Sonraki yazı
j
Önceki yazı
k
Temayı değiştir
t
Bu listeyi göster
?