Sử dụng Node Affinity trong Kubernetes

theanh

Administrator
Nhân viên
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,
  1. requiredDuringSchedulingIgnoredDuringExecution và
  2. preferredDuringSchedulingIgnoredDuringExecution.
Node affinity là gì Trong quá trình Lên lịch
  • Ở đâ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.
Trong quá trình Thực hiện là gì
  • Ở đây, pod đã chạy và thay đổi được thực hiện trong môi trường ảnh hưởng đến nodeAffinity.
Để biết chi tiết về Node Affinity, hãy truy cập kubernete.iotài liệu chính thức của Kubernetes.

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​

  1. 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ì?​

  1. 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
Kiểm tra xem các node có Taints không.
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
Tạo một triển khai từ định nghĩa mà chúng ta đã tạo.
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

Kết luận​

Trong bài viết này, chúng ta đã học cách thêm nhãn vào các nút và thấy cách các pod có thể được hạn chế để được lên lịch trên các nút cần thiết bằng cách sử dụng Node Affinity. Chúng ta cũng thấy rằng các pod thậm chí có thể được triển khai trên nút chính nếu nó không có bất kỳ Taint nào trên đó.
 
Back
Bên trên