基于UnitedDeployment實(shí)現(xiàn)工作負(fù)載的伸縮
UnitedDeployment支持通過彈性單元Subset來(lái)靈活、便捷地管理多個(gè)同質(zhì)的工作負(fù)載。例如,當(dāng)一個(gè)Deployment需要部署在多個(gè)可用區(qū)時(shí),您可以為每個(gè)可用區(qū)的Deployment定義一個(gè)Subset。UnitedDeployment會(huì)基于Subset實(shí)現(xiàn)細(xì)粒度的資源更新和部署,無(wú)需您手動(dòng)配置多個(gè)Deployment YAML文件。您也可以將UnitedDeployment和HPA配合使用,在集群有計(jì)算資源混用的場(chǎng)景下實(shí)現(xiàn)Pod的順序擴(kuò)容和逆序縮容,從而節(jié)省資源成本。
您可以參見Kruise官方文檔UnitedDeployment了解更多關(guān)于UnitedDeployment的信息。下文結(jié)合典型使用場(chǎng)景介紹如何配置UnitedDeployment YAML。
支持的工作負(fù)載類型
僅支持StatefulSet、Advanced StatefulSet、CloneSet和Deployment。更多信息,請(qǐng)參見使用OpenKruise部署云原生應(yīng)用。
前提條件
已安裝ack-kruise組件。詳細(xì)信息,請(qǐng)參見管理組件。
如需使用ECI資源,需已安裝ACK Virtual Node組件,請(qǐng)參見管理組件。
已通過kubectl工具連接集群。具體操作,請(qǐng)參見獲取集群KubeConfig并通過kubectl工具連接集群。
場(chǎng)景一:UnitedDeployment和HPA配合使用場(chǎng)景
如果您的集群存在多種計(jì)算資源,您可以在UnitedDeployment的YAML中定義所需使用的Subset,通過maxReplicas
字段配置當(dāng)工作負(fù)載副本數(shù)達(dá)到某個(gè)數(shù)值時(shí),超出的副本如何調(diào)度。使用HPA來(lái)控制UnitedDeployment的水平擴(kuò)縮時(shí),Pod擴(kuò)容和縮容順序支持按照自定義的資源順序執(zhí)行順序擴(kuò)容和逆序縮容操作。您需要將HPA的scaleTargetRef
字段配置為UnitedDeployment
及其名稱。
使用本方案時(shí),OpenKruise版本需為v1.5.0及以上。關(guān)于組件的變更說(shuō)明,請(qǐng)參見OpenKruise。
以下示例中,假設(shè)您集群中存在節(jié)點(diǎn)池A(包含ECS包年包月實(shí)例)、節(jié)點(diǎn)池B(包含Spot實(shí)例),期望Pod優(yōu)先部署到ECS包年包月的節(jié)點(diǎn)上,然后再部署到搶占式實(shí)例上,在資源不足時(shí)使用ECI資源。
參見以下自定義UnitedDeployment YAML準(zhǔn)備test.yaml文件。
以下UnitedDeployment文件中配置了Deployment的
template
,并定義了3個(gè)Subset。subset-a、subset-b分別使用節(jié)點(diǎn)池A和節(jié)點(diǎn)池B的資源,即分別使用ECS包年包月實(shí)例和搶占式實(shí)例,副本均為1。
subset-c具備部署在ECI上的
nodeSelectorTerm
和tolerations
,因此會(huì)被部署在ECI節(jié)點(diǎn)資源上,副本為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**** # 需要替換為節(jié)點(diǎn)池A的ID。 replicas: 1 - name: subset-b nodeSelectorTerm: matchExpressions: - key: alibabacloud.com/nodepool-id operator: In values: - np011de1f2de3d48bd8a92a015fc5c**** # 需要替換為節(jié)點(diǎn)池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
執(zhí)行如下命令,部署UnitedDeployment。
kubectl apply -f test.yaml
預(yù)期輸出:
uniteddeployment.apps.kruise.io/ud-nginx created
執(zhí)行如下命令,查看Pod是否成功創(chuàng)建。
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>
預(yù)期輸出表明,Pod按照UnitedDeployment定義的配置部署到不同Subset上,符合預(yù)期。
場(chǎng)景二:多可用區(qū)部署場(chǎng)景
為了保障應(yīng)用的高可用性,您可能需要將應(yīng)用的計(jì)算或存儲(chǔ)資源分布在多個(gè)可用區(qū)上。您可以為不同可用區(qū)的節(jié)點(diǎn)打上對(duì)應(yīng)可用區(qū)的Label,然后在UnitedDeployment的YAML中指定不同Subset下Pod應(yīng)該調(diào)度到哪個(gè)可用區(qū)的節(jié)點(diǎn)上。
準(zhǔn)備3個(gè)位于不同可用區(qū)的節(jié)點(diǎn),參見下方命令為3個(gè)節(jié)點(diǎn)分別打上對(duì)應(yīng)可用區(qū)的label。
例如,位于可用區(qū)a的節(jié)點(diǎn)打上Label
node=zone-a
、可用區(qū)b的節(jié)點(diǎn)打上node=zone-b
、可用區(qū)c的節(jié)點(diǎn)打上node=zone-c
。kubectl label node cn-beijing.10.XX.XX.131 node=zone-a node/cn-beijing.10.80.20.131 labeled # 節(jié)點(diǎn)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 # 節(jié)點(diǎn)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 # 節(jié)點(diǎn)10.XX.XX.133已打上Label node=zone-c。
參見以下自定義UnitedDeployment YAML準(zhǔn)備test.yaml文件。
以下代碼中自定義了StatefulSet的
template
,并為每個(gè)可用區(qū)定義了一個(gè)Subset。在
statefulSetTemplate
字段中定義了StatefulSet的工作負(fù)載模板。UnitedDeployment會(huì)在每個(gè)Subset下按照此模板生成一個(gè)StatefulSet。在
subsets
字段中為每個(gè)可用區(qū)定義了一個(gè)對(duì)應(yīng)的Subset:subset-a的Pod將部署到Label為node=zone-a的節(jié)點(diǎn),subset-b的Pod部署到Label為node=zone-b的節(jié)點(diǎn),subset-c的Pod將部署到Label為node=zone-c的節(jié)點(diǎn)。
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
執(zhí)行如下命令,部署UnitedDeployment。
kubectl apply -f test.yaml
預(yù)期輸出:
uniteddeployment.apps.kruise.io/sample-ud created
執(zhí)行以下命令,查看Pod和StatefulSet是否被成功創(chuàng)建。
kubectl get pod # 預(yù)期輸出 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 # 預(yù)期輸出 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
預(yù)期輸出表明,Pod和StatefulSet已創(chuàng)建成功,分別按順序運(yùn)行在位于可用區(qū)a、b、c的節(jié)點(diǎn)上。
場(chǎng)景三:ECS、ECI資源混合使用場(chǎng)景
為了應(yīng)對(duì)業(yè)務(wù)高峰,您可能需要用多種手段保證集群節(jié)點(diǎn)資源充足,同時(shí)維持合理的成本。在ACK集群中,您可能需要讓應(yīng)用優(yōu)先部署在ECS資源上,并在ECS資源緊張時(shí)指定后續(xù)副本自動(dòng)調(diào)度到ECI Pod上。縮容時(shí),集群也遵循逆序縮容,即先縮容ECI資源,后縮容ECS資源。
以下示例展示如何將第1~4個(gè)副本優(yōu)先調(diào)度到ECS資源上,超過4個(gè)副本(但不超過10個(gè)副本)時(shí)再調(diào)度到ECI資源上。
參見以下自定義UnitedDeployment YAML準(zhǔn)備test.yaml文件。
在
deploymentTemplate
字段中定義了Deployment的工作負(fù)載模板。UnitedDeployment會(huì)在每個(gè)Subset下按照此模板生成一個(gè)StatefulSet。在
subsets
字段中定義了2個(gè)Subset:第1~4個(gè)副本中,Pod調(diào)度到ECS上(滿足ECS最多規(guī)劃4個(gè)副本的需求);第5~10個(gè)確認(rèn)副本中,Pod調(diào)度到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的實(shí)際Name。 minReplicas: 4 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 50
執(zhí)行如下命令,部署UnitedDeployment。
kubectl apply -f test.yaml
預(yù)期輸出:
horizontalpodautoscaler.autoscaling/united-deployment-hpa created
執(zhí)行如下命令,查看Pod狀態(tài)。
kubectl get pod -o wide # 預(yù)期輸出: 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>
預(yù)期輸出表明,Deployment的Pod副本數(shù)目已根據(jù)設(shè)定的調(diào)度策略完成動(dòng)態(tài)分配,即前4個(gè)副本調(diào)度到ECS資源上,第5個(gè)副本起,調(diào)度到ECI資源上。
觸發(fā)HPA縮容,然后執(zhí)行如下命令,查看Pod狀態(tài)。
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>
預(yù)期輸出表明,6個(gè)副本縮容到了4個(gè)副本,優(yōu)先將調(diào)度到ECI上的副本刪除。
相關(guān)文檔
如需同時(shí)擴(kuò)容多個(gè)可用區(qū)的節(jié)點(diǎn),請(qǐng)參見多可用區(qū)同時(shí)快速?gòu)椥詳U(kuò)容。
推薦您搭配節(jié)點(diǎn)伸縮方案使用,在集群的容量規(guī)劃無(wú)法滿足應(yīng)用Pod調(diào)度時(shí)自動(dòng)擴(kuò)容節(jié)點(diǎn)資源,請(qǐng)參見節(jié)點(diǎn)伸縮概述。