Node affinity là một tập hợp các quy tắc. Nó được trình lập lịch sử dụng để quyết định vị trí có thể đặt một pod trong cụm. Các quy tắc được xác định bằng cách sử dụng nhãn trên các nút và bộ chọn nhãn được chỉ định trong định nghĩa của pod. Node affinity cho phép apod chỉ định một affinity đối với một nhóm các nút mà nó có thể được lập lịch. Chúng ta có thể giới hạn aPod chỉ có thể chạy trên một hoặc nhiều Node cụ thể.
nodeSelect là dạng ràng buộc lựa chọn node đơn giản nhất.nodeSelect là thuộc tính của PodSpec. Để pod đủ điều kiện chạy trên một nút, nút đó phải có từng nhãn được chỉ định.
Node affinity về mặt khái niệm tương tự như nodeSelector-- nó cho phép chúng ta giới hạn các nút mà pod của chúng ta đủ điều kiện để được lên lịch dựa trên các nhãn trên nút.
Hiện tại có hai loại node affinity,
Trong bài viết này, chúng ta sẽ xem cách chỉ định Kubernetes Pod cho một nút cụ thể bằng cách sử dụng "requiredDuringSchedulingIgnoredDuringExecution" Node Affinity trong cụm Kubernetes.
Kiểm tra xem các node có Taints không.
Thêm nhãn vào node worker node01.
Tạo tệp adeploymentdefinition và thêm định nghĩa sau vào đó.
Lấy danh sách các Pod và Deployment.
Tạo một triển khai từ định nghĩa mà chúng ta đã tạo.
Lấy thông tin chi tiết về các Pod được tạo bởi triển khai.
Ở đây có thể thấy rằng các Pod cũng đang nhận được các vị trí trong nút chính. Lý do cho việc này là các nút không có Taints trên chúng nên các pod có thể có được vị trí trên bất kỳ nút nào có sẵn.
Bây giờ, hãy tạo một định nghĩa triển khai với node affinity được định nghĩa.
Lấy danh sách các triển khai hiện có và tạo một triển khai mới có mối quan hệ trong không gian tên mặc định bằng cách sử dụng tệp được tạo ở bước trên.
Bây giờ, có thể thấy rằng các Pod lần này chỉ được đặt trên nút công nhân node01. Lý do cho điều này là chúng tôi đã định nghĩa một mối quan hệ nút trong định nghĩa triển khai để đảm bảo rằng các pod được triển khai trên các nút khớp với điều kiện/nhãn đã định nghĩa.
nodeSelect là dạng ràng buộc lựa chọn node đơn giản nhất.nodeSelect là thuộc tính của PodSpec. Để pod đủ điều kiện chạy trên một nút, nút đó phải có từng nhãn được chỉ định.
Node affinity về mặt khái niệm tương tự như nodeSelector-- nó cho phép chúng ta giới hạn các nút mà pod của chúng ta đủ điều kiện để được lên lịch dựa trên các nhãn trên nút.
Hiện tại có hai loại node affinity,
- requiredDuringSchedulingIgnoredDuringExecution và
- preferredDuringSchedulingIgnoredDuringExecution.
- Ở đây, pod chưa được tạo và sẽ được tạo lần đầu tiên.
- Thông thường khi pod được tạo, các quy tắc về mối quan hệ sẽ được áp dụng.
- Ở đây, pod đã chạy và thay đổi được thực hiện trong môi trường ảnh hưởng đến nodeAffinity.
Trong bài viết này, chúng ta sẽ xem cách chỉ định Kubernetes Pod cho một nút cụ thể bằng cách sử dụng "requiredDuringSchedulingIgnoredDuringExecution" Node Affinity trong cụm Kubernetes.
Điều kiện tiên quyết
- Cụm Kubernetes có ít nhất 1 nút công nhân.
Nếu bạn muốn tìm hiểu cách tạo Cụm Kubernetes, hãy nhấp vào đây. Hướng dẫn này sẽ giúp bạn tạo cụm Kubernetes với 1 Master và 2 Node trên AWS Ubuntu EC2 Instances.
Chúng ta sẽ làm gì?
- Cấu hình Node-Affinity
Cấu hình Node-Affinity
Trước hết, hãy lấy danh sách các node có trong cụm.
Mã:
kubectl get nodes #Lấy tất cả các node trong cụm
Mã:
kubectl describe node node01 | grep Taints #Mô tả node node01 và grep Taints
Mã:
kubectl describe node master | grep Taints#Mô tả node master và grep Taints
Thêm nhãn vào node worker node01.
Mã:
kubectl label node node01 app=qa #Thêm nhãn
Tạo tệp adeploymentdefinition và thêm định nghĩa sau vào đó.
Mã:
vim my-deployment-without-affinity.yml
Mã:
apiVersion: apps/v1kind: Deploymentmetadata: name: app-without-affinityspec: replicas: 20 selector: matchLabels: run: nginx template: metadata: labels: run: nginx spec: containers: - image: nginx imagePullPolicy: Always name: nginx
Lấy danh sách các Pod và Deployment.
Mã:
kubectl get pods #Lấy pods trong không gian tên mặc định
Mã:
kubectl get deployment #Lấy các triển khai trong không gian tên mặc định
Mã:
kubectl create -f my-deployment-without-affinity.yml #Tạo một đối tượng triển khai
Mã:
kubectl get implementation#Lấy các triển khai trong không gian tên mặc định
Mã:
kubectl get pods#Lấy các triển khai trong không gian tên mặc định
Lấy thông tin chi tiết về các Pod được tạo bởi triển khai.
Ở đây có thể thấy rằng các Pod cũng đang nhận được các vị trí trong nút chính. Lý do cho việc này là các nút không có Taints trên chúng nên các pod có thể có được vị trí trên bất kỳ nút nào có sẵn.
Mã:
kubectl get pods -o wide#Getpods trong không gian tên mặc định với nhiều thông tin hơn về chúng bằng cách sử dụng -o wide
Bây giờ, hãy tạo một định nghĩa triển khai với node affinity được định nghĩa.
Mã:
vim my-deployment-with-affinity.yml
Mã:
apiVersion: apps/v1kind: Triển khaimetadata: name: app-with-afiinityspec: replicas: 6 selector: matchLabels: run: nginx template: metadata: labels: run: nginx spec: containers: - image: nginx imagePullPolicy: Always name: nginx affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: toán tử ứng dụng: Trong các giá trị: - qa
Lấy danh sách các triển khai hiện có và tạo một triển khai mới có mối quan hệ trong không gian tên mặc định bằng cách sử dụng tệp được tạo ở bước trên.
Mã:
kubectl get deployments#Lấy các triển khai trong không gian tên mặc định
Mã:
kubectl create -f my-deployment-with-affinity.yml#Tạo một đối tượng triển khai
Mã:
kubectl get deployments#Lấy các triển khai trong không gian tên mặc định
Bây giờ, có thể thấy rằng các Pod lần này chỉ được đặt trên nút công nhân node01. Lý do cho điều này là chúng tôi đã định nghĩa một mối quan hệ nút trong định nghĩa triển khai để đảm bảo rằng các pod được triển khai trên các nút khớp với điều kiện/nhãn đã định nghĩa.
Mã:
kubectl get pods -o wide | grep app-with-afiinity#Getpodsin không gian tên mặc định với nhiều thông tin hơn về chúng bằng cách sử dụng -o wide và grepapp-with-afiinity