Health Checks: Liveness & Readiness
Sog'lik tekshiruvlari: liveness va readiness
"Cloud Patterns for Go" kursidagi "Health & Readiness Endpoints" darsida shifoxona misolini ko'rgan edingiz: "bemor tirikmi?" (liveness) va "bemor OPERATSIYAGA tayyor holatdami?" (readiness) — ikki xil savol. Bu darsda esa buni Kubernetes'ning O'ZI — "kubelet" nomli agent — qanday ishlatib, PODga nisbatan QAROR qabul qilishini o'zingiz simulyatsiya qilasiz.
package main
import (
"encoding/json"
"fmt"
"net/http"
"net/http/httptest"
)
type Status struct {
OK bool `json:"ok"`
}
type PodHealth struct {
Alive bool
DBReady bool
}
func (p *PodHealth) LivenessHandler(w http.ResponseWriter, r *http.Request) {
if !p.Alive {
w.WriteHeader(http.StatusServiceUnavailable)
}
json.NewEncoder(w).Encode(Status{OK: p.Alive})
}
func (p *PodHealth) ReadinessHandler(w http.ResponseWriter, r *http.Request) {
ready := p.Alive && p.DBReady
if !ready {
w.WriteHeader(http.StatusServiceUnavailable)
}
json.NewEncoder(w).Encode(Status{OK: ready})
}
func checkCode(handler http.HandlerFunc) int {
req := httptest.NewRequest("GET", "/", nil)
rec := httptest.NewRecorder()
handler(rec, req)
return rec.Code
}
func main() {
pod := &PodHealth{Alive: true, DBReady: false}
fmt.Println(checkCode(pod.LivenessHandler))
fmt.Println(checkCode(pod.ReadinessHandler))
}checkCode — "Health & Readiness Endpoints" darsida ko'rgan httptest.NewRecorder() naqshi: haqiqiy tarmoq so'rovi YO'Q, faqat handler funksiyasi TO'G'RIDAN-TO'G'RI chaqiriladi. pod.Alive = true, pod.DBReady = false holatida: liveness — 200 (dastur ISHLAYAPTI), readiness — 503 (baza HALI tayyor emas, so'rov qabul qilishga SHOSHILMASLIK kerak).
Bu farq NEGA muhim: agar kubelet liveness'ni 503 deb ko'rsa, u Pod'ni O'LDIRIB, QAYTA ishga tushiradi — bu og'ir chora. Readiness 503 bo'lsa esa, kubelet Pod'ni O'LDIRMAYDI, faqat Service'ning "Endpoints" ro'yxatidan VAQTINCHA chiqarib qo'yadi ("Service: Stable Networking for Pods" darsini eslang) — chunki muammo VAQTINCHA (masalan, baza hali ulanmagan) bo'lishi mumkin.
>_ Exercise
Kubelet'ning PodHealth holatiga qarab qanday QAROR qabul qilishini aniqlaydigan funksiya yozing.
- •Action(p *PodHealth) string funksiyasini yozing: Alive false bo'lsa "restart", DBReady false bo'lsa "remove-from-service", aks holda "ok" qaytaring
- •Alive=true, DBReady=false bo'lgan pod uchun Action natijasini chop eting
- •Alive=false bo'lgan ikkinchi pod uchun ham Action natijasini chop eting
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
Liveness — "dastur umuman ishlayaptimi?" (yo'q bo'lsa — qayta ishga tushiriladi), readiness — "hozir so'rov qabul qilishga tayyormi?" (yo'q bo'lsa — vaqtincha trafikdan chetlashtiriladi); bu ikki xil javob, kubelet tomonidan ikki xil, mutanosib qarorga olib keladi.
NEXT UP
Horizontal Pod Autoscaling
$ go run main.go
Kodingizni ishga tushiring