รักษาเธอไว้ด้วย Pod Disruption Budget

Patipat Ponyanan
Grean Developers Family
2 min readSep 11, 2018
“white and red first aid case on wall” by rawpixel on Unsplash

สวัสดีครับผมพัทนะครับ วันก่อนทำการอัพเดท k8s ไป ปรากฏว่าขณะที่อัพเดท บาง Application ตายเฉยเลย งงแท้ วันนี้จะมาแชร์ประสบการณ์และวิธีแก้ไข

TLDR
Pod Disruption Budget (PDB) เป็น k8s object ที่สามารถคงจำนวน pod ให้เป็นไปตามที่เราต้องการ เวลาที่เกิดการขับไล่ Pod เกิดขึ้น (kubectl drain node)

ปัญหา

เวลาจะอัพเดทหรือแก้ไข Node เราสามารถรันคำสั่ง kubectl drain <node name> ได้ สิ่งที่เกิดขึ้นคือ k8s จะไล่ pod ไปยัง Node อื่นและติดสถานะยังไม่พร้อมที่จะสร้าง pod ใดๆ ทำให้เราสามารถเข้าไปซนที่ Node ได้เต็มที่ แต่ประเด็นคือขณะที่ k8s drain node ปรากฏว่าบาง Application ของเราไม่สามารถทำงานต่อได้ //ซั่ซ ทำไมวะ // เนื่องจาก App ตัวนั้นมีการทำงานในลักษณะที่เป็น cluster
แล้ว ณ ช่วงเวลาหนึ่งที่ k8s ย้าย pod ของเรานั้น ไอ่ App ตัวนี้มี pod ที่รันอยู่น้อยกว่าจำนวนที่สามารถตายได้ (Failure Tolerance) ทำให้ไม่สามารถคงสถานะของ cluster ต่อได้

ปัญหาที่กล่าวมาสามารถจัดการได้โดย Pod Disruption Budget (pdb)
ซึ่ง pdb จะพยายามคงจำนวน pod ให้เป็นไปตามที่เราต้องการ
ยกตัวอย่างเช่น MongoDB Replication มีจำนวน 3 pod มี 1 master, 2 slaves สามารถตายได้ 1 pod หากตายมากกว่า 1 pod จะไม่สามารถทำงานต่อได้
เราสามารถกำหนด pdb ให้มีรักษาจำนวน pod ที่รันอยู่อย่างน้อย 2 pods ได้ สิ่งที่เกิดขึ้นคือเมื่อ k8s จะย้าย pod จะทำการเช็ค pdb ก่อน ว่าการย้ายครั้งนี้จะทำให้ pod ที่รันอยู่น้อยกว่าที่ตั้งค่าไว้ใน pdb หรือไม่

วิธีการดำเนินงาน

ตัวอย่าง pdb.yaml

apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
name: appbaw-pdb
spec:
selector:
matchLabels:
app: baw
minAvailable: 2
#
maxUnavailable: 2
  • pdb จะติดอยู่ตาม namesapce ไม่ข้าม namesapces
  • pdb จะดู pod ที่มี matchLabels ตรงกันเท่านั้น
  • minAvailable อย่างน้อยต้องมีจำนวน pod เท่านี้ที่รันอยู่ ขณะโดนไลที่
  • maxUnavailable พังมากสุดได้ไม่เกินเท่านี้

เลือกใช้อย่างใดอย่างหนึ่งนะ สองค่านี้สามารถใช้ได้ทั้งจำนวนเต็มบวกและเปอร์เซ็นต์ แต่ Controller ต้องเป็นของ k8s (Deployment, ReplicaSet,StatefulSet)

แล้วถ้าเป็น Pod เปล่าๆ หรือ ไม่ใช่ Controller ของ k8s ล่ะ จะใช้ pdb ได้ไหม !!??
ใช้ได้ แต่จะใช้ maxUnavailableไม่ได้ และ minAvailable จะใช้ได้แค่จำนวนเต็มบวกเท่านั้น

ผลการดำเนินงาน

เราสามารถเช็คสถานะของ pdb ได้โดยการรัน kubectl describe pdb <pdb-name> จะได้อะไรหน้าตาแบบนี้

Name:           appbaw-pdb
Namespace: default
Min available: 2
Selector: app=baw
Status:
Allowed disruptions: 1 ยอมให้พังได้
Current: 3
Desired: 1 ปราถนาแค่นี้ก็เพียงพอแล้ว
Total: 3
Events: <none>

สรุป

pdb ช่วยให้เราสามารถควบคุมจำนวน pod ในระหว่างที่เกิดการขับไล่ออกจาก Node ได้ (eviction) สิ่งที่เกิดขึ้นคือเราสามารถเข้าไปแก้ไขหรืออัพเดทเวอร์ชั่นของ Node ได้ โดยที่ App ของเรายังสามารถทำงานต่อได้ ไม่มี downtime
pdb สามารถป้องกันได้แค่การที่ pod โดนขับไล่เท่านั้น ไม่สามารถป้องกันกรณีที่ Node ตาย, Datacenter ระเบิดได้ กรณีพวกนี้สิ่งที่ทำได้อย่างเดียวคือทำใจครับ
แฮ่ ล้อเล่น เราสามารถเพิ่มความมั่นใจได้โดยการกระจาย pod ออกไปหลายๆ Node หลายๆ Datacenter เอาครับ

--

--