日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

基于UnitedDeployment實現工作負載的伸縮

UnitedDeployment支持通過彈性單元Subset來靈活、便捷地管理多個同質的工作負載。例如,當一個Deployment需要部署在多個可用區時,您可以為每個可用區的Deployment定義一個Subset。UnitedDeployment會基于Subset實現細粒度的資源更新和部署,無需您手動配置多個Deployment YAML文件。您也可以將UnitedDeployment和HPA配合使用,在集群有計算資源混用的場景下實現Pod的順序擴容和逆序縮容,從而節省資源成本。

您可以參見Kruise官方文檔UnitedDeployment了解更多關于UnitedDeployment的信息。下文結合典型使用場景介紹如何配置UnitedDeployment YAML。

支持的工作負載類型

僅支持StatefulSet、Advanced StatefulSet、CloneSet和Deployment。更多信息,請參見使用OpenKruise部署云原生應用。

前提條件

場景一:UnitedDeployment和HPA配合使用場景

如果您的集群存在多種計算資源,您可以在UnitedDeployment的YAML中定義所需使用的Subset,通過maxReplicas字段配置當工作負載副本數達到某個數值時,超出的副本如何調度。使用HPA來控制UnitedDeployment的水平擴縮時,Pod擴容和縮容順序支持按照自定義的資源順序執行順序擴容和逆序縮容操作。您需要將HPAscaleTargetRef字段配置為UnitedDeployment及其名稱。

重要

使用本方案時,OpenKruise版本需為v1.5.0及以上。關于組件的變更說明,請參見OpenKruise

image

以下示例中,假設您集群中存在節點池A(包含ECS包年包月實例)、節點池B(包含Spot實例),期望Pod優先部署到ECS包年包月的節點上,然后再部署到搶占式實例上,在資源不足時使用ECI資源。

  1. 參見以下自定義UnitedDeployment YAML準備test.yaml文件。

    以下UnitedDeployment文件中配置了Deployment的template,并定義了3個Subset。

    • subset-a、subset-b分別使用節點池A和節點池B的資源,即分別使用ECS包年包月實例和搶占式實例,副本均為1。

    • subset-c具備部署在ECI上的nodeSelectorTermtolerations,因此會被部署在ECI節點資源上,副本為3。

    apiVersion: apps.kruise.io/v1alpha1
    kind: UnitedDeployment
    metadata:
      name: ud-nginx
    spec:
      replicas: 6
      revisionHistoryLimit: 10
      selector:
        matchLabels:
          app: ud-nginx
      template:
        deploymentTemplate:
          metadata:
            labels:
              app: ud-nginx
          spec:
            selector:
              matchLabels:
                app: ud-nginx
            template:
              metadata:
                labels:
                  app: ud-nginx
              spec:
                containers:
                - image: alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/nginx_optimized:20240221-1.20.1-2.3.0
                  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: 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
  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.XX.XX.126    cn-hangzhou.10.XX.XX.131       <none>           <none>
    ud-nginx-subset-b-nvvfw-5c9bcd6766-lv6sp   1/1     Running   0          73s   192.XX.XX.239    cn-hangzhou.10.XX.XX.132      <none>           <none>
    ud-nginx-subset-c-m78fd-7796b66fd8-7p52j   1/1     Running   0          73s   192.XX.XX.130    virtual-kubelet-cn-hangzhou-h   <none>           <none>
    ud-nginx-subset-c-m78fd-7796b66fd8-fd7f7   1/1     Running   0          73s   192.XX.XX.129    virtual-kubelet-cn-hangzhou-h   <none>           <none>
    ud-nginx-subset-c-m78fd-7796b66fd8-mn4qb   1/1     Running   0          73s   192.XX.XX.131    virtual-kubelet-cn-hangzhou-h   <none>           <none>

    預期輸出表明,Pod按照UnitedDeployment定義的配置部署到不同Subset上,符合預期。

場景二:多可用區部署場景

為了保障應用的高可用性,您可能需要將應用的計算或存儲資源分布在多個可用區上。您可以為不同可用區的節點打上對應可用區的Label,然后在UnitedDeployment的YAML中指定不同Subset下Pod應該調度到哪個可用區的節點上。

image
  1. 準備3個位于不同可用區的節點,參見下方命令為3個節點分別打上對應可用區的label。

    例如,位于可用區a的節點打上Label node=zone-a、可用區b的節點打上node=zone-b、可用區c的節點打上node=zone-c。

    kubectl label node cn-beijing.10.XX.XX.131 node=zone-a
    node/cn-beijing.10.80.20.131 labeled # 節點10.XX.XX.131已打上Label node=zone-a。
    kubectl label node cn-beijing.10.XX.XX.132 node=zone-b
    node/cn-beijing.10.80.20.132 labeled  # 節點10.XX.XX.132已打上Label node=zone-b。
    kubectl label node cn-beijing.10.XX.XX.133 node=zone-c
    node/cn-beijing.10.80.20.133 labeled  # 節點10.XX.XX.133已打上Label node=zone-c。
  2. 參見以下自定義UnitedDeployment YAML準備test.yaml文件。

    以下代碼中自定義了StatefulSet的template,并為每個可用區定義了一個Subset。

    • statefulSetTemplate字段中定義了StatefulSet的工作負載模板。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的節點。

    apiVersion: apps.kruise.io/v1alpha1
    kind: UnitedDeployment
    metadata:
      name: sample-ud
    spec:
      replicas: 6
      revisionHistoryLimit: 10
      selector:
        matchLabels:
          app: sample
      template:
        statefulSetTemplate:
          metadata:
            labels:
              app: sample
          spec:
            selector:
              matchLabels:
                app: sample
            template:
              metadata:
                labels:
                  app: sample
              spec:
                containers:
                - image: alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/nginx_optimized:20240221-1.20.1-2.3.0
                  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
  3. 執行如下命令,部署UnitedDeployment。

    kubectl apply -f test.yaml

    預期輸出:

    uniteddeployment.apps.kruise.io/sample-ud created
  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已創建成功,分別按順序運行在位于可用區a、b、c的節點上。

場景三:ECS、ECI資源混合使用場景

為了應對業務高峰,您可能需要用多種手段保證集群節點資源充足,同時維持合理的成本。在ACK集群中,您可能需要讓應用優先部署在ECS資源上,并在ECS資源緊張時指定后續副本自動調度到ECI Pod上。縮容時,集群也遵循逆序縮容,即先縮容ECI資源,后縮容ECS資源。

image

以下示例展示如何將第1~4個副本優先調度到ECS資源上,超過4個副本(但不超過10個副本)時再調度到ECI資源上。

  1. 參見以下自定義UnitedDeployment YAML準備test.yaml文件。

    • deploymentTemplate字段中定義了Deployment的工作負載模板。UnitedDeployment會在每個Subset下按照此模板生成一個Deployment。

    • subsets字段中定義了2個Subset:第1~4個副本中,Pod調度到ECS上(滿足ECS最多規劃4個副本的需求);第5~10個確認副本中,Pod調度到ECI上(滿足ECI彈性需求)。

    apiVersion: apps.kruise.io/v1alpha1
    kind: UnitedDeployment
    metadata:
      name: ud-nginx
    spec:
      replicas: 6
      selector:
        matchLabels:
          app: sample
      template:
      # statefulSetTemplate or advancedStatefulSetTemplate or cloneSetTemplate or deploymentTemplate
        deploymentTemplate:
          metadata:
            labels:
              app: sample
          spec:
            selector:
              matchLabels:
                app: sample
            template:
              metadata:
                labels:
                  app: sample
              spec:
                containers:
                - image: alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/nginx_optimized:20240221-1.20.1-2.3.0
                  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
  2. 執行如下命令,部署UnitedDeployment。

    kubectl apply -f test.yaml

    預期輸出:

    horizontalpodautoscaler.autoscaling/united-deployment-hpa created
  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.XX.XX.129   cn-hangzhou.192.XX.XX.120   <none>           <none>
    ud-nginx-eci-dxfbz-864bdb77b-zppfh    1/1     Running   0             3m9s   192.XX.XX.11    cn-hangzhou.192.XX.XX.251   <none>           <none>
    ud-nginx-ecs-5lm7r-868c4ccd5d-5mlgh   1/1     Running   0             3m9s   192.XX.XX.4     cn-hangzhou.192.XX.XX.251   <none>           <none>
    ud-nginx-ecs-5lm7r-868c4ccd5d-6bdkz   1/1     Running   0             3m9s   192.XX.XX.145   cn-hangzhou.192.XX.XX.32    <none>           <none>
    ud-nginx-ecs-5lm7r-868c4ccd5d-dnsfl   1/1     Running   0             3m9s   192.XX.XX.150   cn-hangzhou.192.XX.XX.20    <none>           <none>
    ud-nginx-ecs-5lm7r-868c4ccd5d-mrzwc   1/1     Running   0             3m9s   192.XX.XX.128   cn-hangzhou.192.XX.XX.120   <none>           <none>

    預期輸出表明,Deployment的Pod副本數目已根據設定的調度策略完成動態分配,即前4個副本調度到ECS資源上,第5個副本起,調度到ECI資源上。

  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上的副本刪除。

相關文檔