0

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=gpu là nhãn của Taint.
  • NoSchedule nghĩ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 đó.
  • NoSchedule ngăn Pod mới.
  • PreferNoSchedule chỉ mang tính ưu tiên.
  • NoExecute cò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

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí