Tất tần tật những điều cần biết về Nodeselector kubernetes
Bài viết này sẽ cho bạn nắm rõ về nodeselector kubernetes cơ bản gồm bộ chọn nút, mối quan hệ nút, chống đối mối quan hệ cũng như mối quan hệ nhóm và chống mối quan hệ nhóm. Chúng gồm cả ví dụ về khả năng chịu lỗi của khối lượng công việc.
Nodeselector kubernetes là gì?
Nodeselector kubernetes là hình thức ràng buộc lựa chọn nút được đề xuất đơn giản nhất là bộ chọn nút. Lúc này, người dùng có thể thêm trường nodeselector và đặc tả pod của họ vào. Đồng nghĩa với việc người dùng có thể xác định nhãn nút mà họ muốn nút mục tiêu có. Trong khi đó, chỉ các nút có mỗi nhãn mà người dùng chỉ định mới được Kubernetes giữ theo lịch trình để nhận lịch trình của pod.
Trong khi đó, quản trị viên của Kubernetes thường không phải thực hiện thao tác chọn nút để lên lịch cho nhóm mà thay vào đó bộ lập lịch Kubernetes sẽ chọn nút hoặc các nút thích hợp để lên lịch cho pod. Kèm theo đó là người dùng bị ngăn không cho chọn các nút không phù hợp hoặc các nút không đủ tài nguyên bằng cách chọn nút tự động.
Ngoài ra, bộ lập lịch Kubernetes còn giúp đảm bảo chính xác bằng cách so sánh dung lượng CPU và RAM của nút cùng với các yêu cầu tài nguyên của pod. Bộ lập lịch đảm bảo rằng tổng tất cả các yêu cầu tài nguyên bởi vùng chứa của pod đối với từng loại tài nguyên này nhỏ hơn dung lượng của nút. Trong cơ chế này vẫn đảm bảo rằng pod nằm trong số các nút có tài nguyên sẵn có.
Nguyên lý hoạt động của Nodeselector kubernetes
Nodeselector kubernetes là một nút phù hợp để chạy các nhóm. Trong khi đó, Nodeselector kubernetes là một phần của mặt phẳng điều khiển và nó còn chọn các nút cho các nhóm mới hoặc chưa được lên lịch theo mặc định và cố gắng trải đều chúng.
Các vùng chứa có trong nhóm còn có thể có các yêu cầu khác nhau, vì thế bộ kubernetes sẽ lọc ra bất kỳ nút nào không phù hợp so với nhu cầu cụ thể của nhóm.
Vì vậy, bộ lập lịch kubernetes có tính xác định và chấm điểm tất cả các nút khả thi cho nhóm của bạn. Sau đó nó sẽ thực hiện chọn điểm có số điểm cao nhất và đưa ra thông báo về máy chủ API về quyết định này.
Về mối quan hệ của nút, bộ chọn nút và các cách khác có thể kiểm soát tốt hơn việc lập kế hoạch Kubernetes. Các yếu tố có thể tác động đến quyết định của người lập lịch trình gồm có: yêu cầu tài nguyên, hạn chế về phần cứng và phần mềm,...
Lúc này, bộ lập lịch Kubernetes nhanh chóng nhờ tự động hoá. Tuy nhiên, nó có thể gây ra tốn kém vì người sử dụng cần trả tiền cho những tài nguyên không đủ cho các môi trường khác nhau của mình.
Ngoài ra, người sử dụng cũng gặp nhiều khó khăn trong quá trình theo dõi chi phí của mình trong Kubernetes nên các nhóm cần phải tìm ra các cách khác nhau để tự kiểm soát chi phí.
Mối quan hệ Kubernetes là một tính năng quan trọng cho phép bạn kiểm soát việc lập lịch nhóm của mình tốt hơn. Đồng thời việc thêm tự động hoá giúp đảm bảo nhóm của bạn luôn được phân phối trên các nút phù hợp nhất, dễ dàng theo dõi những vấn đề chi phí có liên quan.
1. Nodeselector kubernetes trên một Pod hoặc Node cụ thể
Người sử dụng có thể kiểm soát nút nào mà một nhóm cụ thể được lên lịch bằng cách sử dụng bộ nút và nhãn. Để có thể sử dụng bộ chọn nút và nhãn, trước tiên cần gắn nhãn nút đó để tránh các nhóm bị huỷ lịch trình sau đó thêm bộ chọn nút vào nhóm.
Tuy nhiên, bạn không thể thêm trực tiếp bộ chọn nút vào nhóm đã được lên lịch hiện có. Thay vào đó, người dùng cần gắn nhãn đối tượng điều khiển nhóm như cấu hình triển khai.
Ví dụ: Node đối tượng sau có region: east nhãn:
Đối tượng mẫu Node có nhãn
[1]. Nhãn để khớp với bộ chọn nút nhóm.
Một nhóm có bộ type: user-node,region: east chọn nút:
Đối tượng mẫu Pod với bộ chọn nút
[1]. Bộ chọn nút để khớp với nhãn nút.
Khi bạn tạo nhóm bằng cách sử dụng thông số kỹ thuật của nhóm mẫu, nó có thể được lên lịch trên nút mẫu.
2. Default cluster-wide node selectors
Với các bộ chọn nút mặc định trên toàn cụm, khi bạn tạo một nhóm trong cụm đó. Nền tảng vùng chứa OpenShift sẽ thêm các bộ chọn nút mặc định vào nhóm và lên lịch cho nhóm trên các nút có nhãn phù hợp.
Ví dụ: Scheduler đối tượng sau có bộ chọn nút region=east và type=user-node toàn cụm mặc định:
Tài nguyên tùy chỉnh của toán tử lập lịch mẫu
Một nút trong cụm đó có type=user-node,region=eastnhãn:
Node Đối tượng mẫu
Đối tượng ví dụ Pod với bộ chọn nút
Khi bạn tạo nhóm bằng cách sử dụng thông số nhóm mẫu trong cụm ví dụ, nhóm đó sẽ được tạo bằng bộ chọn nút toàn cụm và được lên lịch trên nút được gắn nhãn:
Danh sách nhóm ví dụ với nhóm trên nút được gắn nhãn
Nếu dự án nơi bạn tạo nhóm có bộ chọn nút dự án thì bộ chọn đó sẽ được ưu tiên hơn bộ chọn nút toàn cụm. Nhóm của bạn không được tạo hoặc lên lịch nếu nhóm không có bộ chọn nút dự án.
3. Project node selectors
Với bộ chọn nút dự án, khi bạn tạo một nhóm trong dự án này. Nền tảng vùng chứa OpenShift sẽ thêm các bộ chọn nút vào nhóm và lên lịch cho các nhóm trên một nút có nhãn phù hợp. Nếu có bộ chọn nút mặc định trên toàn cụm thì bộ chọn nút dự án sẽ được ưu tiên.
Ví dụ: dự án sau có bộ region=east chọn nút:
Namespace Đối tượng mẫu
Nút sau đây có type=user-node,region=east nhãn:
Node Đối tượng mẫu
Khi bạn tạo nhóm bằng cách sử dụng thông số nhóm mẫu trong dự án mẫu này, nhóm này sẽ được tạo bằng bộ chọn nút dự án và được lên lịch trên nút được gắn nhãn:
Pod Đối tượng mẫu
Danh sách nhóm ví dụ với nhóm trên nút được gắn nhãn
Một nhóm trong dự án không được tạo hoặc lên lịch nếu nhóm chứa các bộ chọn nút khác nhau. Ví dụ: nếu bạn triển khai nhóm sau vào dự án mẫu thì nó sẽ không được tạo:
Đối tượng mẫu Pod có bộ chọn nút không hợp lệ
Hướng dẫn sử dụng Nodeselector Kubernetes
Người sử dụng có thể sử dụng bộ chọn nút trên nhóm và nhãn trên nút để kiểm soát vị trí nhóm được lên lịch. Với bộ chọn nút, nền tảng vùng chứa OpenShift lên lịch cho các nhóm trên các nút có chứa nhãn phù hợp.
Khi thêm nhãn vào nút, bộ máy hoặc cấu hình máy. Lúc này, việc thêm nhãn vào bộ máy đảm bảo rằng nếu nút hoặc máy bị hỏng thì các nút mới sẽ có nhãn. Các nhãn được thêm vào nút hoặc cấu hình máy sẽ không tồn tại nếu nút hoặc máy bị hỏng.
Để thêm bộ chọn nút vào nhóm hiện có, hãy thêm bộ chọn nút vào đối tượng điều khiển cho nhóm đó như nhóm đối tượng: ReplicaSet tượng, DaemonSet đối tượng, StatefulSet đối tượng, Deployment đối tượng hoặc DeploymentConfig đối tượng. Mọi nhóm hiện có trong đối tượng điều khiển đó đều được tạo lại trên một nút có nhãn phù hợp. Nếu bạn đang tạo một nhóm mới, bạn có thể thêm bộ chọn nút trực tiếp vào thông Pod số kỹ thuật.
Có thể hiểu đơn giản hơn rằng, người sử dụng không thể thêm trực tiếp bộ chọn nút vào nhóm đã lên lịch hiện có.
1. Cách sử dụng Nodeselector để quản lý vị trí của Pod
Điều kiện tiên quyết
Để thêm bộ chọn nút vào nhóm hiện có hãy xác định đối tượng điều khiển cho nhóm đó.
Ví dụ: router-default-66d5cf9464-m2g75 nhóm được điều khiển bởi router-default-66d5cf9464 bộ bản sao:
Bảng điều khiển web liệt kê đối tượng điều khiển ownerReferences trong nhóm YAML:
Procedure
1. Thêm nhãn vào nút bằng cách sử dụng bộ máy hoặc chỉnh sửa trực tiếp nút:
- Sử dụng một MachineSet đối tượng để thêm nhãn vào các nút do nhóm máy quản lý khi tạo nút:
a. Chạy lệnh sau để thêm nhãn vào một MachineSet đối tượng:
Ví dụ:
Ngoài ra, bạn có thể áp dụng YAML sau để thêm nhãn vào bộ máy:
b. Xác minh rằng các nhãn đã được thêm vào MachineSet đối tượng bằng cách sử dụng oc edit lệnh:
Ví dụ:
MachineSet Đối tượng mẫu
- Thêm nhãn trực tiếp vào một nút:
a. Chỉnh sửa Node đối tượng cho nút:
Ví dụ: để gắn nhãn cho một nút:
Ngoài ra, bạn có thể áp dụng YAML sau để thêm nhãn vào nút:
b. Xác minh rằng các nhãn đã được thêm vào nút:
Đầu ra ví dụ
2. Thêm bộ chọn nút phù hợp vào nhóm:
- Để thêm bộ chọn nút vào các nhóm hiện tại và tương lai, hãy thêm bộ chọn nút vào đối tượng điều khiển cho các nhóm:
Đối tượng ví dụ ReplicaSet có nhãn
[1]. Thêm bộ chọn nút.
Để thêm bộ chọn nút vào một nhóm mới, cụ thể, hãy thêm trực tiếp bộ chọn vào Pod đối tượng:
Đối tượng ví dụ Pod với bộ chọn nút
Có thể hiểu rằng bạn không thể thêm trực tiếp bộ chọn nút vào nhóm đã lên lịch hiện có.
2. Cách tạo Default cluster-wide node selectors
Người dùng có thể sử dụng bộ chọn nút toàn cụm mặc định trên các nhóm cùng với nhãn trên các nút để hạn chế tất cả các nhóm được tạo trong một cụm ở các nút cụ thể.
Cùng với bộ chọn nút trên toàn cụm, khi bạn tạo một nhóm trong cụm đó. Nền tảng vùng chứa OpenShift sẽ thêm các bộ chọn nút mặc định vào nhóm và lên lịch cho nhóm trên các nút có nhãn phù hợp.
Người dùng cần đặt cấu hình bộ chọn nút trên toàn cụm bằng cách chỉnh sửa tài nguyên tùy chỉnh Người lập lịch trình (CR). Sau đó, thêm nhãn vào nút, bộ máy hoặc cấu hình máy. Việc thêm nhãn vào bộ máy đảm bảo rằng nếu nút hoặc máy bị hỏng thì các nút mới sẽ có nhãn. Các nhãn được thêm vào nút hoặc cấu hình máy sẽ không tồn tại nếu nút hoặc máy bị hỏng.
Bạn có thể thêm các cặp khóa/giá trị bổ sung vào nhóm. Nhưng bạn không thể thêm giá trị khác cho khóa mặc định.
Procedure
- Để thêm bộ chọn nút toàn cụm mặc định:
1. Chỉnh sửa CR Toán tử lập lịch để thêm các bộ chọn nút toàn cụm mặc định:
Ví dụ về toán tử lập lịch CR với bộ chọn nút
[1]. Thêm bộ chọn nút với
Sau khi thực hiện thay đổi này, hãy đợi các nhóm trong openshift-kube-apiserver dự án triển khai lại. Việc này có thể mất vài phút. Bộ chọn nút toàn cụm mặc định không có hiệu lực cho đến khi nhóm triển khai lại.
2. Thêm nhãn vào nút bằng cách sử dụng bộ máy hoặc chỉnh sửa trực tiếp nút:
- Sử dụng nhóm máy để thêm nhãn vào nút do nhóm máy quản lý khi tạo nút:
a. Chạy lệnh sau để thêm nhãn vào một MachineSet đối tượng:
[1]. Thêm một
Ví dụ:
Ngoài ra, bạn có thể áp dụng YAML sau để thêm nhãn vào bộ máy:
b. Xác minh rằng các nhãn đã được thêm vào MachineSet đối tượng bằng cách sử dụng oc edit lệnh:
Ví dụ:
MachineSet Đối tượng mẫu
c. Triển khai lại các nút được liên kết với bộ máy đó bằng cách thu nhỏ 0và mở rộng quy mô các nút:
Ví dụ:
d. Khi các nút đã sẵn sàng và khả dụng, hãy xác minh rằng nhãn đã được thêm vào các nút bằng cách sử dụng lệnh oc get:
Ví dụ:
Đầu ra ví dụ:
- Thêm nhãn trực tiếp vào một nút:
a. Chỉnh sửa Node đối tượng cho nút:
Ví dụ: để gắn nhãn cho một nút:
Có thể áp dụng YAML sau để thêm nhãn vào nút:
b. Xác minh rằng các nhãn đã được thêm vào nút bằng oc get lệnh:
Ví dụ:
Đầu ra ví dụ:
3. Cách tạo Project node selectors
Người dùng có thể sử dụng bộ chọn nút trong một dự án cùng với các nhãn trên các nút để hạn chế tất cả các nhóm được tạo trong dự án đó với các nút được gắn nhãn.
Khi bạn tạo một nhóm trong dự án này. Nền tảng vùng chứa OpenShift sẽ thêm bộ chọn nút vào các nhóm trong dự án và lên lịch cho các nhóm trên một nút có nhãn phù hợp trong dự án. Nếu có bộ chọn nút mặc định trên toàn cụm thì bộ chọn nút dự án sẽ được ưu tiên.
Bạn thêm bộ chọn nút vào dự án bằng cách chỉnh sửa Namespace đối tượng để thêm openshift.io/node-selectortham số. Bạn thêm nhãn vào nút, bộ máy hoặc cấu hình máy. Việc thêm nhãn vào bộ máy đảm bảo rằng nếu nút hoặc máy bị hỏng thì các nút mới sẽ có nhãn. Các nhãn được thêm vào nút hoặc cấu hình máy sẽ không tồn tại nếu nút hoặc máy bị hỏng.
Một nhóm không được lên lịch nếu Pod đối tượng chứa bộ chọn nút, nhưng không có dự án nào có bộ chọn nút phù hợp. Khi tạo nhóm từ thông số kỹ thuật đó, bạn sẽ nhận được lỗi tương tự như thông báo sau:
Thông báo lỗi ví dụ
Hiểu đơn giản rằng bạn có thể thêm các cặp khóa/giá trị bổ sung vào nhóm. Nhưng bạn không thể thêm giá trị khác cho khóa dự án.
Procedure
Để thêm bộ chọn nút dự án mặc định:
Đầu ra ví dụ:
[1]. Thêm the openshift.io/node-selectorvới
2. Thêm nhãn vào nút bằng cách sử dụng bộ máy hoặc chỉnh sửa trực tiếp nút:
- Sử dụng một MachineSet đối tượng để thêm nhãn vào các nút do nhóm máy quản lý khi tạo nút:
a. Chạy lệnh sau để thêm nhãn vào một MachineSet đối tượng:
Ví dụ:
Người dùng có thể có thể áp dụng YAML sau để thêm nhãn vào bộ máy:
b. Xác minh rằng các nhãn đã được thêm vào MachineSetđối tượng bằng cách sử dụng oc edit lệnh:
Ví dụ:
Đầu ra ví dụ:
c. Triển khai lại các nút được liên kết với bộ máy đó:
Ví dụ:
d. Khi các nút đã sẵn sàng và khả dụng, hãy xác minh rằng nhãn đã được thêm vào các nút bằng cách sử dụng lệnh oc get:
Ví dụ:
Đầu ra ví dụ:
- Thêm nhãn trực tiếp vào một nút:
a. Chỉnh sửa Node đối tượng để thêm nhãn:
Ví dụ: để gắn nhãn cho một nút:
Ngoài ra, bạn có thể áp dụng YAML sau để thêm nhãn vào nút:
b. Xác minh rằng các nhãn đã được thêm vào Nodeđối tượng bằng oc get lệnh:
Ví dụ:
Đầu ra ví dụ:
4. Cách dùng Nodeselector để gán Pod cho Node
Có một số bước để áp dụng nodeSelector cho Pod. Đầu tiên, người dùng phải gán nhãn cho một nút để nodeSelector sử dụng sau này. Để có được tên của các nút này, người dùng phải thực thi:
kubectl get nodes --show-labelsNAME STATUS ROLES AGE VERSION LABELShost01
Ready controlplane,etcd,worker 61d v1.10.5 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=host01,node-role.kubernetes.io/controlplane=true,node-role.kubernetes.io/etcd=true,node-role.kubernetes.io/worker=truehost02 Ready etcd,worker 61d v1.10.5 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=host02,node-role.kubernetes.io/etcd=true,node-role.kubernetes.io/worker=truehost03 Ready etcd,worker 61d v1.10.5 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=host03,node-role.kubernetes.io/etcd=true,node-role.kubernetes.io/worker=true
Cụm có ba nút, như được hiển thị: Host01, Host02 và Host03. Sau đó, người dùng phải chọn nút mà họ muốn thêm nhãn.
Ví dụ: đối với nút Host02 có bộ lưu trữ SSD, hãy thêm nhãn mới với loại ổ đĩa chính và giá trị SSD. Để làm như vậy, hãy thực hiện:
kubectl label nodes host02 disktype=ssd
node "host02" labeled
Lệnh trước tuân thủ định dạng. nút nhãn kubectl =. Cuối cùng, chạy để đảm bảo rằng nhãn mới ở bên trong:
kubectl get nodes --show-labelsNAME STATUS ROLES AGE VERSION LABELShost01 Ready controlplane,etcd,worker 61d v1.10.5 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=host01,node-role.kubernetes.io/controlplane=true,node-role.kubernetes.io/etcd=true,node-role.kubernetes.io/worker=truehost02 Ready etcd,worker 61d v1.10.5 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=host02, disktype=ssd,node-role.kubernetes.io/etcd=true,node-role.kubernetes.io/worker=truehost03 Ready etcd,worker 61d v1.10.5 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=host03,node-role.kubernetes.io/etcd=true,node-role.kubernetes.io/worker=true
Host02 hiện có nhãn mới disktype=ssd. Chế độ xem cho phép người dùng xem tất cả các nhãn được gắn vào nút và người dùng cũng có thể chạy:
kubectl describe node "host02"Name: host02Roles: nodeLabels: beta.kubernetes.io/arch=amd64,
beta.kubernetes.io/os=linux,
kubernetes.io/hostname=host02,
disktype=ssd,
node-role.kubernetes.io/etcd=true,
node-role.kubernetes.io/worker=true
Cùng với nhãn disktype=ssd mới được thêm vào, người dùng có thể thấy các nhãn như beta.kubernetes.io/arch và kubernetes.io/hostname. Tất cả đều là nhãn tiêu chuẩn đi kèm với nút Kubernetes. Một số trong số chúng xác định kiến trúc, hệ điều hành hoặc tên máy chủ của nút:
kubernetes.io/hostname
failure-domain.beta.kubernetes.io/zone
failure-domain.beta.kubernetes.io/region
beta.kubernetes.io/instance-type
beta.kubernetes.io/os
beta.kubernetes.io/arch
Chỉ định cho Pod
Để gán Pod cho nút có nhãn mới được thêm, người dùng phải chỉ định trường nodeSelector trong PodSpec. Tệp kê khai của người dùng có thể trông giống như sau:
apiVersion: v1
kind: Pod
metadata:
name: httpd
labels:
env: prod
spec:
containers:
- name: httpd
image: httpd
imagePullPolicy: IfNotPresent
nodeSelector:
disktype: ssd
Trong trường hợp này, người dùng thêm trường spec.nodeSelector vào PodSpec với nhãn disktype:ssd, giống hệt với nhãn của nút. Lưu cấu hình vào test-pod.yaml và chạy:
kubectl create -f test-pod.yaml
Khi lệnh này được thực thi, httpd Pod của người dùng sẽ lên lịch trên nút có nhãn disktype=ssd. Bằng cách chạy kubectl get pod -o wide và kiểm tra "NODE" mà Pod được chỉ định, người dùng có thể xác nhận điều này.
NAME READY STATUS RESTARTS IP NODEpod-test-657c7bccfd-n4jc8 2/2 Running 0 172.17.0.7 host03httpd 2/2 Running 0 172.17.0.21 host02........
Qua những thông tin trong nội dung bài viết trên có thể hiểu rằng nodeselector là một tính năng đơn giản để lập lịch cho Pod với một số hạn chế nhất định. Trong khi đó, người dùng Kubernetes hiện có cơ chế lập lịch Pod linh hoạt và hữu ích hơn, cơ chế này có thể làm được nhiều việc hơn nodeSelector, việc này nhờ vào việc giới thiệu nút ái lực trong Kubernetes 1.2 dưới dạng alpha.
>> Có thể bạn quan tâm: Kubernetes Ingress là gì? Cách tạo Kubernetes Ingress bằng NGINX Controller.