- Published on
Liveness Probe and Readiness Probe
- Authors
- Name
- Somprasong Damyos
- @somprasongd
Liveness Probe and Readiness Probe
ถ้าเรามี Service ที่ต้องนำไป Deploy บน Kubernetes ตัว Service ของเราจะต้องทำให้รองรับอีก 2 เรื่อง คือ
- Liveness Probe คือ k8s จะเรียกเพื่อทำการตรวจสอบว่า API ของเรายังทำงานอยู่หรือเปล่า สามารถทำได้หลายวิธี เช่น เรียกผ่าน http หรือ tcp เข้ามาถาม หรือทำการ cat file แต่เมื่อระบบของเรามีการทำ Graceful Shutdown เอาไว้ มันจะหยุดรับ request เข้ามา ซึ่งทำให้การเรียกผ่าน http เข้ามาจะทำไม่ได้ในขณะที่เกิด Graceful Shutdown ดังนั้นควรใช้วิธี cat file แทน ถ้าเจอไฟล์จะได้ status 0 กลับไป
- Readiness Probe คือ เอาไว้ตรวจสอบว่า service พร้อมให้บริการแล้วรึยัง เช่น เมื่อเริ่มต้นโปรแกรม จะต้องไปเชื่อมต่อฐานข้อมูลก่อน หรือต้องเตรียมอะไรบางอย่างที่ใช้เวลาให้เสร็จก่อน จึงจะเปิดรับ request เข้ามาได้
วิธีการทำ Liveness Probe
จะใช้วิธีการสร้าง temp file ขึ้นมา และเมื่อปิดระบบไปก็จะลบไฟล์นี้ทิ้งไปด้วย
ในส่วนโค้ด ให้เพิ่มการสร้างไฟล์เมื่อเริ่มโปรแกรม และลบไฟล์ทิ้งเมื่อจบโปรแกรม
main.go
func main() {
f, err := os.Create("./tmp-live")
if err != nil {
log.Fatal(err)
}
f.Close()
defer os.Remove("./tmp-live")
// ...
}
ในส่วน k8s ให้เรียกคำสั่ง cat file ที่สร้างไว้
livenessProbe:
exce:
command:
- cat
- /tmp/live
initialDelaySeconds: 5
periodSeconds: 5
วิธีการทำ Readiness Probe
จะใช้วิธีเพิ่ม route ขึ้นมา เมื่อมีการเรียกเข้ามาให้คืนสถานะ 200 OK
กลับไป
ในส่วนโค้ด ให้เพิ่ม /healthz
และ return 200 OK
กลับไป
main.go
func setupRouter(r *mux.Router) {
todo.HandleFunc("/healthz", handleHealthz).Methods(http.MethodGet)
// ...
}
func handleHealthz(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
}
ในส่วน k8s ให้เรียกไปยัง /healthz
readinessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 5
periodSeconds: 5