通過UnitedDeployment控制器自訂工作負載模板和彈性單元Subset的策略,可以動態分配在各彈性單元上面的副本數目。本文介紹如何在ACK上安裝以及使用UnitedDeployment實現Auto Scaling,以此支援細粒度的更新和部署策略。
UnitedDeployment介紹
UnitedDeployment是Kruise社區提供的控制器。UnitedDeployment控制器支援通過自訂模板和Subset去建立和管理多個Workload,每個Subset都與一個Workload相關聯。
使用限制
Subset僅可以是StatefulSet、Advanced StatefulSet、CloneSet、Deployment類型。關於資源的詳細資料,請參見使用OpenKruise部署雲原生應用。
前提條件
已安裝ack-kruise組件。詳細資料,請參見管理組件。
已通過kubectl工具串連叢集。詳細資料,請參見擷取叢集KubeConfig並通過kubectl工具串連叢集。
如果使用ECI資源,請安裝ACK Virtual Node組件。詳細資料,請參見管理組件。
情境一:多可用性區域的精細化部署情境
為了應用的高可用性,往往需要將應用的計算或儲存資源分布在多個可用性區域上。以下樣本介紹如何通過UnitedDeployment實現多可用性區域的精細化調度情境。
準備3個位於不同可用性區域的節點,為3個節點分別打上對應可用性區域的label。例如位於可用性區域a的節點打上Label:node=zone-a、可位於用區b的節點打上Label:node=zone-b、位於可用性區域c的節點打上Label:node=zone-c。
kubectl label node cn-beijing.10.80.20.131 node=zone-a node/cn-beijing.10.80.20.131 labeled #節點10.80.20.131已打上Label node=zone-a。 kubectl label node cn-beijing.10.80.20.132 node=zone-b node/cn-beijing.10.80.20.132 labeled #節點10.80.20.132已打上Label node=zone-b。 kubectl label node cn-beijing.10.80.20.133 node=zone-c node/cn-beijing.10.80.20.133 labeled #節點10.80.20.133已打上Label node=zone-c。
準備自訂的UnitedDeployment對象YAML。
apiVersion: apps.kruise.io/v1alpha1 kind: UnitedDeployment metadata: name: sample-ud spec: replicas: 6 revisionHistoryLimit: 10 selector: matchLabels: app: sample template: # statefulSetTemplate or advancedStatefulSetTemplate or cloneSetTemplate or deploymentTemplate statefulSetTemplate: metadata: labels: app: sample spec: selector: matchLabels: app: sample template: metadata: labels: app: sample spec: containers: - image: nginx:alpine name: nginx topology: subsets: - name: subset-a nodeSelectorTerm: matchExpressions: - key: node operator: In values: - zone-a replicas: 1 - name: subset-b nodeSelectorTerm: matchExpressions: - key: node operator: In values: - zone-b replicas: 50% - name: subset-c nodeSelectorTerm: matchExpressions: - key: node operator: In values: - zone-c updateStrategy: manualUpdate: partitions: subset-a: 0 subset-b: 0 subset-c: 0 type: Manual
YAML詳解:
在UnitedDeployment對象中,自訂工作負載的template,並為每個可用性區域定義一個Subset。
工作負載是StatefulSet,工作負載模板定義在statefulSetTemplate欄位中。UnitedDeployment會在每個Subset下按照這個模板產生一個StatefulSet。
Subsets欄位為每個可用性區域定義了一個對應的Subset:subset-a的Pod將部署到Label為node=zone-a的節點,subset-b的Pod將部署到Label為node=zone-b的節點,subset-c的Pod將部署到Label為node=zone-c的節點。
執行如下命令,部署UnitedDeployment。
kubectl apply -f test.yaml
預期輸出:
uniteddeployment.apps.kruise.io/sample-ud created
預期輸出表明,UnitedDeployment已建立成功。
執行如下命令,查看Pod和Statefulset是否被成功建立。
kubectl get pod NAME READY STATUS RESTARTS AGE sample-ud-subset-a-cplwg-0 1/1 Running 0 6m5s sample-ud-subset-b-rj7kt-0 1/1 Running 0 6m4s sample-ud-subset-b-rj7kt-1 1/1 Running 0 5m49s sample-ud-subset-b-rj7kt-2 1/1 Running 0 5m43s sample-ud-subset-c-g6jvx-0 1/1 Running 0 6m5s sample-ud-subset-c-g6jvx-1 1/1 Running 0 5m51s kubectl get statefulset NAME READY AGE sample-ud-subset-a-cplwg 1/1 7m34s sample-ud-subset-b-rj7kt 3/3 7m34s sample-ud-subset-c-g6jvx 2/2 7m34s
預期輸出表明,Pod和Statefulset已建立成功。
情境二:ECS、ECI資源混合使用情境
為了應對業務高峰,需要用多種手段保證叢集節點資源充足,同時又希望維持合理的成本,所以常常需要在同一個叢集內讓應用既可部署在ECS上,也可以在ECS資源緊張時自動使用ECI。
準備自訂的UnitedDeployment對象YAML。
apiVersion: apps.kruise.io/v1alpha1 kind: UnitedDeployment metadata: name: ud-nginx spec: replicas: 6 revisionHistoryLimit: 10 selector: matchLabels: app: ud-nginx template: # statefulSetTemplate or advancedStatefulSetTemplate or cloneSetTemplate or deploymentTemplate deploymentTemplate: metadata: labels: app: ud-nginx spec: selector: matchLabels: app: ud-nginx template: metadata: labels: app: ud-nginx spec: containers: - image: nginx:alpine name: nginx topology: subsets: - name: subset-a nodeSelectorTerm: matchExpressions: - key: alibabacloud.com/nodepool-id operator: In values: - np92019eec42004d878fcdc990fcb9**** #需要替換為節點池A的ID。 replicas: 1 - name: subset-b nodeSelectorTerm: matchExpressions: - key: alibabacloud.com/nodepool-id operator: In values: - np011de1f2de3d48bd8a92a015fc5c**** #需要替換為節點池B的ID。 replicas: 1 - name: subset-c nodeSelectorTerm: matchExpressions: - key: node operator: In values: - zone-c replicas: 1 - name: subset-eci nodeSelectorTerm: matchExpressions: - key: type operator: In values: - virtual-kubelet tolerations: - key: virtual-kubelet.io/provider operator: Exists replicas: 3 updateStrategy: manualUpdate: partitions: subset-a: 0 subset-b: 0 subset-c: 0 type: Manual
YAML詳解:
subset-a、subset-b和subset-c均使用ECS資源,並指定了副本數,這三個Subset的指定副本數的Pod將部署在滿足條件的ECS節點上。
最後的subset-d具備部署在ECI上的nodeSelectorTerm和Toleration,因此會被部署在ECI節點資源上。
執行如下命令,部署UnitedDeployment。
kubectl apply -f test.yaml
預期輸出:
uniteddeployment.apps.kruise.io/ud-nginx created
執行如下命令,查看Pod是否成功建立。
kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES ud-nginx-subset-a-7lbtd-5b5bd77549-5bw6l 1/1 Running 0 73s 192.168.0.126 cn-hangzhou.10.80.20.131 <none> <none> ud-nginx-subset-b-nvvfw-5c9bcd6766-lv6sp 1/1 Running 0 73s 192.168.10.239 cn-hangzhou.10.80.20.132 <none> <none> ud-nginx-subset-c-r2mkr-7675856649-vh7zr 1/1 Running 0 73s 192.168.0.127 cn-hangzhou.10.80.20.133 <none> <none> ud-nginx-subset-d-m78fd-7796b66fd8-7p52j 1/1 Running 0 73s 192.168.0.130 virtual-kubelet-cn-hangzhou-h <none> <none> ud-nginx-subset-d-m78fd-7796b66fd8-fd7f7 1/1 Running 0 73s 192.168.0.129 virtual-kubelet-cn-hangzhou-h <none> <none> ud-nginx-subset-d-m78fd-7796b66fd8-mn4qb 1/1 Running 0 73s 192.168.0.131 virtual-kubelet-cn-hangzhou-h <none> <none>
預期輸出表明,Pod按照UnitedDeployment對象定義部署,符合預期。
情境三:UnitedDeployment和HPA配合使用
如您需要HPA和UnitedDeployment配合使用,您的Kruise版本需要為v1.5.0及以上。
當您想在副本數目達到某個數值後,控制超出副本的調度策略,比如副本數10以內優先使用訂用帳戶的ECS資源,超出10個不超出20個的使用Spot資源,超出20個的再使用ECI資源。UnitedDeployment需要使用欄位maxReplicas
,超出則使用優先順序低的資源。可以通過設定HPA來控制UnitedDeployment的水平擴縮,Pod擴容和縮容的順序是按自訂的資源順序來執行的。
準備test.yaml檔案。
apiVersion: apps.kruise.io/v1alpha1 kind: UnitedDeployment metadata: name: ud-nginx spec: replicas: 6 selector: matchLabels: app: sample template: deploymentTemplate: metadata: labels: app: sample spec: selector: matchLabels: app: sample template: metadata: labels: app: sample spec: containers: - image: nginx:alpine name: nginx resources: requests: cpu: "500m" topology: subsets: - name: ecs maxReplicas: 4 - name: eci maxReplicas: null --- apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: united-deployment-hpa spec: scaleTargetRef: apiVersion: apps.kruise.io/v1alpha1 kind: UnitedDeployment name: ud-nginx #需要替換為UnitedDeployment的實際Name。 minReplicas: 4 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 50
YAML詳解:
第4個副本,Pod會調度到ECS上(滿足ECS最多規劃4個副本的需求)。
第5個副本,Pod會調度到ECI上(滿足ECI彈性需求)。
5個副本縮容到4個副本時,優先縮容ECI上的副本。
縮容到4個副本以下時,縮容部署在ECS上的Pods。
HPA與UnitedDeployment配合使用時,HPA的scaleTargetRef欄位配置為UnitedDeployment及其名稱即可。
執行如下命令,部署UnitedDeployment。
kubectl apply -f test.yaml
預期輸出:
horizontalpodautoscaler.autoscaling/united-deployment-hpa created
預期輸出表明,UnitedDeployment已建立成功。
執行如下命令,查看Pod狀態。
kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES ud-nginx-eci-dxfbz-864bdb77b-2d4t9 1/1 Running 0 3m9s 192.168.5.129 cn-hangzhou.192.168.5.120 <none> <none> ud-nginx-eci-dxfbz-864bdb77b-zppfh 1/1 Running 0 3m9s 192.168.8.11 cn-hangzhou.192.168.8.251 <none> <none> ud-nginx-ecs-5lm7r-868c4ccd5d-5mlgh 1/1 Running 0 3m9s 192.168.8.4 cn-hangzhou.192.168.8.251 <none> <none> ud-nginx-ecs-5lm7r-868c4ccd5d-6bdkz 1/1 Running 0 3m9s 192.168.6.145 cn-hangzhou.192.168.6.32 <none> <none> ud-nginx-ecs-5lm7r-868c4ccd5d-dnsfl 1/1 Running 0 3m9s 192.168.6.150 cn-hangzhou.192.168.6.20 <none> <none> ud-nginx-ecs-5lm7r-868c4ccd5d-mrzwc 1/1 Running 0 3m9s 192.168.5.128 cn-hangzhou.192.168.5.120 <none> <none>
預期輸出表明,Deployment的Pod副本數目是根據設定的調度策略進行動態分配。
觸發HPA縮容,然後執行如下命令,查看Pod狀態。
kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES ud-nginx-ecs-5lm7r-868c4ccd5d-5mlgh 1/1 Running 0 8m14s 192.168.8.4 cn-hangzhou.192.168.8.251 <none> <none> ud-nginx-ecs-5lm7r-868c4ccd5d-6bdkz 1/1 Running 0 8m14s 192.168.6.145 cn-hangzhou.192.168.6.32 <none> <none> ud-nginx-ecs-5lm7r-868c4ccd5d-dnsfl 1/1 Running 0 8m14s 192.168.6.150 cn-hangzhou.192.168.6.20 <none> <none> ud-nginx-ecs-5lm7r-868c4ccd5d-mrzwc 1/1 Running 0 8m14s 192.168.5.128 cn-hangzhou.192.168.5.120 <none> <none>
預期輸出表明,6個副本縮容到4個副本,會優先將調度到ECI上的副本刪除。