如果您想基于CPU使用率、内存使用率或其他自定义指标实现Pod的自动扩缩,建议您为业务容器开启水平伸缩HPA(Horizontal Pod Autoscaler)功能。HPA能够在业务负载急剧飙升时快速扩容多个Pod副本来缓解压力,也可以在业务负载变小时根据实际情况适当缩容以节省资源,无需您人为干预。HPA适用于服务波动较大、服务数量多且需要频繁扩缩容的业务场景,例如电商服务、线上教育、金融服务等。
阅读前提示
为了帮助您更好地使用HPA功能,建议您在阅读本文前参见Kubernetes官方文档Pod 水平自动扩缩了解HPA相关的基础原理、算法细节、可配置的扩缩行为等等。
此外,ACK集群提供了多种工作负载伸缩(调度层弹性)和节点伸缩(资源层弹性)方案,建议您在使用本文档前阅读弹性伸缩概述,了解不同方案的适用场景、使用限制等。
前提条件
已创建ACK托管集群、ACK专有集群。具体操作,请参见创建集群。
如您使用kubectl命令来实现HPA,还需已通过kubectl连接Kubernetes集群。具体操作,请参见获取集群KubeConfig并通过kubectl工具连接集群。
通过容器服务控制台创建HPA应用
阿里云容器服务已经集成了HPA。您可以通过容器服务控制台创建HPA应用。您可以在新建应用时候创建HPA,也可以为已有应用开启HPA。推荐您为一个工作负载仅创建一个HPA。
在创建应用时创建HPA
以下以无状态应用Deployment为例,介绍如何为已有应用开启HPA。其他工作负载类型的步骤类似。
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在无状态页面,单击使用镜像创建。
在创建页面,按照页面提示完成应用基本信息配置、容器配置、服务配置和伸缩配置,创建一个支持HPA的Deployment。
具体步骤及配置项说明,请参见创建无状态工作负载Deployment。下文仅介绍主要配置项。
应用基本信息:配置应用的名称、副本数量等。
容器配置:配置镜像,并配置所需的CPU和内存资源。
您可以使用资源画像功能对资源使用量历史数据进行分析,获取配置容器Request和Limit的相关建议。更多信息,请参见资源画像。
重要请为应用设置所需的请求(Request)资源,否则无法进行容器自动伸缩。
高级配置:
在访问设置区域,单击服务(Service)对应的创建,配置Service。
在伸缩配置区域,勾选指标伸缩的开启,配置伸缩的条件和参数。
指标:支持CPU和内存,需要和设置的所需资源类型相同。当同时指定CPU和内存资源类型时,HPA会在检测到任何一个指标达到扩缩阈值后执行扩缩容操作。
触发条件:资源使用率的百分比,超过该使用量,容器开始扩容。有关Pod水平自动扩缩的算法,请参见算法细节。
最大副本数:该Deployment可扩容的容器数量上限。该值需要大于最小副本数。
最小副本数:该Deployment可缩容的容器数量下限。该值需要设置为大于等于1的整数。
创建完成后,您可以在无状态页面查看创建的Deployment。单击Deployment名称,然后在Deployment详情页面单击容器伸缩页签。在此区域,您可以查看HPA活动相关指标,包括CPU或内存使用率、最大或最小副本数等,以及对HPA进行管理,包括更新HPA配置、停用HPA等。
为已有应用创建HPA
以下以无状态应用Deployment为例,介绍如何为已有应用开启HPA。其他工作负载类型的步骤类似。
工作负载页面
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在无状态页面,单击目标应用名称,单击容器伸缩页签,然后单击HPA区域的创建。
在创建对话框,按照页面提示设置伸缩的配置。
名称:HPA策略名称。
监控项:支持CPU和内存,需要和设置的所需资源类型相同。当同时指定CPU和内存资源类型时,HPA会在检测到任何一个指标达到扩缩阈值后执行扩缩容操作。
阈值:资源使用率的百分比,超过该使用量,容器开始扩容。有关Pod水平自动扩缩的算法,请参见算法细节。
最大容器数量:该Deployment可扩容的容器数量上限。该值需要大于最小副本数。
最小容器数量:该Deployment可缩容的容器数量下限。该值需要设置为大于等于1的整数。
配置完成后,您可以在无状态应用页面单击Deployment名称,然后在Deployment详情页面单击容器伸缩页签。在此区域,您可以查看HPA活动相关指标,包括CPU或内存使用率、最大或最小副本数等,以及对HPA进行管理,包括更新HPA配置、停用HPA等。
工作负载伸缩页面
此页面目前白名单开放中。如需使用,请提交工单申请。
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择
。在页面右上角,单击创建自动伸缩,选择目标工作负载,然后在水平伸缩页签下勾选HPA选项,按照页面提示配置HPA策略。
伸缩策略名称:HPA策略名称。
最小容器数量:该工作负载可缩容的容器数量下限。该值需要设置为大于等于1的整数。
最大容器数量:该工作负载可扩容的容器数量上限。该值需要大于最小副本数。
监控项:支持CPU和内存,需要和设置的所需资源类型相同。当同时指定CPU和内存资源类型时,HPA会在检测到任何一个指标达到扩缩阈值后执行扩缩容操作。
阈值:资源使用率的百分比,超过该使用量,容器开始扩容。有关Pod水平自动扩缩的算法,请参见算法细节。
创建完成后,您可以在工作负载伸缩页面查看HPA列表。在操作列,您可以查看HPA活动相关指标,包括CPU或内存使用率、最大或最小副本数等,以及对HPA进行管理,包括更新HPA配置、停用HPA等。
结果验证
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择
。单击水平伸缩页签,然后选择HPA,查看扩缩容状态和任务列表。
在实际使用环境中,应用会根据Pod负载进行伸缩。您也可以在测试环境中进行Pod压测,验证水平伸缩情况。
通过kubectl命令创建HPA应用
您也可以通过编排模板来手动创建HPA,并将其绑定到要伸缩的Deployment对象上,通过kubectl命令实现容器自动伸缩配置。推荐您为一个工作负载仅创建一个HPA。下文以部署支持HPA的Nginx应用为例。
创建并复制以下内容到nginx.yml中。
重要实现HPA时,需为Pod设置
request
资源,否则HPA无法运行。您可以使用资源画像功能对资源使用量历史数据进行分析,获取配置容器Request和Limit的相关建议。更多信息,请参见资源画像。执行以下命令,创建Nginx应用。
kubectl apply -f nginx.yml
创建并复制以下内容到hpa.yml中,用于创建HPA。
通过
scaleTargetRef
设置当前HPA绑定的对象。本例中绑定名为nginx
的Deployment,在确保所有Pod中容器的平均CPU使用率达到50%时触发扩缩操作。1.24及以上
apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: nginx-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: nginx minReplicas: 1 # Deployment可缩容的容器数量下限,需设置为大于等于1的整数。 maxReplicas: 10 # 该Deployment可扩容的容器数量上限,需大于minReplicas。 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 50 # 目标资源的平均使用率,即资源使用量的平均值与其请求量之间的比例。
1.24以下
apiVersion: autoscaling/v2beta2 kind: HorizontalPodAutoscaler metadata: name: nginx-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: nginx minReplicas: 1 # 需要为大于等于1的整数。 maxReplicas: 10 # 需要大于最小副本数。 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 50
如果需要同时指定CPU和内存指标,您可以在
metrics
字段下同时指定cpu
和memory
类型的资源,而不是创建2个HPA。当HPA检测到任何一个指标达到扩缩阈值后,便会执行扩缩容操作。metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 50 - type: Resource resource: name: memory target: type: Utilization averageUtilization: 50
执行以下命令,创建HPA。
kubectl apply -f hpa.yml
此时,执行
kubectl describe hpa <HPA名称>
(本示例的HPA名称为nginx-hpa.yml),预期输出的警告信息如下,表明HPA仍在部署中。您可以执行kubectl get hpa
命令查看HPA的状态。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创建成功且Pod达到伸缩条件后(本示例为Nginx的Pod CPU使用率超过50%),再次执行
kubectl describe hpa <HPA的名称>
命令,查看水平伸缩情况。预期输出如下,表明HPA正常运行。
Type Reason Age From Message ---- ------ ---- ---- ------- Normal SuccessfulRescale 5m6s horizontal-pod-autoscaler New size: 1; reason: All metrics below target
相关操作
autoscaling/v2
API允许通过HPA的behavior
字段配置扩缩行为。behavior
字段中的scaleUp
和scaleDown
分别用于指定扩容、缩容行为。
特性状态:Kubernetes v1.23 [stable]
配置Pod只扩容或缩容
当您在使用HPA时,如果期望只进行Pod扩容或只进行Pod缩容,您可以通过selectPolicy
字段来实现。更多信息,请参见配置扩缩行为。
默认值:均不禁止。
禁止扩容:
selectPolicy
的值Disabled
会关闭给定方向的扩容。以下策略将会阻止Pod扩容。behavior: scaleUp: selectPolicy: Disabled
禁用缩容:
selectPolicy
的值Disabled
会关闭给定方向的缩容。以下策略将会阻止Pod缩容。behavior: scaleDown: selectPolicy: Disabled
配置稳定窗口
当扩缩容指标频繁波动时,您可以在behavior
字段中添加stabilizationWindowSeconds
字段,设定一段时间的稳定窗口,限制副本数量的波动。此窗口可以指定HPA Controller在触发扩缩容前需观察多久的指标数据,以判断系统的期望状态,防止因短期的指标波动导致过度频繁或不必要的扩缩容。
在下方示例中,当指标显示目标应该缩容时,自动扩缩算法会将过去5分钟的所有期望状态考虑在内,使用窗口期内的最大值。
behavior:
scaleDown:
stabilizationWindowSeconds: 300
常见问题
相关文档
其他相关操作文档
关于如何在Kubernetes提供External Metrics支持的情况下,基于阿里云组件的指标实现容器水平伸缩(HPA),请参见基于阿里云组件指标的容器水平伸缩。
关于如何将阿里云Prometheus指标转换成HPA可用的指标,实现容器水平伸缩(HPA),请参见基于阿里云Prometheus指标的容器水平伸缩。
关于使用HPA过程中遇到的问题,您可以先参见节点自动伸缩FAQ进行自助排查。
如果您需要实现CronHPA与HPA的协同,请参见实现CronHPA与HPA的协同。
其他工作负载伸缩方案
如果您的应用资源使用率存在周期性变化,需要按照类似Crontab的策略定时对Pod进行扩缩容,请参见使用容器定时水平伸缩(CronHPA)。
如果您的应用资源使用率存在周期性变化,但难以通过规则定义,您可以选择AHPA,以根据业务历史指标自动识别业务水位周期,进行Pod扩缩容,请参见AHPA概述。
如需基于Pod的资源使用情况自动为Pod设置资源占用的限制,从而让Pod获得足够的计算资源,请参见使用容器垂直伸缩(VPA)。
如需基于消息队列、定时策略、自定义指标等Kubernetes事件灵活自定义扩缩容策略,对Pod进行扩缩容,请参见事件驱动弹性。
搭配方案
您可以将HPA与节点自动伸缩功能搭配使用,在集群节点资源不足时,实现节点的自动扩缩。更多信息,请参见启用节点自动伸缩。