Kubernetes Zero-2-Hero EP.5 สร้าง Health Check ด้วย Liveness Readiness และ การใช้งาน Rollout

by. Settakit

settakit
Sirisoft
8 min readAug 27, 2021

--

สวัสดีครับ กลับมาเจอกันอีกครั้งกับ Series “Kubernetes Zero-2-Hero” ใน EP. นี้ ก็จะเป็น EP สุดท้ายกันแล้ว ก็ต้องขอขอบคุณมากนะครับ ที่ติดตามกันมาจนถึง EP นี้ โดยใน EP สุดท้ายนี้ เราก็จะมาพูดถึงเรื่องของ Kubernetes Good to Know ซึ่งเรื่องที่ผมจะมาพูดนั้นก็จะมีอยู่ 3 เรื่องดังนี้

Liveness Probe

Readiness Probe

Rollout

Liveness and Readiness Probe

Liveness Probe

liveness จะทำงานเมื่อ Container ภายใน Pod เริ่มทำงานจะเป็นการตรวจสอบว่า Container ของเราทำงานแล้ว ถ้าหากตรวจสอบตามเงื่อนไขแล้วไม่ผ่านการตรวจสอบ Container ภายใน Pod ก็จะถูกสั่งให้ Restart อีกครั้ง และตรวจสอบใหม่จนกว่าจะตรวจสอบผ่าน

source: https://cloud.google.com/blog/products/containers-kubernetes/kubernetes-best-practices-setting-up-health-checks-with-readiness-and-liveness-probes

Readiness Probe

Readiness เป็นการตรวจสอบความพร้อมใช้งานของ Container ภายใน Pod โดยจะเริ่มตรวจสอบหลังจาก Container เริ่มทำงานขึ้นมา โดยเมื่อตรวจสอบตามเงื่อนไขที่ตั้งไว้แล้วไม่ผ่าน ก็จะรอตามเวลาที่กำหนด แล้วตรวจสอบใหม่อีกครั้ง และเมื่อตรวจสอบผ่านแล้ว ก็จะปล่อยให้ Traffic จาก Service เข้ามาภายใน Container ได้ เพื่อป้องกันการปล่อย Traffic มายัง Container ที่ไม่พร้อมใช้งาน แล้วเกิดข้อผิดพลาดกับ Application ตัวอื่นที่เรียกใช้งาน Container ตัวนี้

source: https://cloud.google.com/blog/products/containers-kubernetes/kubernetes-best-practices-setting-up-health-checks-with-readiness-and-liveness-probes

ข้อแตกต่างระหว่าง Liveness และ Readiness

ถ้าเห็นชัด ๆ เลยก็จะเป็นเรื่องของการที่ Liveness จะ Restart Container ส่วน Readiness จะรอแล้วถึงจะตรวจสอบใหม่อีกครั้ง

ส่วนในมุมของการใช้งานอาจมี Container ที่ Start ขึ้นมาแล้ว แต่อาจจะยังไม่พร้อมใช้งาน เช่น Container เป็น Database ซึ่ง Container ทำงานแล้ว แต่ว่ายังไม่พร้อมให้บริการเนื่องจากยัง Intitial Database ไม่เสร็จ ซึ่งหากเราใช้ Liveness กับเรื่องนี้ Container ก็จะถูก Restart อีกครั้ง และถูกตรวจสอบใหม่ ในขณะที่ Container ถูก Restart ก็จะต้องใช้ทรัพยากรในการ Start Container ขึ้นมา ซึ่งหากในเคสนี้เราใช้งาน Readiness ผลที่ออกมาก็จะต่างออกไป ทันทีที่ Readiness ตรวจสอบแล้วไม่ผ่าน ก็จะรอตามเวลาที่กำหนด แล้วตรวจสอบใหม่อีกครั้งโดยไม่จำเป็นต้อง Restart Contianer ให้เสียทรัพยากรในการ Start ขึ้นมา เนื่องจาก Contianer ไม่ได้มีปัญหาอะไรยังทำงานอยู่ แต่แค่ยังไม่พร้อมให้บริการเท่านั้น

เงื่อนไขที่สามารถใช้ Liveness และ Readiness Probe ได้

สามารถเช็คได้ 3 แบบ คือ​

  • HTTP GET= Status Code 200-399Success (ใน Application ที่จะ Deploy ต้องมี Path สำหรับตรวจสอบสถานะด้วย)
  • Command = Any Command Return Zero Code Success​
  • TCP = Allow Ports

Configuration

  • initialDelaySeconds = เวลาหลังจาก Container ถูกสร้างให้ตรวจสอบสถานะ (Default 0)​
  • periodSeconds = ความถี่ในการตรวจสอบ (Default 10, Min 1)​
  • timeoutSeconds = จำกัดเวลาในการตรวจสอบสถานะ (Default 1, Min 1)​
  • successThreshold = จำนวนครั้งที่ถือว่าผ่านหลังจากที่ตรวจสอบแล้วไม่ผ่านในครั้งก่อน (Default 1)​
  • failureThreshold = จำนวนครั้งที่ตรวจสอบไม่ผ่านได้กี่ครั้ง จะเลิกตรวจสอบ (Default 3)​

ที่เราจะกำหนดเองหลัก ๆ จะเป็นเรื่อง initialDelaySeconds และ initialDelaySeconds

Liveness and Readiness Probe HTTP

ต่อไปจะเป็นตัวอย่างการใช้งาน Liveness และ Readiness โดยใช้งาน HTTP GET

จากนั้นเรียก Pod ออกมาดู

จะพบว่าในสถานะจะมีการ Restart เกิดขึ้นเนื่องจาก Liveness ตรวจสอบแล้วไม่ผ่าน

จากนั้นเมื่อลองดูรายละเอียดภายใน Pod จะพบกับปัญหาดังนี้

ต่อไปทดลองลบ Pod ที่ชื่อว่า “pod-probe-http-fail” แล้วสร้างขึ้นมาใหม่โดยแก้ไขไฟล์ดังนี้

ลองเรียก Pod ขึ้นมาดูอีกครั้ง

จะพบว่า Restart จะเป็น 0 เนื่องจากเราได้แก้ไขให้ Liveness ตรวจสอบผ่าน แล้ว แต่เรายังไม่ได้แก้ไขให้ Readiness ตรวจสอบผ่าน แต่ในเคสนี้จะเห็นความแตกต่างระหว่าง Liveness กับ Readiness ชัดมากยิ่งขึ้น

ต่อไปลบ Pod ที่ชื่อว่า “pod-probe-http-fail” จากนั้นสร้าง Pod ใหม่ขึ้นมาอีกครั้งตาม YAML ดังนี้

ลองเรียก Pod มาดูอีกครั้งจะพบว่า Pod พร้อมที่จะทำงาน เนื่องจากเราได้แก้ไข Liveness และ Readiness ให้ตรวจสอบผ่านแล้ว

Liveness and Readiness Probe Command

การทำงานจะทำงานคล้ายกันหมดในการตรวจสอบ ต่างกันตรงที่รูปแบบนี้จะใช้ Command ในการตรวจสอบ โดยเราจะยกตัวอย่างเคสที่ตรวจสอบผ่าน และไม่ผ่าน เพื่อให้เห็นภาพการใช้งานมากขึ้น

เมื่อลองเรียก Pod ออกมาดูจะพบว่า Pod ไม่พร้อมใช้งาน

จากนั้นลบ Pod ที่สร้างขึ้นขึ้นมา แล้วสร้างขึ้นใหม่โดยการแก้ไขตาม Config ดังนี้

เมื่อเรียก Pod ออกมาดูก็จะพบว่าพร้อมทำงานแล้ว

Liveness and Readiness Probe TCP Port

จะตรวจสอบในส่วนของ TCP Port ภายใน Container ว่า Allow อยู่หรือไม่ ถ้า Allow ก็จะถือว่าตรวจสอบผ่าน ตามตัวอย่างดังนี้

เรียก Pod ออกมาดู จะพบว่า Pod ไม่พร้อมทำงาน

ทดลองลบ Pod ที่สร้างขึ้น จากนั้นสร้าง Pod ตาม YAML ดังนี้

เมื่อเรียก Pod ออกมาดู ก็จะพบว่า Pod พร้อมใช้งานแล้ว

Rollout

Rollout เป็นเครื่องมือที่เอาไว้จัดการเวอร์ชันของ Deployment เมื่อมีการอัพเดทเวอร์ชันของ Image ภายใน Deployment

โดยประโยชน์ของมันก็คือ หากว่าเราอัพเดทเวอร์ชัน Image ไปแล้วเกิดมีปัญหาเราก็สามารถกลับไปใช้งานเวอร์ชันก่อนหน้านั้นได้ทันที

มาเริ่มกันเลยกับการใช้งาน rollout

ก่อนอื่นสร้าง Deployment ใหม่ขึ้นมาด้วย command ดังนี้

จากนั้นดูรายละเอียดภายในของ Deployment ในส่วนของการใช้งาน Image

จะเห็นว่าตอนนี้ Deployment ใช้ Image “nginx”

จากนั้นให้ใช้ Command ด้านล่าง เพื่อดูประวัติการอัพเดทของ Deployment

จากนั้นทดลองเปลี่ยนเวอร์ชันของ Image ให้กับ Deployment

สามารถดูชื่อ Container ได้ด้วย Command หาดูในส่วนของ Containers

kubectl describe deployment deploy-rollout

จากนั้นเมื่อลองตรวจสอบเวอร์ชันของ Image ดูอีกครั้งจะพบว่า Image ได้เปลี่ยนไปแล้ว

จากนั้นให้ใช้ Command ด้านล่าง เพื่อดูประวัติการอัพเดทของ Deployment

จะพบว่าตอนนี้มีการอัพเดทเวอร์ชันเพิ่มขึ้นมาอีกหนึ่งอัน ซึ่งเราสามารถดูรายละเอียดของแต่ละเวอร์ชันได้ด้วย Command ดังนี้

จากนั้นทดลองอัพเดทเวอร์ชันของ Image อีกครั้ง ตาม Command ด้านล่าง

จากนั้นเรียก Pod ออกมาดู จะพบว่า Pod อยู่ในสถานะ Error

Pod ที่รันอยู่เป็น Pod เก่าซึ่งจะทำลายตัวเองก็ต่อเมื่อมี Podใหม่เกิดขึ้นมา นี่คือเหตุผลว่าทำไม Kubernetes ถึงมี Down Time น้อย

ต่อไปมาดูสถานะของการ rollout ก็จะพบว่า การ rollout ยังไม่สำเร็จ

ต่อไปทดลองการใช้งาน rollout สำหรับการกลับไปใช้งานเวอร์ชันก่อนหน้านี้ด้วย command ดังนี้

ดูสถานะการ rollout อีกครั้งก็จะพบว่าการเปลี่ยนแปลง Image สำเร็จแล้ว

ตรวจสอบการทำงานของ Pod ก็จะกลับมาทำงานปกติ

จากนั้นดูเวอร์ชันของ Image ใน Deployment ก็จะพบว่า ตอนนี้กลับไปใช้งาน Image เวอร์ชันก่อนหน้านี้

หากลองตรวจสอบประวัติการเปลี่ยนแปลงก็จะพบว่าเวอร์ชันที่ 2 หายไป และมี เวอร์ชันที่ 4 เพิ่มมาแทน ส่วนเวอร์ชันที่ 3 ก็จะเป็นเวอร์ชันที่ Image เกิดปัญหา ลองตรวจสอบ Image ในเวอร์ชันที่ 3 และ 4

เราสามารถกลับไปใช้งานเวอร์ชันก่อนได้ด้วยการระบุหมายเลขของ Revision ตาม Command ดังนี้

เมื่อตรวจสอบ Deployment จะพบว่าตอนนี้กลับไปใช้ Image อันแรกสุดที่ใช้ Deploy

สามารถกลับไปใช้เวอร์ชันเก่าตามหมายเลขที่อยู่ในประวัติเท่านั้น

Conclusion

  1. Liveness Probe ใช้ตรวจสอบสถานะของ Contianer ภายใน Pod ว่าทำงานอยู่หรือไม่ ถ้าไม่ทำงาน Liveness จะสั่งให้ Restart Contianer นั้น แล้วตรวจสอบใหม่อีกครั้ง
  2. Readiness Probe ใช้ตรวจสอบความพร้อมทำงานของ Container ภายใน Pod ซึ่งถ้าตรวจสอบแล้วไม่ผ่านก็จะยังไม่ปล่อยให้ Traffic เข้ามายัง Pod เพื่อป้องกันข้อผิดพลาดของระบบที่จะมาใช้งาน Pod ตัวนั้น และจะรอเพื่อตรวจสอบใหม่อีกครั้ง เมื่อตรวจสอบว่าผ่านแล้วก็จะปล่อย Traffic เข้ามายัง Pod
  3. Rollout เป็นเครื่องที่ใช้จัดการเรื่องเวอร์ชันของ Deployment สามารถดูประวัติ รายละเอียดของแต่ละเวอร์ชัน และย้อนกลับไปใช้เวอร์ชันเก่า ๆ ภายในประวัติได้

ก็จบกันไปแล้วนะครับสำหรับ EP นี้ ซึ่งก็เป็น EP สุดท้ายของ Series “Kubernetes Zero-2-Hero” ตอนนี้มีใครเป็นฮีโร่แล้วก็ลอง Comment บอกกันได้เลยนะครับ ส่วนใครงง หรือสงสัยติดปัญหาในตอนไหนก็สามารถ Comment ถามกันเข้ามาได้เลยนะครับ จะพยายามหาคำตอบมาตอบให้ครับผม สำหรับวันนี้ก็ขอขอบคุณสำหรับการติดตามตั้ง EP.1 จนถึง EP นี้ ขอบคุณมากครับ

เพื่อนๆสามารถติดตามกันได้ที่ https://www.facebook.com/sirisoft แล้วพบกันใหม่ ขอบคุณครับ 👋🏻👋🏻👋🏻

--

--