全部產品
Search
文件中心

Container Service for Kubernetes:在ACK上使用UnitedDeployment

更新時間:Jul 01, 2024

通過UnitedDeployment控制器自訂工作負載模板和彈性單元Subset的策略,可以動態分配在各彈性單元上面的副本數目。本文介紹如何在ACK上安裝以及使用UnitedDeployment實現Auto Scaling,以此支援細粒度的更新和部署策略。

UnitedDeployment介紹

UnitedDeployment是Kruise社區提供的控制器。UnitedDeployment控制器支援通過自訂模板和Subset去建立和管理多個Workload,每個Subset都與一個Workload相關聯。

使用限制

Subset僅可以是StatefulSet、Advanced StatefulSet、CloneSet、Deployment類型。關於資源的詳細資料,請參見使用OpenKruise部署雲原生應用

前提條件

情境一:多可用性區域的精細化部署情境

為了應用的高可用性,往往需要將應用的計算或儲存資源分布在多個可用性區域上。以下樣本介紹如何通過UnitedDeployment實現多可用性區域的精細化調度情境。

  1. 準備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。
  2. 準備自訂的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的節點。

  3. 執行如下命令,部署UnitedDeployment。

    kubectl apply -f test.yaml

    預期輸出:

    uniteddeployment.apps.kruise.io/sample-ud created

    預期輸出表明,UnitedDeployment已建立成功。

  4. 執行如下命令,查看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。

  1. 準備自訂的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節點資源上。

  2. 執行如下命令,部署UnitedDeployment。

    kubectl apply -f test.yaml

    預期輸出:

    uniteddeployment.apps.kruise.io/ud-nginx created
  3. 執行如下命令,查看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擴容和縮容的順序是按自訂的資源順序來執行的。

  1. 準備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及其名稱即可。

  2. 執行如下命令,部署UnitedDeployment。

    kubectl apply -f test.yaml

    預期輸出:

    horizontalpodautoscaler.autoscaling/united-deployment-hpa created

    預期輸出表明,UnitedDeployment已建立成功。

  3. 執行如下命令,查看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副本數目是根據設定的調度策略進行動態分配。

  4. 觸發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上的副本刪除。