容器水平伸缩
云容器引擎支持在控制台界面上快速创建支持HPA的应用,实现容器资源的弹性伸缩。您也可通过定义HPA(Horizontal Pod Autoscaling)的YAML来进行配置。
注意
HPA依赖于cube-metrics-server插件搜集当前集群中的资源指标数据,开启HPA前请先安装cube-metrics-server插件。
背景信息
HorizontalPodAutoscaler(HPA)的API版本在不同 Kubernetes 版本中经历了多次演进。以下为各API版本号与Kubernetes版本的对应关系。
| HPA版本 | 引入 | 标记废弃 | 彻底删除 |
|---|---|---|---|
| v2beta2 | 1.12 | 1.23 | 1.26 |
| v2 | 1.23 | - | - |
如果您的集群版本低于Kubernetes 1.23,请使用v2beta2版本的HPA。
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: nginx如果您的集群版本高于或等于1.23,请使用v2版本的HPA。
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: nginx从v1.18开始,K8s v2beta2 API允许通过HPA的behavior字段配置扩缩行为。在behavior字段中的scaleUp和scaleDown分别指定扩容和缩容行为。当您在使用HPA时,希望只进行扩容或者只进行缩容的Pod伸缩,则可以通过开启指标伸缩,单击禁止缩容或者禁止扩容来实现。
默认值:均不禁止
禁止扩容:selectPolicy的值Disabled会关闭给定方向的扩容。因此使用以下策略,将会阻止扩容。
behavior:
scaleUp:
selectPolicy: Disabled禁用缩容:selectPolicy的值Disabled会关闭给定方向的缩容。因此使用以下策略,将会阻止缩容。
behavior:
scaleDown:
selectPolicy: Disabled伸缩规则
HPA总体支持两种度量指标,一种为系统默认指标,支持CPU利用率、内存利用率这两种资源百分比指标;另一种为自定义度量指标,包含Pod度量跟Object度量两大类。
资源度量指标
以CPU为例,配置示意如下:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50自定义度量指标
使用自定义度量指标为工作负载配置HPA时,最重要的前提是:工作负载对应的Pod通过/metrics接口暴露自定义指标。若工作负载(如nginx、redis、tomcat等)本身不支持该功能,则需借助Sidecar或Exporter方式来实现指标暴露。
注意
自定义度量指标依赖于cube-metrics-adapter插件搜集自定义指标上报,如需使用自定义度量指标,请先安装cube-metrics-adapter插件。
根据自定义指标的来源及归属对象,可将其划分为Pod度量指标和Object度量指标。
Pod度量指标与Pod绑定,HPA会获取所有目标Pod的该指标值并计算算术平均数,再与设定的目标值进行比较。该指标与资源度量指标相似,但仅支持平均值。配置示意如下:
type: Pods
pods:
metric:
name: packets-per-second
target:
type: AverageValue
averageValue: 1kObject度量用于描述同一命名空间中除Pod之外的其他Kubernetes对象(如Service或Ingress),该对象的指标为单一的绝对值,HPA会直接将其与设定的目标值进行比较,而不进行副本数均摊计算,配置示意如下:
type: Object
object:
metric:
name: requests-per-second
describedObject:
apiVersion: v1
kind: Service
name: main-route
target:
type: Value
value: 2k通过控制台创建HPA
在策略列表页创建HPA
登录云容器引擎管理控制台。
在控制台左侧导航栏,单击集群。
在集群列表页面,单击目标集群名称。
在集群管理页左侧导航栏,选择策略,在策略列表页点击创建HPA策略。
为已有应用开启HPA
登录云容器引擎管理控制台。
在控制台左侧导航栏,单击集群。
在集群列表页面,单击目标集群名称。
在集群管理页左侧导航栏,选择工作负载 - 无状态。
在无状态列表页面选择对应工作负载的操作栏中的更多 - 弹性伸缩。
在创建对话框中,设置伸缩的配置。
通过kubectl命令创建HPA
您可通过编排模板来手动创建HPA,并将其绑定到要伸缩的Deployment对象上,通过kubectl命令实现容器自动伸缩配置。
下面针对一个Nginx应用进行举例。
1、创建并复制以下内容到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: registry-hangzhou7.crs-internal.ctyun.cn/artifact-hub/nginx:1.26-alpine-slim # 使用对应资源池的镜像仓库地址代替
ports:
- containerPort: 80
resources:
requests: # 必须设置,不然HPA无法运行。
cpu: 100m2、执行以下命令,创建Nginx应用。
kubectl create -f nginx.yml
3、创建HPA。通过scaleTargetRef设置当前HPA绑定的对象,在本例中绑定名叫nginx的Deployment。
apiVersion: autoscaling/v2 # 根据Kubernetes集群版本确定apiVersion,低于1.23版本时请使用autoscaling/v2beta2,高于或等于1.23版本时请使用autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: nginx # 建议HPA名称与对应工作负载名称保持一致
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 504、创建好HPA后,再次执行 kubectl describe hpa -n default nginx -hpa 命令,可以看到Metrics (current / target)有具体的数值,说明HPA正常运行。
# kubectl describe hpa nginx
Name: nginx
Namespace: default
Labels: <none>
Annotations: <none>
CreationTimestamp: Wed, 03 Jun 2026 20:25:06 +0800
Reference: Deployment/nginx
Metrics: ( current / target )
resource cpu on pods (as a percentage of request): 0% (0) / 50%
Min replicas: 1
Max replicas: 10
Deployment pods: 1 current / 1 desired
Conditions:
Type Status Reason Message
---- ------ ------ -------
AbleToScale True ReadyForNewScale recommended size matches current size
ScalingActive True ValidMetricFound the HPA was able to successfully calculate a replica count from cpu resource utilization (percentage of request)
ScalingLimited True TooFewReplicas the desired replica count is less than the minimum replica count
Events: