- vừa được xem lúc

Làm chủ cơ chế lên lịch trong Kubernetes: Hướng dẫn toàn diện về Taints và Tolerations

0 0 1

Người đăng: Kubernetes

Theo Viblo Asia

Trong Kubernetes, taints và tolerations là các cơ chế cho phép bạn kiểm soát vị trí các pod được lên lịch trong cụm. Chúng cung cấp khả năng kiểm soát chi tiết việc đặt pod lên các node, đảm bảo rằng các pod chạy trên những node phù hợp dựa trên các yêu cầu cụ thể như năng lực phần cứng, độ ưu tiên của workload hoặc lịch bảo trì. Hướng dẫn này sẽ giải thích taints và tolerations là gì, cách chúng hoạt động, và cách sử dụng hiệu quả thông qua các ví dụ thực tế.

Yêu cầu trước khi bắt đầu

  • Hiểu biết cơ bản về các khái niệm trong Kubernetes (pod, node, lên lịch).
  • Một cụm Kubernetes (ví dụ: Minikube, Kind, hoặc cụm cloud như GKE, EKS, AKS).
  • kubectl đã được cài đặt và cấu hình để tương tác với cụm.

Taints và Tolerations là gì?

Taints

Taint là một thuộc tính được áp dụng cho node để ngăn không cho các pod được lên lịch lên node đó, trừ khi pod đó chấp nhận (tolerate) taint. Taints rất hữu ích khi:

  • Dành riêng các node cho workload cụ thể
  • Đánh dấu node với phần cứng đặc biệt
  • Ngăn pod chạy trên node trong quá trình bảo trì

Một taint bao gồm:

  • Key: Định danh duy nhất (ví dụ: dedicated)
  • Value: Giá trị đi kèm với key (ví dụ: gpu)
  • Effect: Hành vi lên lịch (ví dụ: NoSchedule, PreferNoSchedule, hoặc NoExecute)

Tolerations

Toleration là một thuộc tính được áp dụng cho pod, cho phép nó được lên lịch trên node có taint tương ứng. Toleration khớp với taint dựa trên key, value và effect – từ đó vô hiệu hóa sự giới hạn của taint.

Cách chúng hoạt động cùng nhau

  • Mặc định, một node có taint sẽ từ chối pod nếu pod đó không có toleration tương ứng.
  • Toleration không ép buộc pod chạy trên node đó, nó chỉ cho phép. Các yếu tố khác như affinity, tài nguyên, độ ưu tiên vẫn được xét đến.
  • Taints/tolerations bổ sung cho node affinity: affinity hút pod đến node, còn taint đẩy pod đi.

Các loại Effect trong Taints

  • NoSchedule: Pod không có toleration sẽ không được lên lịch trên node. Pod đã chạy không bị ảnh hưởng.
  • PreferNoSchedule: Tránh lên lịch pod không có toleration, nhưng không cưỡng chế hoàn toàn.
  • NoExecute: Pod không có toleration sẽ bị đẩy ra (evict) ngay lập tức và các pod mới không thể được lên lịch.

Tại sao nên sử dụng Taints và Tolerations?

  • Dành riêng node cho workload cụ thể (ví dụ: ML, database)
  • Sử dụng phần cứng đặc biệt (GPU, RAM cao)
  • Quản lý bảo trì node
  • Cách ly workload quan trọng khỏi workload thông thường

Thiết lập Taints và Tolerations

Bước 1: Thêm Taint vào Node

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

Ví dụ: Chặn các pod không phù hợp chạy trên node1:

kubectl taint nodes node1 dedicated=gpu:NoSchedule

Kiểm tra taint:

kubectl describe node node1

Tìm dòng:

Taints: dedicated=gpu:NoSchedule

Bước 2: Thêm Toleration vào Pod

File YAML mẫu gpu-pod.yaml:

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

Áp dụng pod:

kubectl apply -f gpu-pod.yaml

Bước 3: Kiểm tra Pod được lên lịch

kubectl get pods -o wide

Nếu không có toleration, pod sẽ ở trạng thái Pending.

Bước 4: Xoá Taint

kubectl taint nodes node1 dedicated=gpu:NoSchedule-

Kiểm tra lại:

kubectl describe node node1

Sử dụng nâng cao

Tolerate mọi giá trị của key

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

Chấp nhận mọi giá trị của key dedicated.

Toleration Seconds (cho NoExecute)

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

Pod sẽ chờ 300 giây trước khi bị đẩy khỏi node.

Kết hợp với Node Affinity

spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: node-role.kubernetes.io/gpu operator: In values: - "true" tolerations: - key: "dedicated" operator: "Equal" value: "gpu" effect: "NoSchedule"

Toleration mặc định

Kubernetes tự động thêm các toleration mặc định cho các taint sau:

  • node.kubernetes.io/not-ready:NoExecute
  • node.kubernetes.io/unreachable:NoExecute

Thời gian chờ mặc định là 300 giây.

Ví dụ thực tế: Dành riêng Node cho GPU

Bối cảnh: Cụm có 3 node, node1 có GPU. Chỉ pod nặng về GPU mới được lên lịch lên node1.

Các bước:

1. Taint node1:

 kubectl taint nodes node1 dedicated=gpu:NoSchedule

2. Gán nhãn node1:

kubectl label nodes node1 node-role.kubernetes.io/gpu=true

3. Tạo pod dùng GPU:

 apiVersion: v1 kind: Pod metadata: name: gpu-workload spec: containers: - name: ml-container image: tensorflow/tensorflow:latest-gpu affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: node-role.kubernetes.io/gpu operator: In values: - "true" tolerations: - key: "dedicated" operator: "Equal" value: "gpu" effect: "NoSchedule"

Áp dụng:

 kubectl apply -f gpu-workload.yaml

4. Tạo pod thường (không dùng GPU):

 apiVersion: v1 kind: Pod metadata: name: regular-pod spec: containers: - name: nginx image: nginx

Áp dụng và kiểm tra:

 kubectl apply -f regular-pod.yaml kubectl get pods -o wide

regular-pod sẽ ở trạng thái Pending hoặc được lên lịch lên node khác.

Sự cố thường gặp

  • Pod kẹt ở Pending: Kiểm tra nếu pod thiếu toleration.
  • Bị đẩy bất ngờ: Kiểm tra taint NoExecute và toleration.
  • Taint không hoạt động: Xác minh lại cú pháp và tên node.

Best practice

  • Dùng key/value rõ ràng (dedicated=database thay vì key1=value1)
  • Kết hợp với node affinity để kiểm soát chi tiết
  • Theo dõi taint trong cụm bằng:
kubectl get nodes -o custom-columns=NAME:.metadata.name,TAINTS:.spec.taints
  • Ghi chú tài liệu sử dụng taint để nhóm dễ hiểu

Kết luận

Taints và tolerations là công cụ mạnh mẽ để quản lý nơi các pod được chạy trong Kubernetes. Bằng cách gắn taint vào node và thêm toleration vào pod, bạn có thể thực thi các chính sách lên lịch tối ưu, cách ly workload và xử lý các yêu cầu đặc biệt như node có GPU hoặc bảo trì. Hãy thử áp dụng các ví dụ trong hướng dẫn này trên cụm của bạn để có kinh nghiệm thực tế.

Cảm ơn các bạn đã theo dõi!

Bình luận

Bài viết tương tự

- vừa được xem lúc

Deploying A Containerized Web Application On Kubernetes

1. Overview. Kubernetes is an open source project (available on kubernetes.io) which can run on many different environments, from laptops to high-availability multi-node clusters; from public clouds to on-premise deployments; from virtual machines to bare metal.

0 0 70

- vừa được xem lúc

Kubernetes - Học cách sử dụng Kubernetes Namespace cơ bản

Namespace trong Kubernetes là gì. Tại sao nên sử dụng namespace.

0 0 126

- vừa được xem lúc

[Kubernetes] Kubectl và các command cơ bản

Mở đầu. Kubectl là công cụ quản trị Kubernetes thông qua giao diện dòng lệnh, cho phép bạn thực thi các câu lệnh trong Kubernetes cluster.

0 0 69

- vừa được xem lúc

Triển khai EFK Stack trên Kubernetes

EFK stack on K8S. Giới thiệu. Một hệ thống có thể chạy nhiều dịch vụ hoặc ứng dụng khác nhau, vì vậy việc. theo dõi hệ thống là vô cùng cần thiết.

0 0 83

- vừa được xem lúc

Thực hành Kubernetes (K8S) bằng cách sử dụng lệnh Command

Bài hướng dẫn hôm nay sẽ hướng dẫn sử dụng K8S bằng cách sử dụng câu lệnh thay vì UI trên web. Có 2 lựa chọn để thực hiện:. . Sử dụng Cloud Shell.

0 0 65

- vừa được xem lúc

Kubernetes best practices - Liveness và Readiness Health checks

Mở đầu. Kubernetes cung cấp cho bạn một framework để chạy các hệ phân tán một cách mạnh mẽ.

0 0 64