Sağlık Kontrolü Uç Noktası: Liveness ve Readiness Farkı

Bir uygulamanın çalışıp çalışmadığını ve trafiği alıp alamayacağını bilmek, özellikle Kubernetes gibi orkestrasyonda kritik. Liveness ve readiness bu kontrolü sağlayan iki farklı mekanizmadır; hangisinin ne zaman kullanılacağını karıştırmak ciddi sorunlara yol açar.

Liveness Probe Nedir

Liveness, container'ın hala canlı olup olmadığını kontrol eder. Eğer başarısız olursa, Kubernetes container'ı öldürüp yenisini başlatır. Uygulamanın donup kaldığı, sonsuz döngüye girdiği ya da ölüm halinde olduğu durumlarda kullanılır.

Readiness Probe Nedir

Readiness, container'ın trafiği almaya hazır olup olmadığını kontrol eder. Başarısız olursa, Kubernetes pod'u service'ten çıkarır ama container'ı yeniden başlatmaz. Veritabanı bağlantısı kuruluyor, cache yükleniyor, başlangıç görevleri tamamlanıyor gibi durumlarda kullanılır.

Pratik Örnek: Go Uygulaması

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası

Bir Go web sunucusu yazalım ve iki sağlık kontrolü uç noktası ekleyelim.

1package main
2
3import (
4"fmt"
5"net/http"
6"time"
7)
8
9var appReady = false
10
11func liveness(w http.ResponseWriter, r *http.Request) {
12w.WriteHeader(http.StatusOK)
13fmt.Fprintf(w, "alive")
14}
15
16func readiness(w http.ResponseWriter, r *http.Request) {
17if!appReady {
18w.WriteHeader(http.StatusServiceUnavailable)
19fmt.Fprintf(w, "not ready")
20return
21}
22w.WriteHeader(http.StatusOK)
23fmt.Fprintf(w, "ready")
24}
25
26func main() {
27http.HandleFunc("/live", liveness)
28http.HandleFunc("/ready", readiness)
29
30go func() {
31time.Sleep(3 * time.Second)
32appReady = true
33fmt.Println("Uygulama hazır")
34}()
35
36fmt.Println("Sunucu:8080 üzerinde başladı")
37http.ListenAndServe(":8080", nil)
38}

Uygulamayı çalıştırıp test et:

1go run main.go

Başka bir terminalde:

2# Çıktı: alive
3
5# İlk 3 saniye: not ready (HTTP 503)
6# Sonra: ready (HTTP 200)

Kubernetes'te Kullanım

1apiVersion: v1
2kind: Pod
3metadata:
4name: app
5spec:
6containers:
7- name: app
8image: myapp:1.0
9livenessProbe:
10httpGet:
11path: /live
12port: 8080
13initialDelaySeconds: 10
14periodSeconds: 5
15readinessProbe:
16httpGet:
17path: /ready
18port: 8080
19initialDelaySeconds: 5
20periodSeconds: 2

Liveness başarısız olursa pod yeniden başlar; readiness başarısız olursa trafiği almaz ama pod ayakta kalır. Doğru probe türünü seçmek, uygulamanın stabil kalmasını sağlar.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz