GoDasturchi
Health Checks: Liveness & Readiness

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.

example.go
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.

Hints (0/3)

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

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

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.

example.go
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.

Hints (0/3)

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