เลือก 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 ที่ยืดหยุ่นกว่า

