Nodeselector Kubernetes là gì? Hướng dẫn sử dụng Nodeselector Kubernetes chi tiết

Đã kiểm duyệt nội dung
Đánh giá
NodeSelector trong Kubernetes là cơ chế cho phép bạn chỉ định pod sẽ được triển khai trên những Node cụ thể dựa trên label của node. Việc sử dụng NodeSelector giúp tối ưu phân bổ tài nguyên, đảm bảo workload chạy đúng môi trường mong muốn như node có GPU, SSD hay cấu hình đặc biệt. Trong bài viết này, mình sẽ cùng bạn tìm hiểu chi tiết về NodeSelector Kubernetes, cách hoạt động và hướng dẫn sử dụng hiệu quả trong thực tế.
Những điểm chính
- Khái niệm: Hiểu rõ NodeSelector là cơ chế lựa chọn node đơn giản nhất, giúp bạn kiểm soát vị trí triển khai pod dựa trên các nhãn một cách trực tiếp.
- Nguyên lý hoạt động: Nắm vững cơ chế hoạt động hai bước của NodeSelector, giúp bạn hiểu rõ cách Kubernetes scheduler khớp nhãn giữa pod và node để lên lịch chính xác.
- Ưu và nhược điểm: Đánh giá được các điểm mạnh và hạn chế của NodeSelector, giúp bạn đưa ra quyết định phù hợp khi nào nên sử dụng cơ chế này và khi nào cần các giải pháp linh hoạt hơn.
- Hướng dẫn sử dụng: Nắm vững các bước thực hành cơ bản, giúp bạn tự tin áp dụng NodeSelector để gán nhãn cho node và cấu hình pod một cách chính xác, từ cấp độ pod riêng lẻ đến toàn cụm.
- Ứng dụng và các cơ chế liên quan: Tìm hiểu các trường hợp sử dụng thực tế và cách kết hợp NodeSelector với các cơ chế lên lịch nâng cao khác, giúp bạn xây dựng chiến lược phân bổ workload toàn diện và hiệu quả.
- Ví dụ thực tế: Tham khảo được quy trình triển khai pod Nginx cụ thể, giúp hình dung rõ ràng cách áp dụng kiến thức vào môi trường làm việc thực.
- Biết thêm Vietnix là nhà cung cấp dịch vụ Enterprise Cloud và hạ tầng lưu trữ chất lượng cao cho doanh nghiệp.
- Câu hỏi thường gặp: Giải đáp các thắc mắc liên quan đến NodeSelector Kubernetes.

Nodeselector Kubernetes là gì?
NodeSelector Kubernetes là cơ chế đơn giản cho phép người dùng lựa chọn node mong muốn để pod được triển khai. Khi cấu hình trường nodeSelector trong spec của pod, bạn chỉ định một nhãn cụ thể mà node cần có. Scheduler của Kubernetes sẽ đối chiếu các node trong cluster, chỉ lên lịch cho những node phù hợp với nhãn đã chỉ định, từ đó kiểm soát chính xác vị trí pod sẽ chạy.

NodeSelector rất hữu ích trong các tình huống như khi bạn muốn đảm bảo các workload quan trọng hoặc yêu cầu tài nguyên lớn chỉ được chạy trên những node mạnh hơn hoặc có cấu hình chuyên biệt, thay vì để Kubernetes tự động phân bổ lên bất kỳ node nào. Ngoài việc lọc node theo nhãn, Kubernetes Scheduler vẫn tiếp tục đánh giá các điều kiện khác như tài nguyên CPU, RAM còn trống để đảm bảo pod có thể được triển khai thành công. NodeSelector chỉ đóng vai trò là tiêu chí lọc node ban đầu dựa trên label.
Để triển khai NodeSelector hiệu quả trong môi trường Kubernetes, bạn cần cụm tài nguyên lưu trữ ổn định, tách biệt và có khả năng mở rộng linh hoạt theo từng nhóm node. Với Enterprise Cloud của Vietnix, bạn có thể tự tạo và quản lý nhiều cloud server trên một cụm tài nguyên riêng, tối ưu cấu hình cho từng node trong cluster Kubernetes. Nhờ đó, việc gán nhãn node và dùng NodeSelector để tách workload quan trọng sang nhóm máy chủ mạnh hoặc cô lập môi trường theo phòng ban, dự án trở nên rõ ràng và dễ kiểm soát hơn. Liên hệ ngay để được tư vấn chi tiết về dịch vụ!
Nguyên lý hoạt động của Nodeselector Kubernetes
Nguyên lý hoạt động của NodeSelector Kubernetes dựa trên quá trình gán nhãn cho các node để định nghĩa đặc điểm hạ tầng hoặc vai trò, sau đó sử dụng trường nodeSelector trong manifest của pod để chỉ định pod phải chạy trên node có nhãn phù hợp. Khi pod được tạo, scheduler của Kubernetes sẽ thực hiện đánh giá toàn bộ node trong cluster, loại bỏ các node không khớp nhãn và chỉ chọn những node đáp ứng đúng tiêu chí nodeSelector của pod để lên lịch triển khai.
Để vận hành NodeSelector, quy trình gồm hai bước chính:
- Quản trị viên sử dụng lệnh gán nhãn cho node, ví dụ:
kubectl label nodes node-1 disktype=ssd- Người dùng bổ sung thông số nodeSelector trong cấu hình pod:
spec:
nodeSelector:
disktype: ssdNhư vậy pod chỉ được lên lịch chạy trên node có nhãn disktype=ssd. Nếu không có node nào phù hợp thì pod sẽ chờ cho đến khi xuất hiện node đáp ứng tiêu chí.
NodeSelector được cấu hình trực tiếp ở cấp độ pod thông qua trường nodeSelector trong PodSpec. Khi pod được tạo, scheduler của Kubernetes sẽ lọc các node trong cluster dựa trên nhãn được chỉ định, chỉ giữ lại những node có label khớp hoàn toàn với điều kiện của pod để tiến hành lên lịch triển khai.
Nếu không có node nào đáp ứng tiêu chí, pod sẽ ở trạng thái pending cho đến khi xuất hiện node phù hợp. Trong các cluster có nhiều môi trường hoặc yêu cầu hạ tầng khác nhau, việc gán nhãn node hợp lý và sử dụng NodeSelector giúp kiểm soát chính xác việc phân phối workload, đảm bảo pod luôn được chạy trên node phù hợp với mục đích và yêu cầu tài nguyên của ứng dụng.

Ưu và nhược điểm của Nodeselector
Tính đơn giản và dễ sử dụng: Người dùng dễ dàng kiểm soát vị trí pod bằng cách thêm nhãn cho node và sử dụng trực tiếp trong cấu hình pod, không cần quy tắc lập lịch phức tạp.
Phù hợp với môi trường nhỏ hoặc ít biến động: NodeSelector hiệu quả đối với cụm nhỏ hoặc workload nhẹ, ví dụ chia loại ứng dụng theo nhu cầu tài nguyên hoặc môi trường rõ ràng như dev và prod.
Thiếu linh hoạt so với các cơ chế nâng cao: NodeSelector chỉ khớp nhãn chính xác, không hỗ trợ ưu tiên, dự phòng hoặc biểu thức nâng cao như node affinity, nên hạn chế trong các kịch bản cần chiến lược scheduling thông minh.
Không tối ưu cho môi trường lớn, nhiều thay đổi: Trong các cụm lớn, việc thêm/xóa node hoặc thay đổi nhãn đòi hỏi quản trị viên phải cập nhật liên tục và NodeSelector không hỗ trợ nhiều điều kiện hay ưu tiên phân bố workload.
Hướng dẫn sử dụng Nodeselector Kubernetes chi tiết
1. Sử dụng Nodeselector để quản lý vị trí của pod
Bước 1: Thêm nhãn cho node
Trước tiên, bạn xác định node mục tiêu bằng lệnh:
kubectl get nodes --show-labelsSau đó gán nhãn cho node:
kubectl label nodes <node-name> <key>=<value>Ví dụ:
kubectl label nodes host02 disktype=ssdĐể kiểm tra lại nhãn đã gán, bạn dùng lệnh:
kubectl describe node host02Bước 2: Thêm nodeSelector vào cấu hình pod
Trong file YAML của pod, bạn thêm field nodeSelector vào phần spec:
apiVersion: v1
kind: Pod
metadata:
name: example-pod
spec:
containers:
- name: nginx
image: nginx
nodeSelector:
disktype: ssdTiếp đó, bạn tạo Pod bằng lệnh:
kubectl apply -f example-pod.yamlXác thực pod đã được lên lịch đúng node:
kubectl get pod -o wide
Lưu ý
Nếu không có node nào khớp nhãn, pod sẽ không được scheduling mà ở trạng thái Pending.
2. Tạo Default cluster-wide node selectors – Áp dụng cho OpenShift
Bước 1: Chỉnh sửa scheduler CR để cấu hình nodeSelector mặc định cho toàn cụm
Kubernetes thuần không hỗ trợ cấu hình nodeSelector mặc định ở cấp cluster. Tính năng này chỉ khả dụng trên OpenShift thông qua KubeScheduler Operator. Bạn truy cập/chỉnh sửa tài nguyên Scheduler CR:
apiVersion: operator.openshift.io/v1
kind: KubeScheduler
...
spec:
nodeSelector:
type: user-node
region: eastÁp dụng thay đổi và đợi quá trình rollout cho các nhóm liên quan. Scheduler sẽ tự động gán giá trị nodeSelector này cho tất cả pod mới được lên lịch.
Bước 2: Gán nhãn cho node
Tương tự bước ở trên, bạn dùng câu lệnh:
kubectl label nodes <node-name> type=user-node region=east
Lưu ý
Các pod sẽ chỉ được scheduling lên node mang nhãn phù hợp với cấu hình cluster-wide nodeSelector. Việc cập nhật nodeSelector yêu cầu rollout lại các nhóm đã triển khai.
3. Tạo Project node selectors
Trong OpenShift, mỗi Project có thể cấu hình nodeSelector mặc định thông qua annotation. Tất cả pod được tạo trong Project sẽ tự động kế thừa nodeSelector này khi scheduling.
Bước 1: Chỉnh sửa namespace để thêm nodeSelector cho từng dự án
Bạn truy cập namespace và thêm trường nodeSelector:
apiVersion: v1
kind: Namespace
metadata:
name: example-namespace
annotations:
openshift.io/node-selector: 'region=east'kubectl apply -f example-namespace.yamlBước 2: Thêm nhãn cho node trong dự án
Bạn gán nhãn cho node:
kubectl label nodes <node-name> region=east type=user-node
Lưu ý
NodeSelector ở dự án sẽ ưu tiên hơn nodeSelector toàn cụm. Nếu không có node khớp, pod sẽ không được scheduling, có thể kiểm tra trạng thái hoặc báo lỗi bằng lệnh kubectl describe pod <pod-name>.
4. Sử dụng Nodeselector để gán pod cho Node
Bước 1: Kiểm tra và gán nhãn cho node
Bạn xem nhãn node có sẵn bằng câu lệnh:
kubectl get nodes --show-labelsSau đó, bạn gán nhãn cho node mục tiêu:
kubectl label nodes host02 disktype=ssdBước 2: Tạo pod với cấu hình nodeSelector
File YAML ví dụ:
apiVersion: v1
kind: Pod
metadata:
name: httpd
labels:
env: prod
spec:
containers:
- name: httpd
image: httpd
imagePullPolicy: IfNotPresent
nodeSelector:
disktype: ssdBạn tạo pod mới bằng câu lệnh:
kubectl apply -f test-pod.yamlBước 3: Kiểm tra node đã lên lịch pod
Bạn xem thông tin chi tiết pod bằng câu lệnh:
kubectl get pod -o wideHoặc:
kubectl describe pod httpdPod chỉ được scheduling lên node có nhãn disktype=ssd. Nếu không có node phù hợp, pod sẽ ở trạng thái Pending.
Các trường hợp áp dụng và thực hành
Các trường hợp nên sử dụng NodeSelector
NodeSelector đặc biệt phù hợp khi bạn cần kiểm soát vị trí workload ở mức cơ bản trong cluster mà không phải xây dựng quy tắc phức tạp. Ví dụ:
- Phân bổ workload lên phần cứng chuyên dụng: Nếu công việc xử lý dữ liệu yêu cầu GPU, bạn nên gán nhãn
gpu=truecho các node GPU rồi cấu hình pod với nodeSelector này để đảm bảo pod chỉ được scheduling lên đúng node. - Tách biệt môi trường phát triển, kiểm thử, sản xuất: Gán nhãn
env=dev,env=prodcho từng nhóm node, từ đó mỗi loại pod sẽ chỉ triển khai môi trường phù hợp, tăng tính kiểm soát tài nguyên và bảo mật. - Tuân thủ chính sách bảo mật, quy định: Nếu ứng dụng chứa dữ liệu nhạy cảm, bạn gán nhãn riêng cho node được phép chạy ứng dụng, tránh rủi ro về quyền truy cập.

Lưu ý
NodeSelector chỉ cho phép khớp nhãn chính xác, không hỗ trợ thiết lập dự phòng hoặc ưu tiên như Node Affinity, do đó không phù hợp cho các nhu cầu scheduling phức tạp.
Một số cách ứng dụng NodeSelector
1. Gán nhãn cho node hiệu quả khi dùng NodeSelector
Để NodeSelector phát huy tối đa hiệu quả, bạn cần xây dựng hệ thống nhãn thống nhất, dễ quản lý bằng cách:
- Sử dụng nhãn chuẩn: Gán nhãn như
node-type=high-memory,region=us-west,env=prodcho node để dễ dàng kiểm soát lịch trình pod. - Đồng nhất cách đặt nhãn: Trên toàn cluster nên dùng cùng một key cho một ý nghĩa, tránh trường hợp node này có nhãn
env=prod, node khác lại làenvironment=productionkhiến scheduling thất bại. - Tránh quá nhiều nhãn trên node: Chỉ nên gán những nhãn phục vụ kiểm soát workload thực sự cần thiết, tránh trường hợp pod không lên lịch được do thiếu khớp nhãn.
2. Kết hợp NodeSelector với các cơ chế scheduling khác
- Node Affinity: Node Affinity mở rộng NodeSelector với khả năng thiết lập điều kiện chọn node bằng biểu thức, cho phép thiết lập cả bắt buộc và ưu tiên. Ví dụ, bạn muốn pod ưu tiên chạy trên node kiểu high-memory nhưng khi cần vẫn chấp nhận các node khác, cấu hình như sau:
spec:
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: node-type
operator: In
values:
- high-memory- Taints và Tolerations: Taints dùng để ngăn pod lên lịch trên node, trừ phi pod có toleration phù hợp. Bạn đặt taint bằng câu lệnh:
kubectl taint nodes worker-node-1 dedicated=high-memory:PreferNoScheduleCấu hình toleration cho pod để vượt qua rào cản này:
spec:
tolerations:
- key: "dedicated"
operator: "Equal"
value: "high-memory"
effect: "PreferNoSchedule"3. Pod Affinity/Anti-Affinity
Pod Affinity đảm bảo các pod liên quan được triển khai gần nhau, tối ưu hiệu suất hoặc độ trễ, pod Anti-Affinity giúp phân tán workload:
spec:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchLabels:
app: frontend
topologyKey: "kubernetes.io/hostname"4. Topology Spread Constraints
Để workload không tập trung vào một khu vực/khu vực lỗi đơn lẻ, hãy cấu hình phân tán pod theo topology:
spec:
topologySpreadConstraints:
- maxSkew: 1
topologyKey: "topology.kubernetes.io/zone"
whenUnsatisfiable: ScheduleAnyway
labelSelector:
matchLabels:
app: web5. Resource Requests và Limits
Dù dùng NodeSelector, bạn vẫn cần định nghĩa tài nguyên rõ ràng cho pod để scheduler chọn đúng node còn đủ resource. Ví dụ:
spec:
containers:
- name: mycontainer
image: nginx
resources:
requests:
memory: "512Mi"
cpu: "250m"
limits:
memory: "1Gi"
cpu: "500m"Để tránh throttling, bạn hãy đặt requests sát với mức sử dụng thực tế và bỏ trống limits (nếu cụm của bạn cho phép) hoặc đặt limits đủ cao.
6. Custom scheduler
Trong các hệ thống lớn, quy mô hoặc nhu cầu đặc thù, bạn có thể triển khai scheduler riêng cho pod:
spec:
schedulerName: my-custom-schedulerVí dụ thực tế về triển khai pod lên Node chỉ định
Trong ví dụ này, mình sẽ thực hiện điều phối một pod chạy chính xác trên một Node cụ thể bằng cách sử dụng nhãn (label) env=demo.
Bước 1: Gán nhãn cho Node mục tiêu
Trước tiên, bạn chọn node cần dùng và gán nhãn cho node đó. Ở đây node có tên tuandm-demodoc-q45ldrzmq4cj-node-0 được gán nhãn env=demo:
kubectl label nodes tuandm-demodoc-q45ldrzmq4cj-node-0 env=demo
Kubernetes sẽ trả về:
node/tuandm-demodoc-q45ldrzmq4cj-node-0 labeledBạn kiểm tra lại nhãn bằng lệnh:
kubectl get nodes --show-labels | grep envKết quả có chứa env=demo tại node vừa gán nhãn là đã thành công.
Bước 2: Cấu hình pod để tìm đúng nhãn
Tiếp theo, bạn khai báo nodeSelector trong file YAML của pod để yêu cầu Scheduler chỉ đặt pod lên các node có nhãn env: demo:
apiVersion: v1
kind: Pod
metadata:
name: demo-pod
spec:
containers:
- name: nginx
image: nginx
nodeSelector:
env: demo # Pod chỉ được chạy trên node có nhãn env=demo
Bước 3: Xác nhận kết quả triển khai
Bạn tạo pod bằng lệnh:
kubectl apply -f demo-pod.yamlKhi đó Kubernetes Scheduler sẽ tìm các node có nhãn env=demo và lên lịch pod demo-pod đúng vào node tuandm-demodoc-q45ldrzmq4cj-node-0. Để kiểm tra pod đang chạy trên node nào, bạn dùng:
kubectl get pod -o wideCột NODE sẽ hiển thị tên node có nhãn env=demo mà pod đang chạy.

Vietnix – Nhà cung cấp dịch vụ Enterprise Cloud và hạ tầng lưu trữ chất lượng cao cho doanh nghiệp
Vietnix là đơn vị cung cấp hệ sinh thái dịch vụ lưu trữ và hạ tầng cloud đáp ứng nhu cầu vận hành website, ứng dụng và hệ thống doanh nghiệp ở nhiều quy mô. Từ hosting web ổn định, dịch vụ máy chủ ảo linh hoạt đến Enterprise Cloud cho các hệ thống yêu cầu hiệu năng và độ sẵn sàng cao, Vietnix giúp bạn xây dựng nền tảng hạ tầng phù hợp từng giai đoạn phát triển. Với hạ tầng đầu tư bài bản và đội ngũ kỹ thuật hỗ trợ 24/7, Vietnix đồng hành cùng doanh nghiệp trong việc triển khai và vận hành hệ thống ổn định, hiệu quả lâu dài!
Thông tin liên hệ:
- Website: https://vietnix.vn/
- Hotline: 1800 1093
- Email: sales@vietnix.com.vn
- Địa chỉ: 265 Hồng Lạc, Phường Bảy Hiền, Thành Phố Hồ Chí Minh
Câu hỏi thường gặp
Nodeselector multiple labels là gì?
Nodeselector multiple labels là cách khai báo nhiều cặp key/value nhãn trong trường nodeSelector của pod, giúp pod chỉ được scheduling lên node đáp ứng đồng thời tất cả nhãn này. Ví dụ, nếu bạn muốn pod chỉ chạy trên node vừa có loại đĩa là SSD vừa đặt ở region east, cấu hình nodeSelector của pod sẽ như sau:spec:
nodeSelector:
disktype: ssd
region: east
Pod chỉ khởi chạy trên node gắn đủ cả hai nhãn disktype=ssd và region=east.
Nodeselector NodePool là gì?
Nodeselector NodePool là cách sử dụng nhãn để scheduling pod lên một nhóm node (node pool) được định nghĩa riêng biệt trong cluster. Thông thường, nhà quản trị sẽ gán nhãn như nodepool=backend cho các node thuộc pool backend, sau đó cấu hình nodeSelector:spec:
nodeSelector:
nodepool: backend
Như vậy, pod chỉ được lên lịch trên node thuộc NodePool backend, giúp kiểm soát workload hiệu quả và tối ưu hóa tài nguyên từng nhóm node.
NodeSelector label là gì?
NodeSelector label là nhãn key/value gắn trên node dùng để Kubernetes Scheduler lọc và chọn node phù hợp khi lên lịch pod có khai báo nodeSelector. Bạn gán label cho node (ví dụ env=demo, size=large), sau đó trong spec của pod khai báo nodeSelector: { env: demo }, Kubernetes chỉ đặt pod lên những node mang đúng label này.
NodeSelector Kubernetes là một cơ chế đơn giản nhưng hiệu quả để kiểm soát vị trí triển khai pod trong cluster. NodeSelector giúp đảm bảo các workload chạy trên đúng loại hạ tầng yêu cầu, tối ưu hóa tài nguyên và tăng cường bảo mật. Mặc dù có những hạn chế nhất định so với các cơ chế nâng cao như Node Affinity, việc hiểu và áp dụng NodeSelector một cách hiệu quả là kiến thức nền tảng để quản lý các cụm Kubernetes, đảm bảo ứng dụng vận hành đúng vị trí và ổn định.
THEO DÕI VÀ CẬP NHẬT CHỦ ĐỀ BẠN QUAN TÂM
Đăng ký ngay để nhận những thông tin mới nhất từ blog của chúng tôi. Đừng bỏ lỡ cơ hội truy cập kiến thức và tin tức hàng ngày
















