ยินดีต้อนรับสู่ วันที่ 6: Deployments, Rolling Updates และการ Rollback!
วันนี้เราจะมาเรียนรู้กลไกการอัปเดตแอปพลิเคชันแบบไม่สะดุด (Zero-Downtime Deployment) การทำ Rolling Update เพื่อเปลี่ยนเวอร์ชันคอนเทนเนอร์ และวิธีสั่งย้อนกลับ (Rollback) เมื่อเกิดปัญหาระหว่างการอัปเดตครับ
ช่วงที่ 1: สรุปแนวคิดสถาปัตยกรรม
เข้าใจความสัมพันธ์ระหว่าง Deployments & ReplicaSets, กลยุทธ์ Rolling Update และระบบบันทึก Revision สำหรับ Rollback
ช่วงที่ 2: การลงมือปฏิบัติจริง (5 ขั้นตอน)
สร้าง Nginx 4 replicas สั่งเปลี่ยนเวอร์ชัน สังเกต ReplicaSet บน Headlamp UI จำลอง Tag เสีย และสั่ง Undo Rollback
สรุปแนวคิดและสถาปัตยกรรม (5–10 นาที)
Deployments & ReplicaSets
Deployment ไม่ได้สร้าง Pod โดยตรง แต่มันจะควบคุม ReplicaSet อีกชั้นหนึ่ง ซึ่งเป็นตัวควบคุมจำนวน Pods จริงให้ครบตามเป้าหมาย (Desired Replicas)
Rolling Update Strategy
เมื่อเปลี่ยน Image คอนฟิก ตัว Deployment จะสร้าง ReplicaSet ใหม่ขึ้นมา ค่อยๆ สร้าง Pod เวอร์ชันใหม่ และค่อยๆ ปิด Pod เก่าลงตามค่า maxSurge / maxUnavailable ทำให้บริการไม่ล่ม
Rollback (การกู้คืนระบบ)
หากเวอร์ชันใหม่มีปัญหา (เช่น Image พัง หรือ Exception) Pod เก่ายังคงทำงานรองรับผู้ใช้อยู่บางส่วน เราจึงสั่ง Rollback ย้อนกลับไปยัง Revision ก่อนหน้าที่สมบูรณ์ได้อย่างปลอดภัยทันที
kubectl rollout undo
ขั้นตอนลงมือปฏิบัติจริง (15–20 นาที)
เปิด Terminal แล้วสร้าง Deployment ที่ใช้ Nginx เวอร์ชัน 1.21 จำนวน 4 replicas เพื่อเป็นเวอร์ชันฐาน:
kubectl create deployment web-app --image=nginx:1.21 --replicas=4
deployment.apps/web-app created และ Pod ทั้ง 4 ตัวจะเริ่มทำงาน
อัปเดต Image ของคอนเทนเนอร์จาก nginx:1.21 เป็น nginx:1.25 ผ่านคำสั่ง set image:
kubectl set image deployment/web-app nginx=nginx:1.25
เปิด Headlamp UI เพื่อดูการสลับเปลี่ยน ReplicaSet และการทยอยสร้าง Pod แบบกราฟิก:
- เปิด Headlamp UI ขึ้นมา (ผ่าน http://localhost:8080 หรือ Headlamp Desktop)
- ไปที่เมนูด้านซ้าย Workloads > Deployments แล้วคลิกเข้าดูรายละเอียดของ web-app
- สังเกตในส่วน ReplicaSets: คุณจะเห็น ReplicaSet เก่าค่อยๆ Scale Down (ลดจำนวนลง) และ ReplicaSet ใหม่กำลัง Scale Up (เพิ่มจำนวนขึ้นมาแทนที่) อย่างเป็นลำดับจนครบ 4 ตัว
สั่งอัปเดต Image ไปยัง Tag ที่ไม่มีอยู่จริง (nginx:badtag) เพื่อจำลองความผิดพลาดของระบบ:
kubectl set image deployment/web-app nginx=nginx:badtag
กลับมาดูที่ Headlamp UI: สังเกตว่ากระบวนการ Rollout จะชะงักลง โดย Pods ใหม่จะติดสถานะ ImagePullBackOff แต่ Pods เวอร์ชันเดิม (nginx:1.25) ยังคงทำงานเพื่อให้บริการอยู่ ระบบจะไม่ปิด Pod เก่าจนกว่า Pod ใหม่จะพร้อมใช้งาน
ยกเลิกการอัปเดตที่มีปัญหาและถอยกลับไปเวอร์ชันล่าสุดที่ทำงานได้สมบูรณ์:
kubectl rollout undo deployment/web-app
kubectl rollout status deployment/web-app
deployment.apps/web-app successfully rolled out และสถานะ Pods ทั้งหมดบน Headlamp UI จะกลับมาเป็นสีเขียว Running ครบทั้ง 4 Replicas ตามปกติ
ลองทดสอบสั่ง Rolling Update และสั่ง Rollback ดูนะครับ หากสังเกตเห็นการทำงานของ ReplicaSet บน Headlamp UI เรียบร้อยแล้ว แจ้งได้เลยครับ!