Bài 19. Taints và Tolerations - Cách "đuổi" Pod khỏi Node
"Nếu NodeSelector và Affinity giúp chọn nơi Pod nên chạy, thì Taints và Tolerations lại giúp quyết định Pod nào không được phép chạy trên một Node."
Một tình huống thực tế
Hãy tưởng tượng bạn có một cụm Kubernetes gồm 4 Node:
- 🖥️ 3 Node dùng để chạy ứng dụng.
- 🚀 1 Node rất mạnh, có GPU để chạy AI.
Nếu không làm gì, Kubernetes có thể đặt bất kỳ Pod nào lên Node GPU, kể cả những ứng dụng web thông thường.
Kết quả là tài nguyên đắt tiền bị lãng phí.
Bạn cần một cách để nói với Kubernetes:
"Node này là khu vực đặc biệt. Đừng cho Pod vào đây, trừ khi tôi cho phép."
Đó chính là lúc Taints xuất hiện.
1. Taint là gì?
Taint giống như một biển cấm gắn trên Node.
Ví dụ:
🚫 "Không được vào nếu không có giấy phép."
Khi một Node có Taint, Kubernetes sẽ từ chối hầu hết các Pod muốn chạy trên Node đó.
Ví dụ:
Node A
🚫 Chỉ Pod được cho phép mới được vào
2. Toleration là gì?
Nếu Taint là biển cấm, thì Toleration giống như giấy phép đặc biệt.
Pod nào có Toleration phù hợp sẽ được phép chạy trên Node đã gắn Taint.
Node (Có Taint)
▲
│
Pod có Toleration
│
✅ Được phép chạy
Pod không có Toleration?
➡️ Kubernetes sẽ tìm Node khác.
Ví dụ dễ hiểu
Giả sử bạn gắn Taint cho Node GPU:
kubectl taint nodes gpu-node dedicated=gpu:NoSchedule
Ý nghĩa:
dedicated=gpulà nhãn của Taint.NoSchedulenghĩa là không cho Pod mới chạy lên Node này.
Nếu một Pod muốn sử dụng GPU, bạn thêm Toleration:
tolerations:
- key: dedicated
operator: Equal
value: gpu
effect: NoSchedule
Bây giờ Pod đó có thể chạy trên Node GPU.
3. Ba loại Taint phổ biến
1. NoSchedule
Không cho Pod mới chạy lên Node.
Đây là loại được sử dụng nhiều nhất.
2. PreferNoSchedule
Kubernetes cố gắng tránh Node này, nhưng nếu không còn lựa chọn thì vẫn có thể đặt Pod vào.
3. NoExecute
Mạnh nhất.
Không chỉ ngăn Pod mới, mà còn đuổi luôn các Pod đang chạy nếu chúng không có Toleration.
Khi nào nên dùng?
Taints và Tolerations thường được dùng để:
- Dành riêng Node GPU cho các ứng dụng AI.
- Dành Node SSD cho Database.
- Cô lập Node chạy hệ thống Monitoring hoặc Logging.
- Bảo trì Node mà không muốn Pod mới được tạo trên đó.
Hãy nhớ điều này
NodeSelector/Affinity
"Tôi muốn Pod chạy ở đây."
Taints/Tolerations
"Tôi không muốn Pod chạy ở đây."
Một bên là thu hút, một bên là ngăn cản.
Đó là lý do chúng thường được sử dụng cùng nhau trong các hệ thống Kubernetes thực tế.
Tổng kết
- Taint là "biển cấm" gắn lên Node.
- Toleration là "giấy phép" để Pod được phép vào Node đó.
NoSchedulengăn Pod mới.PreferNoSchedulechỉ mang tính ưu tiên.NoExecutecòn có thể đuổi Pod đang chạy.
💡 Ở bài tiếp theo, chúng ta sẽ chuyển sang một chủ đề khác nhưng rất quan trọng trong môi trường nhiều nhóm cùng sử dụng một Cluster: Namespace – cách chia Kubernetes thành nhiều "không gian" độc lập để quản lý dễ dàng hơn.
All rights reserved