创建VPA策略
VPA策略即Vertical Pod Autoscaling,该功能可以在Kubernetes中实现Pod垂直弹性伸缩,可以根据容器资源历史使用情况自动调整Pod的CPU、Memory资源申请量。当业务负载急剧飙升时,VPA能够快速地在设定范围内扩大容器的资源申请值(Requests),以满足业务需求。而在业务负载变小时,VPA会根据实际情况适当缩小资源申请量,以节省计算资源。此外,VPA还能推荐更合理的资源申请量,在确保容器有足够的资源供使用的前提下,提升容器的资源利用率。
功能概述
VPA以容器为单位对资源指标进行聚合计算,根据容器的资源实际使用情况动态调整容器的资源申请值(Requests),同时保证调整前和调整后资源限制值(Limits)与资源申请值(Requests)的比值不变。目前支持CPU与Memory两类资源的垂直伸缩。
详细功能说明如下:
- VPA计算CPU与Memory建议值时需要数依赖Metrics API采集的数据。
- VPA在计算资源建议值时,Memory资源的单Pod最小理论建议值250Mi,Pod内单容器的最小理论建议值为250Mi/Pod容器数目。CPU资源的单Pod最小理论建议值为25m,Pod内单容器的最小理论建议值为25m/Pod容器数目。
- 如果容器初始时同时配置了资源申请值与限制值,VPA计算后给出的建议值会修改该容器的资源申请值,而限制值则根据容器初始创建时申请值与限制值的比例进行计算。
例如,某个容器原来配置了CPU资源申请值为100m与限制值为200m,申请值与限制值的比例为1:2。如果VPA计算后的资源申请值建议为80m,则该容器最终的CPU资源申请值为80m,限制值为160m。
- VPA会尽量让建议值符合其他资源限制要求。但如果VPA建议值与资源限制出现冲突,VPA建议值不会根据资源限制进行调整,可能导致VPA配置值超出其他资源限制要求。
例如,某一个命名空间的内存申请值不能超过2GiB,而VPA的建议值如果比较大,可能导致Pod更新后整个命名空间的资源申请量超过2GiB从而出现无法调度。
前提条件
- 集群版本需满足v1.25及以上。
- 使用VPA需要在集群中安装能够提供Metrics API的插件,您可根据实际需求选择其中之一:
- Kubernetes Metrics Server:提供基础资源使用指标,例如容器CPU和内存使用率。
- 云原生监控插件:使用Prometheus提供基础资源使用指标,需将Prometheus注册为Metrics API的服务,详见通过Metrics API提供基础资源指标。
- 集群中需要安装容器垂直弹性引擎。
注意事项
容器垂直伸缩功能目前处于试验阶段,请谨慎使用。
- VPA对Pod资源进行动态更新时,会导致Pod的重建,重建的Pod可能会调度到一个新的节点上,且VPA无法保证重建的Pod调度成功。
- 只有由副本控制管理器(例如Deployment、StatefulSet等)管理的Pod才会进行资源动态更新,独立运行的Pod不支持资源动态更新。
- 目前VPA不能和监控CPU和内存度量的Horizontal Pod Autoscaler (HPA)同时运行。
- VPA admission webhook会对Pod的配置进行更新,如果集群中有其他的admission webhook,需要确保它们不会与VPA发生冲突。
- VPA会处理大部分的OOM(Out Of Memory)事件,但无法保证处理所有的OOM事件。
- VPA的性能尚未在大规模集群中实践。
- VPA建议值可能大于实际可分配的资源量(例如节点可分配资源上限、资源配额上限),导致重建的Pod处于Pending状态无法调度。
- 为同一个负载的配置多个VPA可能会出现行为不一致的现象。
创建VPA策略
- 使用kubectl连接集群,详情请参见通过kubectl连接集群。
- 部署一个示例工作负载。如果已有工作负载可忽略本步骤。
kubectl create -f hamster.yaml
hamster.yaml文件内容如下:apiVersion: apps/v1 kind: Deployment metadata: name: hamster spec: selector: matchLabels: app: hamster replicas: 2 template: metadata: labels: app: hamster spec: containers: - name: hamster image: registry.k8s.io/ubuntu-slim:0.1 resources: requests: cpu: 100m memory: 50Mi command: ["/bin/sh"] args: - "-c" - "while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done"
- 创建VPA任务。
kubectl create -f hamster-vpa.yaml
hamster-vpa.yaml文件内容如下:apiVersion: autoscaling.k8s.io/v1 kind: VerticalPodAutoscaler metadata: name: hamster-vpa spec: targetRef: apiVersion: "apps/v1" kind: Deployment name: hamster updatePolicy: updateMode: "Off" resourcePolicy: containerPolicies: - containerName: '*' minAllowed: cpu: 100m memory: 50Mi maxAllowed: cpu: 1 memory: 500Mi controlledResources: ["cpu", "memory"]
表1 VPA关键字段说明 字段
是否必填
说明
spec.targetRef
是
指定VPA负载对象。
支持Deployment、Statefulset、Damonset等负载类型。
spec.updatePolicy.updateMode
否
VPA建议值动态更新策略,默认值为“Auto”。
可选配置如下:
- Off:仅生成建议值,不更新Pod资源申请量。
- Recreate:生成建议值,并自动更新Pod资源申请量。
- Initial:生成建议值,仅在Pod新建时更新资源申请量,不动态更新正在运行的Pod的资源申请量。
- Auto:与Recreate配置策略行为一致。
spec.resourcePolicy.containerPolicies
否
为不同的容器指定的VPA策略、VPA资源上下限。详细参数说明请参见表2。
表2 containerPolicy关键字段说明 字段
是否必填
说明
containerName
是
容器名称。
minAllowed
否
指定容器VPA资源下限,即VPA建议值不能低于该值。
可选资源类型:
- cpu
- memory
maxAllowed
否
指定容器VPA资源上限,即VPA建议值不能高于该值。
可选资源类型:
- cpu
- memory
controlledResources
否
指定容器VPA资源类型,默认值为["cpu", "memory"]。
可选资源类型:
- cpu
- memory
mode
否
该容器的VPA策略是否生效,默认值为“Auto”。
可配置值:
- Auto:打开该容器的VPA策略。
- Off:关闭该容器的VPA策略。
- 等待VPA生成资源期望值,执行以下命令查看VPA资源详情。
kubectl get vpa hamster-vpa -oyaml
回显如下:
apiVersion: autoscaling.k8s.io/v1 kind: VerticalPodAutoscaler metadata: name: hamster-vpa namespace: default spec: resourcePolicy: containerPolicies: - containerName: '*' controlledResources: - cpu - memory maxAllowed: cpu: 1 memory: 500Mi minAllowed: cpu: 100m memory: 50Mi targetRef: apiVersion: apps/v1 kind: Deployment name: hamster updatePolicy: updateMode: "Off" status: conditions: - lastTransitionTime: "2024-06-27T07:37:01Z" status: "True" type: RecommendationProvided recommendation: containerRecommendations: - containerName: hamster lowerBound: cpu: 475m memory: 262144k target: cpu: 587m memory: 262144k uncappedTarget: cpu: 587m memory: 262144k upperBound: cpu: 673m memory: 262144k
其中status.recommendation字段为VPA给出的资源配置建议值。
如果updateMode配置为“Auto”,该值会动态更新到正在运行的Pod资源申请配置上,将会导致Pod重建。
表3 containerRecommendation关键字段说明 字段
说明
containerName
VPA策略生效的容器名称。
target
VPA建议值,该值是结合了containerPolicy字段配置的资源上下限后的计算结果。
VPA使用该值弹性配置Pod资源申请量。
lowerBound
VPA下限建议值。
upperBound
VPA上限建议值。
uncappedTarget
实际计算的VPA建议值,该值是未结合containerPolicy字段配置的资源上下限的计算结果。