ข้ามไปเนื้อหาหลัก
คอนเทนเนอร์· ~13 นาที· อัปเดตล่าสุด

เลือก node ให้ Pod: nodeSelector และ Affinity

บังคับ/แนะนำว่า Pod ควรไปอยู่ node แบบไหน

พื้นฐานที่ควรรู้: ในคลัสเตอร์ไม่ได้มีคอมพิวเตอร์ (Node) แบบเดียว บางเครื่องอาจมีชิปประมวลผลกราฟิก (GPU) ที่เหมาะกับงาน AI หรือเราอาจจะอยากให้แอปพลิเคชันตัวนึงอยู่คนละเซิร์ฟเวอร์กับอีกตัวนึง เพื่อที่เวลาเซิร์ฟเวอร์นึงล่ม อีกตัวจะได้ยังทำงานรอด

จัดที่นั่งงานเลี้ยง

เหมือนจัดที่นั่งงานเลี้ยง: nodeSelector = กฎง่าย ๆ "ต้องนั่งโซนที่มีป้าย VIP" · affinity = กฎละเอียด "อยากนั่งใกล้ทีมเดียวกัน (affinity) แต่แยกจากคู่แข่ง (anti-affinity)"

ปกติ scheduler เลือก node ให้เอง แต่บางครั้งเราต้องชี้นำ เช่น "Pod นี้ต้องรันบน node ที่มี GPU" หรือ "กระจาย replica ไปคนละ node เพื่อ HA"

  • nodeSelector — จับคู่ label ของ node ง่าย ๆ (เช่น disktype: ssd) แบบบังคับ
  • nodeAffinity — เหมือน nodeSelector แต่ยืดหยุ่นกว่า มีทั้งแบบบังคับ (required) และแบบแนะนำ (preferred)
  • podAffinity — อยากให้ Pod อยู่ใกล้ Pod อื่น (เช่น cache อยู่ node เดียวกับ app)
  • podAntiAffinity — อยากให้ Pod แยกจากกัน (เช่น กระจาย 3 replica คนละ node เพื่อทน node ล่ม)

สรุป Key Takeaways

  • nodeSelector = จับ label node ง่าย ๆ · nodeAffinity = ยืดหยุ่นกว่า (required/preferred)
  • podAffinity = อยู่ใกล้กัน · podAntiAffinity = แยกจากกัน (ใช้ทำ HA)
  • กระจาย replica ข้าม node/zone ด้วย anti-affinity หรือ topologySpreadConstraints

คำถามที่พบบ่อย

nodeSelector กับ node affinity ต่างกันยังไง

nodeSelector = จับคู่ label แบบเท่ากันเป๊ะ เงื่อนไขเดียว ง่ายสุด ส่วน node affinity = เงื่อนไขซับซ้อนได้ (In/NotIn/Exists) และเลือกได้ว่า "บังคับ" (required) หรือ "ถ้าได้ก็ดี" (preferred) — เริ่มจาก nodeSelector ก่อน ย้ายไป affinity เมื่อเงื่อนไขไม่พอ

pod affinity / anti-affinity ใช้ทำอะไรในงานจริง

ตัวฮิตคือ anti-affinity: บังคับ replica ของแอปเดียวกัน "แยกเครื่อง/แยกโซน" กัน — เครื่องเดียวดับไม่พาแอปดับหมด (ใช้ topologyKey เป็น hostname หรือ zone) ส่วน affinity ใช้ดึงแอปที่คุยกันบ่อยไปอยู่ใกล้กันลด latency — ปัจจุบันการกระจายโซนนิยมใช้ topologySpreadConstraints ที่ยืดหยุ่นกว่า

อ่านจบแล้วอย่าลืมทำเครื่องหมาย