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.nodeNamecủ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ầu | Sẽ 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ên | Taints & Tolerations |
2. Scheduler chọn node như thế nào?
- Filter (lọc): loại các node không phù hợp, ví dụ không đủ CPU/RAM pod yêu cầu.
- 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ìnlimitsvà không nhìn mức dùng thực tế.
Topic nào tác động vào giai đoạn nào?
| Topic | Tác động vào |
|---|---|
resources.requests | Filter (đủ không) và Score (còn trống bao nhiêu) |
nodeSelector, nodeAffinity (required) | Filter |
nodeAffinity (preferred) | Score |
| Taints & Tolerations | Filter |
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ệm | Ghi nhớ |
|---|---|
| kube-scheduler | Chỉ quyết định pod chạy node nào (điền nodeName). Không chạy pod |
| kubelet | Thực sự tạo container trên node |
| Filter | Loại node không phù hợp |
| Score | Chấm điểm node còn lại, cao nhất thắng |
| Không node nào đạt | Pod Pending, event FailedScheduling |
Dựa vào requests | Khô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ứng | Nguyên nhân |
|---|---|
Pod Pending, NODE <none>, không có event nào | Scheduler 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.