Bài 17. NodeSelector - Ép Pod chạy đúng Node
"Kubernetes rất thông minh trong việc chọn Node để chạy Pod. Nhưng sẽ có lúc bạn muốn nói với nó: 'Không, hãy chạy Pod này ở đúng Node đó!'"
Tình huống thực tế
Hãy tưởng tượng bạn có một Kubernetes Cluster gồm 3 Node.
Kubernetes Cluster
+-----------+ +-----------+ +-----------+
| Node A | | Node B | | Node C |
| SSD | | HDD | | GPU |
+-----------+ +-----------+ +-----------+
Bạn có một ứng dụng AI cần sử dụng GPU.
Nếu để Kubernetes tự quyết định, Pod có thể chạy vào Node A hoặc Node B, nơi không hề có GPU.
Điều đó đồng nghĩa với việc ứng dụng sẽ không thể hoạt động.
Vậy làm sao để nói với Kubernetes:
"Pod này chỉ được phép chạy trên Node C."
Đó chính là lúc NodeSelector xuất hiện.
1. NodeSelector là gì?
NodeSelector là cách đơn giản nhất để yêu cầu Kubernetes chỉ chạy Pod trên những Node có label phù hợp.
Nói cách khác:
Pod sẽ tìm Node có đúng nhãn (label) mà bạn yêu cầu.
2. NodeSelector hoạt động như thế nào?
Bước đầu tiên là gắn nhãn cho Node.
Ví dụ:
Node A
disk=ssd
Node B
disk=hdd
Node C
gpu=true
Sau đó khai báo trong Pod:
spec:
nodeSelector:
gpu: "true"
Kubernetes sẽ kiểm tra từng Node.
Node A
gpu=true ❌
Node B
gpu=true ❌
Node C
gpu=true ✅
Kết quả:
Pod
│
▼
Node C
Pod sẽ chỉ được chạy trên Node C.
Ví dụ đầy đủ
apiVersion: v1
kind: Pod
metadata:
name: ai-app
spec:
nodeSelector:
gpu: "true"
containers:
- name: app
image: nginx
Nếu trong Cluster tồn tại Node có label:
gpu=true
Pod sẽ được Scheduler đặt lên Node đó.
3. Điều gì xảy ra nếu không có Node phù hợp?
Đây là điểm rất nhiều người mới bỏ qua.
Nếu không có Node nào mang label:
gpu=true
Kubernetes không chọn Node khác.
Thay vào đó, Pod sẽ ở trạng thái:
Pending
và chờ cho đến khi xuất hiện một Node phù hợp.
4. Khi nào nên dùng NodeSelector?
NodeSelector rất hữu ích khi bạn muốn:
- Chạy AI workload trên Node có GPU.
- Chạy Database trên Node sử dụng SSD.
- Chạy ứng dụng Production trên nhóm Node mạnh hơn.
- Tách workload giữa các nhóm Node.
Ví dụ:
Node
role=database
Database Pod:
nodeSelector:
role: database
Ưu điểm
- Cú pháp rất đơn giản.
- Dễ học và dễ sử dụng.
- Phù hợp với các yêu cầu cố định.
Hạn chế
NodeSelector chỉ hỗ trợ điều kiện chính xác.
Ví dụ, bạn chỉ có thể nói:
"Node phải có
gpu=true."
Nhưng bạn không thể diễn đạt những yêu cầu như:
- Ưu tiên Node ở Tokyo, nhưng nếu không có thì Osaka cũng được.
- Không chạy cùng Node với Pod khác.
- Chọn Node có ít nhất 16 GB RAM.
- Chọn Node có SSD hoặc NVMe.
Những trường hợp linh hoạt như vậy sẽ cần đến Node Affinity, chủ đề của bài tiếp theo.
Tổng kết
NodeSelector là cách đơn giản nhất để ép Pod chạy trên những Node có label mong muốn.
Chỉ cần hai bước:
- Gắn label cho Node.
- Khai báo nodeSelector trong Pod.
Kubernetes sẽ tự tìm Node phù hợp. Nếu không tìm thấy, Pod sẽ không chạy và ở trạng thái Pending.
Ở bài tiếp theo, chúng ta sẽ khám phá Node Affinity - một phiên bản "thông minh" và linh hoạt hơn NodeSelector, cho phép Scheduler đưa ra quyết định tinh vi hơn thay vì chỉ kiểm tra khớp nhãn đơn giản.
All rights reserved