容器水平伸缩(Horizontal Pod Autoscaler,简称 HPA)是 Kubernetes 中实现 Pod 水平自动伸缩的功能。对于 Kubernetes 中的 Pod 而言,HPA 可以实现很多自动化功能,比如当 Pod 中工作负载上升时,会基于设定的扩容规则,动态调整副本数,从而保证业务系统稳定运行;当 Pod 中工作负载下降时,会基于设定的缩容规则,动态调整副本数,从而提高资源利用率。
HPA 基本原理
HPA 是用来控制 Pod 水平伸缩的控制器,基于设定的扩缩容规则,实时采集监控指标数据,根据用户设定的指标阈值计算副本数,进而调整目标资源的副本数量,完成扩缩容操作。
HPA 工作流程如下:
通过控制台创建 HPA
LHC 支持在控制台界面上快速创建支持 HPA 的应用服务,您可以轻松通过单元化应用服务控制台在创建应用服务时进行创建。
操作步骤
登录控制台,在左侧导航栏单击 发布运维 > 应用服务。
在应用服务列表页,单击 创建应用服务。
在 创建应用服务 页面,完成基本信息、Pod 模板配置后,单击 下一步。
在 弹性配置 页面,完成以下配置后,单击 下一步。
副本伸缩策略配置:选择 弹性扩缩容。
固定副本数:勾选部署单元并修改为期望副本数。
最小副本数:弹性扩缩容时 Pod 的最小副本数。默认值为 1。
最大副本数:弹性扩缩容时 Pod 的最大副本数。默认值为 10。
规则:当前伸缩规则基于的指标类型。单击 + 添加配置,配置以下选项:
规则类型:当前伸缩规则基于的规则类型。目前支持 CPU、Memory、QPS、响应时间。
目标类型:当前伸缩规则基于的指标类型所期望达到的值的类型,目前支持 使用率 与 平均资源使用。
使用率/平均值:输入使用率/平均值。
单位:无需输入,根据所选的规则类型自动匹配。
高级配置:默认关闭。如果开启,需要为扩缩容规则配置幅度、间隔时间、冷却时间。
幅度:可以通过设置按百分比或指定个数来调整扩缩容的速率,单位为百分比或个数。
间隔时间:上次扩缩容操作与本次扩缩容操作之间的时间间隔,单位为秒。
冷却时间:冷却扩缩容操作的时间,即完成一次扩缩容操作之后不再次触发扩缩容操作的时间窗口,单位为秒。
说明一个扩缩容活动执行完成后,在设定的冷却时间内不执行其他扩缩容活动。
(可选)完成访问配置、部署和调度配置后,单击 提交。
通过 kubectl 命令创建
您还可以通过编排模板来手动创建 HPA,并将其绑定到要伸缩的 Deployment 对象上,通过 kubectl 命令实现容器自动伸缩配置。
下面针对一个 Nginx 应用进行举例。
创建并复制以下内容到 nginx.yml 中。Deployment 的编排模板如下。
apiVersion: apps/v1 kind: Deployment metadata: name: nginx labels: app: nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.7.9 # replace it with your exactly <image_name:tags> ports: - containerPort: 80 resources: requests: ##必须设置,否则 HPA 无法运行。 cpu: 500m
说明需要为 Pod 设置 request 资源,如果不设置,HPA 不会运行。
执行以下命令,创建 Nginx 应用。
kubectl create -f nginx.yml
创建 HPA。通过 scaleTargetRef 设置当前 HPA 绑定的对象。在本例中,绑定对象是名为 nginx 的 Deployment。
apiVersion: autoscaling/v2beta2 kind: HorizontalPodAutoscaler metadata: name: nginx-hpa namespace: default spec: scaleTargetRef: ##绑定名为 nginx 的 Deployment。 apiVersion: apps/v1 kind: Deployment name: nginx minReplicas: 1 maxReplicas: 10 metrics: - type: Resource resource: name: cpu targetAverageUtilization: 50
执行
kubectl describe hpaname
会发现有类似以下信息的警告信息。Warning FailedGetResourceMetric 2m (x6 over 4m) horizontal-pod-autoscaler missing request for cpu on container nginx in pod default/nginx-deployment-basic-75675f5897-mqzs7 Warning FailedComputeMetricsReplicas 2m (x6 over 4m) horizontal-pod-autoscaler failed to get cpu utilization: missing request for cpu on container nginx in pod default/nginx-deployment-basic-75675f5创建好HPA后,再次执行kubectl describe hpa
创建好 HPA 后,再次执行
kubectl describe hpaname
命令。如果看到以下信息,则表示 HPA 已正常运行。Normal SuccessfulRescale 39s horizontal-pod-autoscaler New size: 1; reason: All metrics below target
此时,当 Nginx 的 Pod 的利用率超过本例中设置的 50% 利用率时,则会进行水平扩容,低于 50% 时会进行缩容。