Chuyển tới nội dung chính

kube-scheduler

1. kube-scheduler là gì?​

  • Scheduler quyết định Pod chạy trên Node nào, dựa trên các tiêu chí nhất định.
  • Nó không thực sự đặt pod lên node – đó là việc của kubelet ("thuyền trưởng" của mỗi con tàu).
  • Kết quả duy nhất của scheduler: điền trường spec.nodeName của pod, thông qua object Binding gửi tới apiserver.

Những yêu cầu ảnh hưởng tới việc chọn node:

Yêu cầuSẽ học ở
Node phải đủ CPU và RAM pod yêu cầu (resources.requests)Resource requirements
Pod phải chạy trên node có đặc điểm phù hợp (GPU, zone A…)nodeSelector, Node Affinity
Node dành riêng, chỉ cho một số pod lênTaints & Tolerations

2. Scheduler chọn node như thế nào?​

  1. Filter (lọc): loại các node không phù hợp, ví dụ không đủ CPU/RAM pod yêu cầu.
  2. Score (chấm điểm): xếp hạng các node còn lại. Ví dụ tính tài nguyên còn trống sau khi đặt pod: node còn 6 CPU trống thắng node còn 2 CPU.
Lưu ý
  • Nếu Filter loại hết node → pod kẹt Pending.
  • Scheduler dựa vào requests, không nhìn limits và không nhìn mức dùng thực tế.

Topic nào tác động vào giai đoạn nào?​

TopicTác động vào
resources.requestsFilter (đủ không) và Score (còn trống bao nhiêu)
nodeSelector, nodeAffinity (required)Filter
nodeAffinity (preferred)Score
Taints & TolerationsFilter
nodeName (gán tay)Bỏ qua scheduler hoàn toàn

3. Cài đặt​

Kiểu hard way, scheduler dùng một file cấu hình YAML riêng:

# /etc/kubernetes/config/kube-scheduler.yaml
apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
clientConnection:
kubeconfig: /var/lib/kubernetes/kube-scheduler.kubeconfig # cách tìm tới apiserver
leaderElection:
leaderElect: true # HA: chỉ một scheduler hoạt động
ExecStart=/usr/local/bin/kube-scheduler \
--config=/etc/kubernetes/config/kube-scheduler.yaml \
--v=2

Với kubeadm, xem /etc/kubernetes/manifests/kube-scheduler.yaml:

- --kubeconfig=/etc/kubernetes/scheduler.conf      # ⭐ đề hay sửa sai chỗ này
- --leader-elect=true
- --bind-address=127.0.0.1

Giống controller-manager, scheduler chỉ nói chuyện với apiserver qua kubeconfig, không chạm etcd.

4. Tóm tắt​

Khái niệmGhi nhớ
kube-schedulerChỉ quyết định pod chạy node nào (điền nodeName). Không chạy pod
kubeletThực sự tạo container trên node
FilterLoại node không phù hợp
ScoreChấm điểm node còn lại, cao nhất thắng
Không node nào đạtPod Pending, event FailedScheduling
Dựa vào requestsKhông dựa vào usage thực tế hay limits

5. Phân biệt ba lỗi "pod không chạy"​

Triệu chứngNguyên nhân
Pod Pending, NODE <none>, không có event nàoScheduler chết
Pod Pending, có event FailedScheduling: 0/3 nodes are available...Scheduler sống, nhưng không node nào qua Filter
Không có pod nào được tạo (Deployment 0/3)controller-manager chết

Đọc event FailedScheduling, ví dụ:

0/3 nodes are available: 1 node(s) had untolerated taint {node-role.kubernetes.io/control-plane: }, 2 Insufficient cpu.

→ master bị taint chặn, hai worker thiếu CPU.