Taints และ Tolerations — กัน Pod ออกจาก node
ทำเครื่องหมาย node ให้รับเฉพาะ Pod ที่ได้รับอนุญาต
พื้นฐานที่ควรรู้: ในทางกลับกันกับ Affinity (ที่ Pod เป็นคนเลือก Node) บางครั้ง "Node" เองนั่นแหละที่เป็นคนบอกว่า "ฉันไม่รับแอปทั่วไปนะ รับเฉพาะแอปพิเศษเท่านั้น" เช่น Node ที่เป็น Control Plane ควรจะรันเฉพาะระบบของ K8s เอง ไม่ควรเอาแอปพลิเคชันทั่วไปมารันให้กวนใจ
Taint เหมือนป้าย "ห้ามเข้า เว้นแต่มีบัตรผ่าน" ที่ติดบน node · Toleration คือบัตรผ่านที่ Pod ถือมา · Pod ที่ไม่มีบัตรตรงกับป้ายจะไม่ถูกวางบน node นั้น
Affinity คือ Pod "เลือก" node · Taint/Toleration ทำกลับกัน — node "ผลัก" Pod ออก เว้นแต่ Pod จะ tolerate ได้ · ใช้กันงานทั่วไปออกจาก node พิเศษ
node ที่ taint รับเฉพาะ Pod ที่มี toleration ตรงกัน
# ติด taint: node นี้รับเฉพาะ Pod ที่ tolerate gpu=true
kubectl taint nodes node-1 gpu=true:NoSchedule
# Pod ที่จะขึ้น node นี้ได้ต้องมี toleration:
# tolerations:
# - key: "gpu"
# operator: "Equal"
# value: "true"
# effect: "NoSchedule"สรุป Key Takeaways
- Taint = node ผลัก Pod ออก · Toleration = บัตรผ่านที่ Pod ถือ
- ตรงข้ามกับ affinity (Pod เลือก node) — taint คือ node กัน Pod
- effect: NoSchedule/PreferNoSchedule/NoExecute · มักคู่กับ affinity สงวน node พิเศษ
คำถามที่พบบ่อย
Taint/toleration ต่างจาก affinity ยังไง จำง่ายๆ
มุมกลับกัน: affinity = pod "เลือก" เครื่อง ส่วน taint = เครื่อง "ปฏิเสธ" pod (ยกเว้นตัวที่มี toleration) — ใช้คู่กันเมื่ออยากกันเครื่องไว้เฉพาะงาน: taint กันทุกคนออก + affinity/nodeSelector ดึงงานเป้าหมายเข้า (เช่น เครื่อง GPU ให้เฉพาะงาน ML)
NoSchedule, PreferNoSchedule, NoExecute ต่างกันยังไง
NoSchedule = pod ใหม่ห้ามลง (ตัวเก่าอยู่ต่อได้) · PreferNoSchedule = เลี่ยงถ้าเลี่ยงได้ · NoExecute = แรงสุด — pod ที่ไม่มี toleration โดน "ไล่ออก" จากเครื่องด้วย — K8s เองใช้ NoExecute อัตโนมัติตอน node มีปัญหา (not-ready) เพื่อย้าย pod หนี

