Email Doanh NghiệpSSLFirewall Anti DDoS

NỘI DUNG

Banner blog lễ 30.4 và 1.5

Tổng quan về Taints và Tolerations trong Kubernetes

Hưng Nguyễn

Đã kiểm duyệt nội dung

Ngày đăng:28/04/2026
Lượt xem

Quy trình sản xuất nội dung

Đánh giá

[esi kkstarratings cache="private" ttl="3"]

Taints và Tolerations là một cơ chế lập lịch nâng cao trong Kubernetes, được sử dụng để kiểm soát việc Pod có được phép chạy trên một node cụ thể hay không. Nội dung bài viết được mình tổng hợp từ quá trình trực tiếp xử lý các case Pod Pending, OOMKilled và tối ưu lập lịch cho nhiều hệ thống Kubernetes thực tế cho khách hàng, nên trọng tâm sẽ là cách cấu hình chuẩn xác, các lỗi thường gặp và tình huống thực tiễn giúp bạn áp dụng ngay vào hệ thống, đảm bảo cluster luôn vận hành ở trạng thái ổn định nhất.

Những điểm chính

  • Quan điểm của mình: : Nếu ví Node như một căn phòng, thì Taints chính là “ổ khóa” gắn trên cửa để ngăn người lạ, còn Tolerations là “chìa khóa” cấp riêng cho các Pod phù hợp. Hiểu đúng bản chất này sẽ giúp bạn giải quyết 90% các bài toán phân bổ tài nguyên khó nhằn trong Kubernetes.
  • Khái niệm Taints: Hiểu rõ Taints là một thuộc tính “đẩy lùi”, giúp bạn nhận biết vai trò của nó trong việc ngăn các Pod không mong muốn chạy trên các node cụ thể.
  • Khái niệm Tolerations: Nắm được Tolerations là một thuộc tính “cho phép”, giúp bạn hiểu rõ cách nó cho phép các Pod cụ thể được lên lịch trên các node đã bị taint.
  • Cách thức hoạt động: Nắm vững cơ chế phối hợp, giúp bạn hiểu rõ cách Taints và Tolerations cùng nhau tạo ra một quy tắc lập lịch mạnh mẽ để kiểm soát vị trí triển khai Pod.
  • Cách quản lý Taints: Nắm vững các lệnh kubectl để thêm, xóa và kiểm tra taints, giúp bạn dễ dàng quản lý và áp dụng các chính sách ràng buộc trên node.
  • Cách khai báo Tolerations: Nắm vững cách khai báo tolerations trong file manifest, giúp bạn cho phép các Pod cụ thể được triển khai trên các node đã được dành riêng.
  • Trường hợp sử dụng: Nhận biết các trường hợp sử dụng phổ biến, giúp bạn áp dụng Taints và Tolerations một cách hiệu quả để dành riêng node cho các workload đặc thù, tăng cường bảo mật và xử lý các node không ổn định.
  • Giới thịệu Vietnix: Biết đến Vietnix là nhà cung cấp Cloud Server mạnh mẽ, giúp bạn có một nền tảng hạ tầng đáng tin cậy để triển khai mọi chiến lược lập lịch Kubernetes.
  • Câu hỏi thường gặp: Giải đáp các thắc mắc liên quan đến Taints và Tolerations.
những điểm chính

Taints là gì?

Taints trong Kubernetes là thuộc tính gắn trên node, dùng để đánh dấu rằng node chỉ chấp nhận những Pod có toleration phù hợp, các Pod không chịu được taint đó sẽ không được scheduler đưa lên node. Cơ chế này cho phép “đẩy” Pod không phù hợp tránh xa các node dành riêng cho workload đặc thù, node control plane hoặc node đang gặp vấn đề.

Một Node có thể được gán nhiều Taint khác nhau. Mỗi Taint thường được biểu diễn dưới dạng key=value:effect và bao gồm ba thành phần chính:

  • Key: Tên định danh cho Taint.
  • Value: Giá trị của Taint, kết hợp với Key để tạo ra một định danh cụ thể.
  • Effect: Hiệu ứng sẽ xảy ra với các Pod không có Toleration tương ứng.
Taints là thuộc tính gắn trên node, chỉ cho phép Pod có toleration phù hợp được scheduler đặt lên node
Taints là thuộc tính gắn trên node, chỉ cho phép Pod có toleration phù hợp được scheduler đặt lên node

Taint có 3 loại Effect chính để quyết định hành vi của scheduler:

  • NoSchedule: Đây là hiệu ứng phổ biến nhất, ngăn không cho các Pod mới được lên lịch trên Node nếu chúng không có Toleration phù hợp.Tuy nhiên, các Pod đang chạy sẵn trên Node sẽ không bị ảnh hưởng.
  • PreferNoSchedule: Đây là một phiên bản “mềm” hơn của NoSchedule. Scheduler sẽ cố gắng không xếp lịch Pod không có Toleration lên Node này, nhưng nếu không còn lựa chọn nào khác, Pod vẫn có thể được xếp lịch tại đây.
  • NoExecute: Đây là hiệu ứng mạnh nhất. Không chỉ ngăn các Pod mới mà NoExecute còn ngay lập tức “xua đuổi” các Pod đang chạy trên Node nếu chúng không có Toleration tương ứng.

Để quản lý các workload chuyên biệt trong Kubernetes hiệu quả, một hạ tầng mạnh mẽ và linh hoạt là yếu tố nền tảng. Giải pháp Enterprise Cloud của Vietnix cung cấp một cụm tài nguyên độc lập với CPU AMD EPYC và ổ cứng NVMe Enterprise hiệu năng cao, là môi trường lý tưởng để vận hành các cụm Kubernetes đòi hỏi khắt khe, đảm bảo hiệu suất và độ ổn định vượt trội.

Tolerations là gì?

Tolerations trong Kubernetes là thuộc tính khai báo trong Pod spec, cho phép Pod đó có thể được lập lịch trên một Node có Taint tương ứng. Vai trò chính của tolerations là mở quyền cho Pod chạy trên các node đã bị taint, trong khi các Pod không có toleration tương ứng sẽ bị taints “đẩy” ra khỏi danh sách node phù hợp.

Tolerations được định nghĩa trong trường spec.tolerations của Pod/Deployment, mỗi phần tử gồm các thuộc tính như key, operator, value, effect và với NoExecute có thể thêm tolerationSeconds. Một toleration khớp với taint khi key, effect (và value với operator phù hợp như Equal hoặc Exists) tương ứng, từ đó Pod có thể được phép đặt lên node chứa taint đó hoặc không bị đuổi khi node áp dụng NoExecute.

Tolerations là thuộc tính trong Pod spec, cho phép Pod được scheduler đặt lên node có taints tương ứng
Tolerations là thuộc tính trong Pod spec, cho phép Pod được scheduler đặt lên node có taints tương ứng

Tuy nhiên, việc Pod có toleration chỉ nghĩa là Pod được phép chạy trên node có taint tương ứng, chứ không bắt buộc scheduler phải chọn node đó. Việc node nào được chọn cuối cùng vẫn phụ thuộc vào các cơ chế scheduling khác như node selector, affinity, tài nguyên khả dụng và chính sách lập lịch tổng thể của cluster.

Cách Taints và Tolerations hoạt động cùng nhau

Taints và Tolerations phối hợp với nhau để đảm bảo các Pod không bị lập lịch vào những Node không phù hợp. Quá trình này diễn ra như như sau:

  • Khi một Pod được tạo, Kubernetes scheduler sẽ kiểm tra các Taint trên tất cả các Node khả dụng.
  • Scheduler sau đó đối chiếu các Taint này với danh sách Tolerations được định nghĩa trong Pod.
    • Nếu Node không có Taint: Bất kỳ Pod nào cũng có thể nhảy vào (trừ khi có các ràng buộc khác như Node Affinity).
    • Nếu Node có Taint:
      • Khớp: Nếu Pod có Toleration trùng khớp với key, value và effect của Taint thì Pod có thể được lập lịch tại đây.
      • Không khớp: Nếu Pod không có Toleration hoặc thông tin không khớp thì Pod bị chặn đứng ngay lập tức.

Đối với taint NoSchedule, Pod không có toleration sẽ không được đặt mới lên node. Với PreferNoSchedule, scheduler cố gắng tránh node đó nhưng vẫn có thể chọn nếu không còn lựa chọn. Với NoExecute, Pod hiện có trên node mà không có toleration phù hợp có thể bị đuổi và Pod mới cũng không được đặt lên node đó.

Liệt kê taints hiện có trên node

Bước đầu tiên là kiểm tra node đang có những taints nào trước khi thêm hoặc xóa. Bạn có thể dùng lệnh:

kubectl describe node <node-name>

Mặc định trường Taints là <node-name>
Taints: <none>

Trong output, phần Taints: sẽ hiển thị danh sách các taints dưới dạng key=value:effect. Nếu cần xem ở dạng YAML để dễ xử lý tự động, bạn có thể dùng:

kubectl get node <node-name> -o yaml

Trường spec.taints trong YAML sẽ liệt kê chi tiết từng taint với đủ key, valueeffect.

Thêm taint cho node

Sau khi nắm được trạng thái hiện tại, bạn có thể thêm taint mới lên node để kiểm soát Pod được phép chạy trên đó. Cú pháp tổng quát:

kubectl taint nodes <node-name> key=value:effect

Trong đó effect là một trong 3 loại: NoSchedule, PreferNoSchedule hoặc NoExecute. Ví dụ, để dành riêng node node1 cho các workload frontend:

kubectl taint nodes node1 dedicated=frontend:NoSchedule

Bây giờ node 1 sẽ có:

Taints: dedicated=frontend:NoSchedule

Lệnh này gắn taint dedicated=frontend:NoSchedule lên node node1, khiến mọi Pod không có toleration khớp với taint này bị loại ra khỏi danh sách node ứng viên khi scheduler lập lịch.

Lỗi thường gặp: Rất nhiều bạn viết sai chính tả phần Effect (ví dụ viết thường Noschedule thay vì đúng chuẩn NoSchedule – viết hoa chữ N và S). Kubernetes phân biệt chữ hoa chữ thường rất nghiêm ngặt, lỗi này sẽ khiến hệ thống từ chối lệnh của bạn ngay lập tức.

Xóa hoặc cập nhật taint trên node

Khi cần gỡ bỏ một taint đang áp dụng, bạn sử dụng lại cú pháp kubectl taint nhưng thêm dấu – ở cuối effect. Cú pháp tổng quát:

kubectl taint nodes <node-name> key=value:effect-

Lệnh này tìm taint có key=dedicated, value=frontend, effect=NoSchedule trên node node1 và gỡ bỏ taint đó, đưa node trở lại trạng thái không bị hạn chế bởi taint này. Trường hợp cần “cập nhật” taint (thay đổi effect hoặc value), quy trình chuẩn là xóa taint cũ bằng cú pháp có dấu -, sau đó thêm taint mới với cấu hình mong muốn bằng lệnh kubectl taint tương ứng.

Mẹo từ chuyên gia: Kubernetes không có lệnh “update taint” trực tiếp. Nếu bạn muốn thay đổi value hoặc effect của một Taint đang tồn tại, quy trình bắt buộc là: Gỡ bỏ Taint cũ (bằng dấu -), sau đó chạy lệnh thêm Taint mới.

Khai báo Tolerations trong Pod/Deployment

Khai báo Tolerations trong Pod hoặc Deployment được thực hiện trực tiếp trong manifest, giúp Pod có thể được scheduler xem xét đặt lên các node đã gắn taints tương ứng. Trường tolerations nằm trong spec của Pod (hoặc template.spec với Deployment), cho phép định nghĩa danh sách các điều kiện mà Pod có thể “chịu được” khi gặp taints trên node.

Một phần tử toleration điển hình gồm các trường key, operator, value, effect và tùy chọn tolerationSeconds (đối với NoExecute). Dưới đây là ví dụ về một Pod có khai báo Toleration để có thể chạy trên node1 đã bị Taint ở ví dụ trên:

apiVersion: v1
kind: Pod
metadata:
  name: my-gpu-pod
spec:
  containers:
  - name: my-container
    image: nginx
  tolerations:
  - key: "gpu"
    operator: "Equal"
    value: "true"
    effect: "NoSchedule"

Trong cấu hình này, Pod được phép đặt lên Node node1 vì thông tin key, value và effect hoàn toàn trùng khớp với Taint.

Lỗi thường gặp: Nếu bạn sử dụng trường value, bạn bắt buộc phải để operator là “Equal” (hoặc để trống vì Equal là mặc định). Tuy nhiên, nếu bạn muốn Pod chấp nhận mọi Value của Key dedicated, bạn phải đổi operator thành “Exists” và xóa bỏ dòng value. Việc khai báo cả operator: “Exists” và value sẽ gây ra lỗi parse file YAML.

Đối với taints NoExecute, có thể thêm tolerationSeconds để chỉ định thời gian Pod tiếp tục ở lại node sau khi taint được áp dụng, ví dụ:

spec:
  tolerations:
    - key: "node.kubernetes.io/not-ready"
      operator: "Exists"
      effect: "NoExecute"
      tolerationSeconds: 300

Cấu hình này cho phép Pod ở lại tối đa 300 giây trên node bị taint node.kubernetes.io/not-ready:NoExecute trước khi bị evict. Trong Deployment, phần tolerations được đặt trong spec.template.spec, giúp tất cả Pod do Deployment tạo ra đều có cùng tập tolerations này.

Các trường hợp sử dụng Taints và Tolerations trong thực tế thường xoay quanh việc phân tách workload, bảo vệ node quan trọng và xử lý node gặp sự cố.

Dành riêng node cho workload đặc thù

Một kịch bản phổ biến là gắn taint lên nhóm node dành riêng cho một loại workload, team hoặc môi trường (ví dụ dedicated=frontend:NoSchedule), sau đó chỉ các Pod thuộc nhóm đó mới được khai báo tolerations tương ứng. Cách cấu hình này giúp đảm bảo Pod của team hoặc tier cụ thể không bị scheduler đưa sang các node khác ngoài vùng tài nguyên đã định.

Ngăn pod người dùng chạy trên node control-plane

Mặc định, các node control-plane thường được taint với các giá trị như node-role.kubernetes.io/control-plane:NoSchedule hoặc node-role.kubernetes.io/master:NoSchedule để Pod thông thường không được đặt lên đó. Chỉ những Pod hệ thống hoặc Pod đặc biệt có tolerations tương ứng mới được phép chạy trên node control-plane, giúp giữ cho thành phần điều khiển của cluster không bị chiếm tài nguyên bởi workload người dùng.

Tách node với phần cứng đặc biệt

Đối với node có GPU, storage chuyên dụng hoặc phần cứng đặc biệt, bạn có thể gắn taint như gpu=true:NoSchedule hoặc storage=high-iops:NoSchedule để ngăn Pod thông thường lên lịch trên các node này. Các Pod cần sử dụng GPU hoặc storage đặc biệt sẽ được cấu hình tolerations tương ứng, nhờ đó tài nguyên chuyên dụng chỉ phục vụ đúng nhóm workload yêu cầu.

Xử lý node lỗi, không ổn định

Khi node mất kết nối hoặc không sẵn sàng, Kubernetes có thể tự động gắn các taint như node.kubernetes.io/not-ready:NoExecute hoặc node.kubernetes.io/unreachable:NoExecute. Các Pod không có toleration phù hợp cho những taint này sẽ bị evict khỏi node và scheduler sẽ tìm node khác để đặt Pod, giúp duy trì tính sẵn sàng của ứng dụng. Với tolerationSeconds, có thể cho phép một số Pod ở lại node thêm một khoảng thời gian trước khi bị đuổi, phục vụ các kịch bản chịu lỗi linh hoạt hơn.

Cách Taints và Tolerations hoạt động cùng nhau
Cách Taints và Tolerations hoạt động cùng nhau

Vietnix – Nền tảng Cloud Server cho mọi chiến lược lập lịch Kubernetes

Việc quản lý các workload phức tạp trên Kubernetes đòi hỏi một nền tảng hạ tầng ổn định và linh hoạt. Enterprise Cloud của Vietnix được thiết kế để đáp ứng chính xác nhu cầu này, cung cấp một cụm tài nguyên độc lập với CPU AMD EPYC và ổ cứng 100% NVMe Enterprise, đảm bảo hiệu năng cao nhất. Doanh nghiệp có thể tự chủ hoàn toàn trong việc khởi tạo, quản lý và tùy chỉnh hàng loạt Cloud Server, tích hợp dễ dàng với các quy trình DevOpsCI/CD thông qua API, giúp tối ưu hóa vận hành và tăng tốc đổi mới.

Thông tin liên hệ:

  • Website: https://vietnix.vn/
  • Hotline: 1800 1093
  • Email: sales@vietnix.com.vn
  • Địa chỉ: 265 Hồng Lạc, Phường Bảy Hiền, Thành Phố Hồ Chí Minh

Câu hỏi thường gặp

Làm thế nào để một Toleration khớp (match) với một Taint?

Một Toleration khớp với một Taint khi key và effect của chúng giống nhau và operator được thỏa mãn.
– Nếu operator là Equal (mặc định), value của Toleration phải bằng value của Taint.
– Nếu operator là Exists, Toleration sẽ khớp với bất kỳ Taint nào có cùng key và effect, không quan tâm đến value.

Tại sao các node control-plane thường được taint mặc định?

Các node control-plane thường được taint để ngăn các Pod ứng dụng thông thường của người dùng được lên lịch trên chúng, giúp dành riêng tài nguyên của control-plane cho các thành phần hệ thống quan trọng của Kubernetes, đảm bảo sự ổn định và hiệu suất của toàn bộ cluster.

Tolerations có đảm bảo rằng một Pod sẽ được lên lịch trên một node có Taint phù hợp không?

Không, Tolerations không đảm bảo điều đó. Tolerations chỉ cho phép một Pod có thể được lên lịch trên một node có Taint phù hợp. Việc Pod có thực sự được lên lịch trên node đó hay không còn phụ thuộc vào các yếu-tố khác như yêu cầu tài nguyên, Node Selector và Node Affinity.

Taints và Tolerations là một cơ chế lập lịch trong Kubernetes, cung cấp khả năng kiểm soát chi tiết việc phân bổ Pod trên các node. Việc hiểu và áp dụng hiệu quả cơ chế Taints và Tolerations, kết hợp với các công cụ lập lịch khác, là chìa khóa để xây dựng một kiến trúc Kubernetes linh hoạt, có khả năng phục hồi cao và được tối ưu hóa.

THEO DÕI VÀ CẬP NHẬT CHỦ ĐỀ BẠN QUAN TÂM

Đăng ký ngay để nhận những thông tin mới nhất từ blog của chúng tôi. Đừng bỏ lỡ cơ hội truy cập kiến thức và tin tức hàng ngày

Đánh giá mức độ hữu ích của bài viết

icon 1 sao

Thất vọng

icon 2 sao

Chưa hữu ích

icon 3 sao

Bình thường

icon 4 sao

Hữu ích

icon 5 sao

Rất hữu ích

Hưng Nguyễn

Co-Founder
tại

Kết nối với mình qua

Kết nối với mình qua

Theo dõi
Thông báo của
guest
0 Comments
Phản hồi nội tuyến
Xem tất cả bình luận

kien-thuc-dich-vu

kien-thuc-kubernetes

text
icon popup single post

CẢM ƠN BẠN ĐÃ ĐÁNH GIÁ BÀI VIẾT

Vietnix sẽ luôn cố gắng cải thiện chất lượng dịch vụ mỗi ngày

ĐÓNG

Đánh giá mức độ hữu ích của bài viết

icon 1 sao

Thất vọng

icon 2 sao

Chưa hữu ích

icon 3 sao

Bình thường

icon 4 sao

Hữu ích

icon 5 sao

Rất hữu ích

Icon
ĐĂNG KÝ NHẬN TÀI LIỆU THÀNH CÔNG
Cảm ơn bạn đã đăng ký nhận tài liệu mới nhất từ Vietnix!
ĐÓNG

ĐĂNG KÝ DÙNG THỬ HOSTING

Asset

7 NGÀY MIỄN PHÍ

Asset 1

ĐĂNG KÝ DÙNG THỬ HOSTING

Asset

7 NGÀY MIỄN PHÍ

Asset 1
Icon
XÁC NHẬN ĐĂNG KÝ DÙNG THỬ THÀNH CÔNG
Cảm ơn bạn đã đăng ký thông tin thành công. Đội ngũ CSKH sẽ liên hệ trực tiếp để kích hoạt dịch vụ cho bạn nhanh nhất!
ĐÓNG