原文:https://github.com/kubernetes/community/blob/master/contributors/design-proposals/autoscaling/vertical-pod-autoscaler.md
作者:Kgrygiel, Mwielgus
译者:余广坝
编者按
目前 Kubernetes 的 Pod 水平自动伸缩(HPA,Horizontal Pod Autoscaler)已在业界广泛应用。但对一些特殊的 Pod(如一些有状态的 Pod),HPA 并不能很好地解决资源不足的问题。这就引出 Pod 垂直自动伸缩(VPA,Vertical Pod Autoscaler),本文主要介绍 Kubernetes 社区对 Pod 垂直自动伸缩组件的开发规划。
VPA定义
垂直自动伸缩(VPA,Vertical Pod Autoscaler) 是一个基于历史数据、集群可使用资源数量和实时的事件(如 OMM, 即 out of memory)来自动设置Pod所需资源并且能够在运行时自动调整资源基础服务。
介绍
背景
计算资源
资源服务质量
准入控制器
外部准入webhooks
目标
VPA有两个目标:
通过自动配置资源请求来减少运维成本。
在提高集群资源利用率的同时最小化容器出现内存溢出或 CPU 饥饿的风险。
相关特性
水平自动伸缩(Horizontal Pod Autoscaler,HPA)
HPA 是基于实时的CPU利用率或者其他的一些特定信号动态调整 Replication controller 中 Pod 数量的基础服务。
通常用户在无状态的工作负载时选用 HPA,在有状态的工作负载时选用 VPA。也有一些场景下会混合使用。
集群自动伸缩(Cluster Autoscaler)
集群自动伸缩基于集群整体的资源利用率动态调整 Kubernetes 集群的大小。
集群自动伸缩、HPA 和 VPA 提供了一个完整的自动伸缩解决方案。
初始资源(Initial resources)
初始资源基于历史资源利用率提供初始资源请求,它仅仅在Pod创建时触发,VPA打算继承使用这个特性。
原地升级(In-place updates)
原地升级是一个计划中的功能,在节点上有足够资源的情况下,原地升级无需杀死容器就能够调整已存在容器的资源的请求和限制。
VPA将从这种能力中受益匪浅,但它不被视为最小可行产品 ( inimum Viable Product, MVP) 的阻挡者。
资源估计(Resource estimation)
资源估计是另外一个计划中的功能,它可以通过暂时回收运行中容器的暂未使用的资源来提高资源利用率。
资源估计与 VPA 的不同在于它基于的时间表比较短(仅基于本地的短期的历史数据),回收以后再提供的质量低,不提供初始资源预测。VPA 和资源估计是互补的。
需求
功能
VPA 能够在 Pod 提交时设置容器的资源(CPU和内存的请求和限制)。
VPA能够调整已存在的 Pod 的容器资源,特别是能够对 CPU 饥饿和内存溢出等事件作出响应。
当 VPA 重启 Pod 时,它必须考虑中断服务的成本。
用户能够配置 VPA 的在资源上的固定限制,特别是最小和最大资源请求。
VPA 要与 Pod 控制器兼容,最起码要与
Deployment
兼容。特别地:
资源更新的时候不能干扰
spec
更新或和spec
更新冲突。在已有的部署中,能够滚动更新 VPA 的策略。
在创建 Pod 时能够尽快开始遵循 VPA 策略,特别是对于一些只有VPA策略应用以后才能被调度的 Pod 。
可用性
重量级的组件(数据库或推荐器)出故障不会阻塞重新创建已存在的 Pod 。Pod 创建路径非常关键的组件必须设计成高可用。
可扩展性
在原地升级组件开发好后, VPA 能够使用它。
设计
综述
提出新的API资源:
VerticalPodAutoscaler
。它包括一个标签识别器label selector
(匹配Pod)、资源策略resources policy
(控制VPA如何计算资源)、更新策略update policy
(控制资源变化应用到Pod)和推荐资源信息。VPA
Recommender
是一个新的组件,它考虑集群中来自Metrics Server
的所有 Pod 的资源利用率信号和内存溢出事件。VPA
Recommender
会监控所有 Pod,为每个 Pod 持续计算新的推荐资源,并将它们存储到 VPA Object 中。VPA
Recommender
会暴露一个同步 API 获取 Pod 详细信息并返回推荐信息。所有的 Pod 创建请求都会通过
VPA Admission Controller
。如果 Pod 与任何一个 VPA 对象匹配,那么Admission controller
会依据 VPARecommender
推荐的值重写容器的资源。如果Recommender
连接不上,它将会返回 VPA Object 中缓存的推荐信息。VPA
Updater
是负责实时更新 Pod 的组件。如果一个 Pod 使用 VPA 的自动模式,那么Updater
会依据推荐资源来决定如何更新。在 MVP 模式中,这需要通过删除 Pod 然后依据新的资源重建 Pod 来实现,这种方法需要 Pod 属于一个Replica Set
(或者其他能够重新创建它的组件)。在未来,Updater
会利用原地升级,因为重新创建或者重新分配Pod对服务是很有破坏性的&#