应用容器水平伸缩HPA(Horizontal Pod Autoscaling)可以动态调整应用的副本数,适应业务流量的波峰波谷,适用于Deployment、StatefulSet等实现Scale接口的对象。本文介绍如何在ACK One应用分发中使用容器水平伸缩(HPA)控制关联集群的应用副本数。
前提条件
已开启舰队管理功能。具体操作,请参见开启舰队管理功能。
舰队的Fleet实例已添加多个关联集群。具体操作,请参见添加关联集群。
已从ACK One控制台获取Fleet实例的KubeConfig,并通过kubectl连接至Fleet实例。
已安装AMC命令行工具。具体操作,请参见AMC命令行帮助。
背景信息
应用通过Fleet实例分发后,Fleet实例每5分钟查看关联集群,并保证应用相关资源在关联集群和Fleet实例中的一致性。因此,直接使用容器水平伸缩(HPA)修改副本数会和Fleet实例应用一致性功能冲突,需要在应用分发中使用容器水平伸缩(HPA)控制关联集群的应用副本数。
操作步骤
执行以下命令,创建命名空间。
替换
demo
为待创建的命名空间名称。kubectl create namespace demo
执行以下命令,获取关联集群。
kubectl amc get managedcluster
预期输出:
Name Alias HubAccepted c4a416e**** cluster1 true
在Fleet实例上创建Deployment和容器水平伸缩(HPA)资源。
使用以下内容,创建app-meta.yaml文件,包括Deployment和容器水平伸缩(HPA)资源。
apiVersion: apps/v1 kind: Deployment metadata: name: nginx namespace: demo labels: app: nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 80 resources: requests: cpu: 500m --- apiVersion: autoscaling/v2beta2 kind: HorizontalPodAutoscaler metadata: name: nginx-hpa namespace: demo spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: nginx minReplicas: 1 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 50
执行以下命令,将资源下发到Fleet实例。
kubectl apply -f app-meta.yaml
创建应用分发规则,通过创建apply-once policy使Fleet实例忽略Deployment副本数的变化,不再保持Deployment的副本数和Fleet实例的一致性。
使用以下内容,创建app.yaml文件,定义应用分发规则。
apiVersion: core.oam.dev/v1beta1 kind: Application metadata: name: nginx namespace: demo annotations: app.oam.dev/publishVersion: version1 spec: components: - name: nginx type: ref-objects properties: objects: - apiVersion: apps/v1 kind: Deployment name: nginx - apiVersion: autoscaling/v1 kind: HorizontalPodAutoscaler name: nginx-hpa policies: - name: apply-once type: apply-once #apply-once policy定义Fleet实例忽略哪些资源,哪些字段的变化。 properties: enable: true #开启apply-once功能。 rules: - selector: componentNames: [ "nginx" ] #选择特定的资源名称启动apply-once,本示例为Deployment名称nginx。 resourceTypes: [ "Deployment" ] #通过资源类型选择特定资源启用apply-once。 strategy: path: [ "spec.replicas" ] #选择资源中的特定字段启用apply-once。 - type: topology name: beijing-clusters properties: clusters: ["c4a416e****"]
执行以下命令,将分发规则下发到Fleet实例,Fleet实例根据分发规则,将Deployment和容器水平伸缩(HPA)下发到关联集群中。
kubectl apply -f app.yaml
执行以下命令,查看应用部署情况。
替换
demo
为您已创建的命名空间名称。kubectl get app nginx -n demo
预期输出:
NAME COMPONENT TYPE PHASE HEALTHY STATUS AGE nginx nginx ref-objects running true Ready:2/2 51s
执行如下命令,获取关联集群的资源运行状态。
kubectl amc get deployment,hpa -n demo -m c4a416e****
预期输出:
Run on ManagedCluster c4a416exxx (cluster1) NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/nginx 2/2 2 2 63s NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE horizontalpodautoscaler.autoscaling/nginx-hpa Deployment/nginx 0%/50% 1 10 2 63s
当HPA生效后,执行以下命令,查看应用副本数。
kubectl amc get pod -n demo -m c4a416e****
预期输出:
Run on ManagedCluster c4a416e**** (cluster1) NAME READY STATUS RESTARTS AGE nginx-697b955cdc-b94nl 1/1 Running 0 6m
可以看到在没有业务流量的情况下,副本缩小到1,符合预期。