Pod間親和性調度策略,用於表達Pod之間的親和性偏好,相較於節點親和性,Pod間親和性調度支援基於已經在虛擬節點上啟動並執行Pod的標籤來約束Pod可以調度到的範圍。在ACS叢集中,您可以通過Kubernetes原生調度語義實現Pod間親和性調度,通過在podAffinity或podAntiAffinity欄位中填寫拓撲域和標籤規則,可以將Pod調度到指定的拓撲域。本文詳細介紹在ACS中使用Pod間親和性調度的約束條件和使用方式。
前提條件
已安裝調度器組件kube-scheduler,且版本滿足以下要求。
ACS叢集版本
調度器組件版本
1.31
v1.31.0-aliyun-1.2.0及以上
1.30
v1.30.3-aliyun-1.1.1及以上
1.28
v1.28.9-aliyun-1.1.0及以上
已安裝acs-virtual-node組件,版本為v2.12.0-acs.4或以上。
注意事項
Pod間親和性功能包括親和性和反親和性兩種使用方式,兩種方式的協議格式相同,都由requiredDuringSchedulingIgnoredDuringExecution和preferredDuringSchedulingIgnoredDuringExecution組成,其中必填的協議欄位是拓撲域標籤TopologyKey,對應虛擬節點中的標籤。針對不同種類的虛擬節點,ACS分別支援以下拓撲標籤。
虛擬節點類型 | Label | 含義 | 範例 |
普通虛擬節點 | topology.kubernetes.io/zone | 網路可用性區域 | topology.kubernetes.io/zone: cn-shanghai-b |
高效能網路GPU型虛擬節點 | topology.kubernetes.io/zone | 網路可用性區域 | topology.kubernetes.io/zone: cn-shanghai-b |
alibabacloud.com/hpn-zone | 高速網路可用性區域 | alibabacloud.com/hpn-zone: B1 |
ACS支援多種計算類型(compute class),對於不同的計算類型,在使用Pod間親和性的其他協議時還存在以下約束。
requiredDuringSchedulingIgnoredDuringExecution協議。計算類型
欄位
含義
約束條件
通用型
效能型
LabelSelector
用於尋找匹配的Pod,匹配此標籤的Pod將被統計,以確定相應拓撲域中Pod的數量。
其它計算類型(GPU型、高效能網路GPU型)的Pod在計算匹配數量時將不參與統計。
Namespaces
用於指定尋找匹配命名空間,搭配LabelSelector使用。
NamespaceSelector
與Namespaces欄位類似,區別在於是通過命名空間的標籤進行尋找。
GPU型
高效能網路GPU型
LabelSelector
同上,略。
其它計算類型(通用型、效能型)的Pod在計算匹配數量時將不參與統計。
Namespaces
同上,略。
不支援
NamespaceSelector
同上,略。
不支援
preferredDuringSchedulingIgnoredDuringExecution協議。計算類
欄位
含義
約束條件
通用型
效能型
LabelSelector
Namespaces
NamespaceSelector
略
其它計算類型(GPU型、高效能網路GPU型)的Pod在計算匹配數量時將不參與統計。
GPU型
高效能網路GPU型
所有欄位
略
不支援
關於各欄位詳細資料的說明,請參見Pod間親和性與反親和性。
操作樣本
樣本中展示了通過配置podAffinity將應用調度到指定可用性區域的效果。
執行以下命令查看叢集中的虛擬節點。
kubectl get node預期輸出:
NAME STATUS ROLES AGE VERSION virtual-kubelet-cn-hangzhou-i Ready agent 5h42m v1.28.3-xx virtual-kubelet-cn-hangzhou-j Ready agent 5h42m v1.28.3-xx使用以下YAML內容,建立with-affinity-pod.yaml檔案。
apiVersion: v1 kind: Pod metadata: labels: pod-affinity-label: with-pod-affinity name: with-affinity-label-pod spec: containers: - args: - 'infinity' command: - sleep image: registry-cn-hangzhou.ack.aliyuncs.com/acs/stress:v1.0.4 imagePullPolicy: IfNotPresent name: stress resources: limits: cpu: '1' memory: 1Gi requests: cpu: '1' memory: 1Gi執行以下命令,將with-affinity-label-pod部署到叢集。
kubectl apply -f with-affinity-pod.yaml執行以下命令,查看Pod調度的分布情況。
kubectl get pod -o wide預期輸出:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES with-affinity-label-pod 1/1 Running 0 75s 192.168.xx.xxx virtual-kubelet-cn-hangzhou-i <none> <none>可以看到Pod已經被調度到可用性區域cn-hangzhou-i。
使用以下YAML內容,建立origin-affinity-pod.yaml檔案。
apiVersion: apps/v1 kind: Deployment metadata: name: dep-pod-affinity labels: app: pod-affinity-demo spec: replicas: 4 selector: matchLabels: app: pod-affinity-demo template: metadata: labels: app: pod-affinity-demo spec: containers: - name: pod-affinity-demo image: registry-cn-hangzhou.ack.aliyuncs.com/acs/stress:v1.0.4 command: - "sleep" - "infinity" resources: limits: cpu: '1' memory: 1Gi requests: cpu: '1' memory: 1Gi # 指定Pod間親和性,表示需要和帶有<pod-affinity-label:with-pod-affinity>標籤的Pod部署在同一個可用性區域 affinity: podAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: pod-affinity-label operator: In values: - with-pod-affinity topologyKey: topology.kubernetes.io/zone執行以下命令,將origin-affinity-pod.yaml部署到叢集。
kubectl apply -f origin-affinity-pod.yaml執行以下命令,查看Pod調度的分布情況。
kubectl get pod -o wide預期輸出:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES dep-pod-affinity-6b9d4f7c87-5jlfx 1/1 Running 0 3m26s 192.168.xx.xxx virtual-kubelet-cn-hangzhou-i <none> <none> dep-pod-affinity-6b9d4f7c87-hwdpc 1/1 Running 0 3m26s 192.168.xx.xxx virtual-kubelet-cn-hangzhou-i <none> <none> dep-pod-affinity-6b9d4f7c87-jfcrq 1/1 Running 0 3m26s 192.168.xx.xxx virtual-kubelet-cn-hangzhou-i <none> <none> dep-pod-affinity-6b9d4f7c87-xwbfr 1/1 Running 0 3m26s 192.168.xx.xxx virtual-kubelet-cn-hangzhou-i <none> <none> with-affinity-label-pod 1/1 Running 0 6m30s 192.168.xx.xxx virtual-kubelet-cn-hangzhou-i <none> <none>可以看到所有Pod都分布在同一個可用性區域。