Hướng Dẫn Chi Tiết: Cách Tự Động Lập Lịch Pod Trong Kubernetes Khi Không Có Scheduler¶
Kubernetes là hệ thống điều phối container mạnh mẽ, nhưng bạn đã bao giờ tự hỏi: Nếu không có scheduler trong cụm (cluster), bạn sẽ làm gì? Trong bài viết này, chúng ta sẽ tìm hiểu về các cách thủ công để lập lịch (schedule) một pod lên node khi không sử dụng scheduler mặc định của Kubernetes.
1. Scheduler Hoạt Động Như Thế Nào?¶
Thông thường, khi bạn tạo một pod, bạn không cần chỉ định node mà pod sẽ chạy. Điều này là nhờ vào scheduler – thành phần tự động chọn node phù hợp dựa trên thuật toán lập lịch.
Mỗi pod có một trường nodeName
, mặc định không được thiết lập trong manifest. Scheduler sẽ quét qua các pod chưa có trường này, xác định node phù hợp, và đặt giá trị nodeName
cho pod (bằng cách tạo một binding object).
Quy trình của scheduler:¶
- Quét tất cả pod chưa có trường
nodeName
. - Chạy thuật toán để tìm node thích hợp.
- Đặt giá trị
nodeName
vào pod thông qua binding object.
2. Điều Gì Xảy Ra Nếu Không Có Scheduler?¶
Nếu không có scheduler, các pod sẽ rơi vào trạng thái Pending và không được gán node để chạy. Lúc này, bạn phải tự lập lịch cho pod.
3. Cách Thủ Công Để Lập Lịch Pod Trên Node¶
Cách 1: Thiết Lập nodeName
Khi Tạo Pod¶
Cách đơn giản nhất là chỉ định trường nodeName
ngay trong file manifest của pod trước khi tạo. Ví dụ:
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mycontainer
image: nginx
nodeName: node-1 # Đặt tên node ở đây
Khi áp dụng manifest này, pod sẽ được tạo trên node cụ thể (node-1
). Lưu ý: bạn chỉ có thể thiết lập nodeName
khi tạo pod, không thể thay đổi sau khi pod đã được tạo.
Cách 2: Gán Node Cho Pod Đã Tạo Bằng Binding API¶
Nếu pod đã được tạo mà chưa được gán node, bạn không thể sửa trực tiếp trường nodeName
. Thay vào đó, bạn cần tạo một binding object và gửi POST request tới API của pod, giống như cách scheduler hoạt động.
Các bước thực hiện:¶
- Tạo binding object dưới dạng JSON (không dùng YAML).
Ví dụ:
{
"apiVersion": "v1",
"kind": "Binding",
"metadata": {
"name": "mypod"
},
"target": {
"apiVersion": "v1",
"kind": "Node",
"name": "node-1"
}
}
- Gửi POST request tới endpoint binding của pod:
POST /api/v1/namespaces/{namespace}/pods/{pod}/binding
Content-Type: application/json
Body: binding object ở trên
Cách này sẽ gán pod tới node mong muốn, tương tự như scheduler thực hiện.
4. Tổng Kết¶
Khi không có scheduler:
- Pod sẽ ở trạng thái Pending.
- Bạn có thể chỉ định node khi tạo pod bằng
nodeName
. - Nếu pod đã tạo, dùng binding API để gán node cho pod.