Cách khắc phục lỗi lập lịch Pod: 0/1 nodes are available: 1 node(s) had taint {key: value}, that the pod didn't tolerate

beginner☸️ Kubernetes2026-07-01| Kubernetes (Tất cả phiên bản), Linux/Cloud-based clusters (EKS, GKE, AKS, self-managed)

Error Message

0/1 nodes are available: 1 node(s) had taint {key: value}, that the pod didn't tolerate.
#kubernetes#scheduling#taints#tolerations

Vấn đề: Pod bị kẹt ở trạng thái PendingBạn vừa triển khai một ứng dụng mới lên cụm Kubernetes. Mọi thứ trông có vẻ chính xác trong tệp YAML của bạn, nhưng khi kiểm tra trạng thái của các pod, chúng bị kẹt ở trạng thái Pending. Chạy lệnh kubectl describe pod sẽ hiển thị cảnh báo sau trong phần events:

0/1 nodes are available: 1 node(s) had taint {key: value}, that the pod didn't tolerate.

Lỗi này cho thấy sự không khớp giữa Taints của Node và Tolerations của Pod. Trong Kubernetes, Taints giống như một biển báo "Cấm vào" trên một node. Trừ khi một Pod có một "Thẻ thông hành" (Toleration) cụ thể khớp với biển báo đó, bộ lập lịch (scheduler) sẽ từ chối đặt pod lên node đó.

Bước 1: Xác định các Taint trên Node của bạnĐể khắc phục lỗi này, trước tiên bạn cần tìm chính xác taint nào đang chặn pod của mình. Bạn có thể liệt kê tất cả các node và các taint hiện tại của chúng bằng lệnh sau:

kubectl get nodes -o custom-columns=NAME:.metadata.name,TAINTS:.spec.taints

Nếu bạn đã nhắm đến một node cụ thể, bạn có thể describe node đó để xem thêm chi tiết:

kubectl describe node <node-name> | grep Taints

Bạn sẽ thấy kết quả tương tự như key=production:NoSchedule hoặc node-role.kubernetes.io/control-plane:NoSchedule. Điều này cho bạn biết Key, Value, và Effect của taint.

Bước 2: Kiểm tra yêu cầu của PodKiểm tra manifest của Pod hoặc Deployment. Nếu bạn chưa định nghĩa rõ ràng phần tolerations, pod của bạn sẽ không thể nằm trên bất kỳ node nào có taint. Ngay cả khi bạn đã định nghĩa chúng, một lỗi đánh máy nhỏ trong key hoặc value cũng sẽ khiến bộ lập lịch từ chối pod.

Các effect phổ biến bạn sẽ thấy:

  • NoSchedule: Các pod mới sẽ không được lập lịch trừ khi chúng chấp nhận (tolerate) taint này.- PreferNoSchedule: Hệ thống cố gắng tránh đặt pod ở đó, nhưng đó không phải là yêu cầu bắt buộc.- NoExecute: Các pod hiện có sẽ bị trục xuất (evicted) nếu chúng không chấp nhận taint này.### Bước 3: Chọn giải phápCó hai cách chính để giải quyết lỗi này tùy thuộc vào mục tiêu của bạn.

Tùy chọn A: Thêm Toleration vào Pod (Khuyến nghị)Nếu node bị gắn taint vì một lý do chính đáng (ví dụ: nó có phần cứng GPU chuyên dụng hoặc được dành riêng cho môi trường production), bạn nên cập nhật manifest của Pod hoặc Deployment để bao gồm một toleration phù hợp.

Trong tệp deployment.yaml của bạn, hãy thêm trường tolerations bên dưới spec.template.spec:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 1
  template:
    spec:
      containers:
      - name: my-container
        image: nginx:latest
      tolerations:
      - key: "key"
        operator: "Equal"
        value: "value"
        effect: "NoSchedule"

Nếu taint chỉ có key mà không có value, hãy sử dụng toán tử Exists:

tolerations:
- key: "dedicated"
  operator: "Exists"
  effect: "NoSchedule"

Tùy chọn B: Gỡ bỏ Taint khỏi NodeNếu node bị gắn taint do nhầm lẫn hoặc bạn không còn muốn hạn chế nó nữa, bạn có thể gỡ bỏ taint bằng lệnh kubectl taint. Lưu ý dấu trừ (-) ở cuối lệnh—đây là ký tự dùng để gỡ bỏ.

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

Bước 4: Xác nhận kết quảSau khi áp dụng các thay đổi (bằng cách cập nhật deployment hoặc gỡ bỏ taint), hãy kiểm tra lại trạng thái của pod:

kubectl get pods -w

Pod sẽ chuyển từ trạng thái Pending sang ContainerCreating và cuối cùng là Running. Bạn cũng có thể kiểm tra xem nó đã nằm trên node nào:

kubectl get pod <pod-name> -o wide

Bài học rút ra- Control Plane Taints: Theo mặc định, các node master/control-plane của Kubernetes được gắn taint node-role.kubernetes.io/control-plane:NoSchedule. Đừng gỡ bỏ điều này trừ khi bạn đang chạy cụm đơn node (như Minikube).- Tự động hóa: Nếu bạn đang sử dụng Managed Kubernetes (EKS/GKE), một số quá trình nâng cấp node hoặc kiểm tra sức khỏe có thể tạm thời thêm taint vào các node.- Chuẩn hóa Key: Sử dụng quy ước đặt tên rõ ràng, nhất quán cho các taint (ví dụ: environment=prod hoặc hardware=gpu) để giúp các nhà phát triển dễ dàng biết cần thêm toleration nào.- Mẹo gỡ lỗi: Luôn kiểm tra phần Events của lệnh kubectl describe. Đây là nguồn thông tin đáng tin cậy nhất để biết lý do tại sao pod không hoạt động.

Related Error Notes