高可用是分布式任務執行過程中的重要要求,在ACS叢集中,您可以通過Kubernetes原生調度語義實現分布式任務的跨可用性區域打散,以達到高可用性區域部署的效果。您可以在拓撲分布約束協議欄位TopologyKey中指定拓撲標籤,實現對工作負載的可用性區域打散能力。本文詳細介紹在ACS中拓撲約束的約束條件和使用方式。
前提條件
已安裝調度器組件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或以上。
注意事項
ACS叢集內的節點均為虛擬節點。您可以在拓撲分布約束協議欄位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),對於不同的計算類型,在使用拓撲分布約束的其他協議欄位時還存在以下約束。
計算類型 | 協議欄位 | 含義 | 約束條件 |
| labelSelector | 用於尋找匹配的Pod,匹配此標籤的Pod將被統計,以確定相應拓撲域中Pod的數量。 | 其他計算類型(GPU型、高效能網路GPU型)的Pod在計算匹配數量時不會參與統計。 |
matchLabelKeys | 配合labelSelector使用的標籤鍵列表,用於選擇需要計算分布方式的Pod集合。 | ||
| labelSelector | 用於尋找匹配的Pod,匹配此標籤的Pod將被統計,以確定相應拓撲域中Pod的數量。 | 其他計算類型(通用型、效能型)的Pod在計算匹配數量時將不參與統計。 |
matchLabelKeys | 配合labelSelector使用的標籤鍵列表,用於選擇需要計算分布方式的Pod集合。 | ||
nodeAffinityPolicy | 表示在計算Pod拓撲分布偏差時將如何處理Pod的 nodeAffinity/nodeSelector。 | 不支援。 | |
nodeTaintsPolicy | 表示在計算Pod拓撲分布偏差時將如何處理節點汙點。 | 不支援。 |
關於各欄位詳細資料的說明,請參考拓撲分布約束。
操作步驟
執行以下命令查看叢集中的虛擬節點。
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內容,建立dep-spread-demo.yaml檔案。
apiVersion: apps/v1 kind: Deployment metadata: name: dep-spread-demo labels: app: spread-demo spec: replicas: 4 selector: matchLabels: app: spread-demo template: metadata: labels: app: spread-demo spec: containers: - name: spread-demo image: registry.cn-hangzhou.aliyuncs.com/acs/stress:v1.0.4 command: - "sleep" - "infinity" # 指定可用性區域打散條件,maxSkew指定了各可用性區域之間的Pod數量相差不能超過一個 topologySpreadConstraints: - maxSkew: 1 topologyKey: topology.kubernetes.io/zone whenUnsatisfiable: DoNotSchedule labelSelector: matchLabels: app: spread-demo執行以下命令,將dep-spread-demo部署到叢集。
kubectl apply -f dep-spread-demo.yaml執行以下命令,查看Pod調度的分布情況。
kubectl get pod -o wide預期輸出:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES dep-spread-demo-7c656dbf5f-6twkc 1/1 Running 0 2m29s 192.168.xx.xxx virtual-kubelet-cn-hangzhou-i <none> <none> dep-spread-demo-7c656dbf5f-cgxr8 1/1 Running 0 2m29s 192.168.xx.xxx virtual-kubelet-cn-hangzhou-j <none> <none> dep-spread-demo-7c656dbf5f-f4fz9 1/1 Running 0 2m29s 192.168.xx.xxx virtual-kubelet-cn-hangzhou-j <none> <none> dep-spread-demo-7c656dbf5f-kc6xf 1/1 Running 0 2m29s 192.168.xx.xxx virtual-kubelet-cn-hangzhou-i <none> <none>可以看到4個Pod分布在2個可用性區域。