此页面简要介绍了 Pod 纵向自动扩缩,并为 VerticalPodAutoscaler
自定义资源和相关类型提供参考资料。
您还可以了解如何配置 Pod 纵向自动扩缩。
概览
Pod 纵向自动扩缩功能让您可以无需考虑为容器的 CPU 请求和限制以及内存请求和限制指定哪些值。 该自动扩缩器可以为 CPU 和内存请求及限制提供建议值,也可以自动更新这些值。
Pod 纵向自动扩缩功能具有以下优势:
因为 Pod 完全用其所需,所以集群节点使用效率高。
Pod 会被安排到具有适当可用资源的节点上。
您不必运行耗时的基准测试任务来确定 CPU 和内存请求的正确值。
自动调节程序可以随时调整 CPU 和内存请求,而无需您执行任何操作,所以维护时间更短。
与 Kubernetes 开源自动扩缩器相比,Google Kubernetes Engine (GKE) 垂直 Pod 自动扩缩功能具有以下优势:
在确定推荐目标时,请考虑使用最大节点大小和资源配额。
通知集群自动扩缩器以调整集群容量。
使用历史数据,提供在启用垂直 Pod 自动扩缩器之前收集的指标。
Pod 纵向自动扩缩功能的限制:
Pod 纵向自动扩缩功能支持每个集群最多 500 个
VerticalPodAutoscaler
对象。从版本 1.12.6 开始,地区级集群支持 Pod 纵向自动扩缩功能。
如需将 Pod 纵向自动扩缩与Pod 横向自动扩缩结合使用,请使用多维 Pod 自动扩缩。您还可以在自定义和外部指标上使用 Pod 纵向自动扩缩功能和 Pod 横向自动扩缩功能。
Pod 纵向自动扩缩目前还无法用于 JVM 工作负载,因为对此类工作负载的实际内存用量的了解有限。
Pod 纵向自动扩缩无法自动为注入的 Sidecar 应用建议。如果您为已注入 Sidecar 的 Pod 创建一个
VerticalPodAutoscaler
对象,但未将updateMode
设置为"Off"
,则必须使用容器资源政策停用这些 Sidecar。请参阅参考文档部分中的ContainerResourcePolicy
以及如何停用特定容器。将 Pod 纵向自动扩缩与 Istio 一起使用时,存在一个已知问题。 此限制会影响 Istio Sidecar。要解决此问题,请在
VerticalPodAutoscaler
规范定义中附加以下内容以停用 Istio Sidecar:resourcePolicy: containerPolicies: - containerName: istio-proxy mode: "Off"
自动模式下的 Pod 纵向自动扩缩
由于 Kubernetes 的限制,修改正在运行的 Pod 的资源请求的唯一方法是重新创建 Pod。因此,如果您创建了一个 updateMode
为 "Auto"
的 VerticalPodAutoscaler
,则 VerticalPodAutoscaler
将在需要更改某个 Pod 的资源请求时逐出该 Pod。
如需限制 Pod 重新启动的数量,请使用 Pod 中断预算。
如需确保集群可以处理新规模的工作负载,请使用集群自动扩缩程序和节点自动预配。 Pod 纵向自动扩缩功能会在更新之前通知集群自动扩缩程序,并在重新创建 Pod 之前提供运行大小经过调整的工作负载所需的资源,以最大限度地缩短中断时间。
参考
VerticalPodAutoscaler v1 autoscaling.k8s.io
字段 | |
---|---|
|
API 组、版本和种类。 |
metadata |
标准对象元数据。 |
spec |
所需的 VerticalPodAutoscaler 的行为。 |
status |
最近观察到的 VerticalPodAutoscaler 的状态。 |
VerticalPodAutoscalerSpec v1 autoscaling.k8s.io
字段 | |
---|---|
targetRef |
引用用于管理一组 Pod 以供自动扩缩器控制的控制器,例如 Deployment 或 StatefulSet 控制器。您可以将 VerticalPodOutoscaler 指向任何具有 Scale 子资源的控制器。一般而言,VerticalPodAutoscaler 从控制器的 ScaleStatus 中检索 Pod 集合。如果是 DaemonSet 等一些众所周知的控制器,VerticalPodAutoscaler 会从控制器的规范中检索 Pod 集合。 |
updatePolicy |
指定在 Pod 启动时是否应用推荐的更新,以及在 Pod 的生命周期内是否应用推荐的更新。 |
resourcePolicy |
指定如何为各个容器调整 CPU 和内存请求的政策。 资源政策可用于设置针对各个容器的建议约束。如果未指定,自动扩缩器将计算 Pod 中所有容器的推荐资源,且不受其他限制。 |
VerticalPodAutoscalerList v1 autoscaling.k8s.io
字段 | |
---|---|
|
API 组、版本和种类。 |
metadata |
标准对象元数据。 |
items |
VerticalPodAutoscaler 对象的列表。 |
PodUpdatePolicy v1 autoscaling.k8s.io
字段 | |
---|---|
updateMode |
指定在 Pod 启动时是否应用推荐的更新,以及在 Pod 的生命周期内是否应用推荐的更新。可能的值为“关闭”、“初始”、“重新创建”和“自动”。 |
PodResourcePolicy v1 autoscaling.k8s.io
字段 | |
---|---|
containerPolicies |
各个容器的一系列资源政策。 每个命名容器最多只能有 1 个条目,可以选择性地使用 `containerName =“*”单个通配符条目,该条目可以处理所有不具有单独政策的容器。 |
ContainerResourcePolicy v1 autoscaling.k8s.io
字段 | |
---|---|
containerName |
政策适用的容器的名称。如果未指定,则政策将用作默认政策。 |
mode |
指定在容器启动时是否将推荐的更新应用于容器,以及在容器的生命周期内是否应用推荐的更新。可能的值为“关闭”和“自动”。 |
minAllowed |
指定容器允许的最小 CPU 请求和内存请求。 |
maxAllowed |
指定容器允许的最大 CPU 请求和内存请求。 |
ControlledResources |
指定将由 VPA 计算(且可能会应用)的建议类型。如果为空,则默认使用 |
VerticalPodAutoscalerStatus v1 autoscaling.k8s.io
字段 | |
---|---|
recommendation |
最近推荐的 CPU 和内存请求。 |
conditions |
描述 VerticalPodAutoscaler 的当前状态。 |
RecommendedPodResources v1 autoscaling.k8s.io
字段 | |
---|---|
containerRecommendation |
针对各个容器的一系列资源推荐。 |
RecommendedContainerResources v1 autoscaling.k8s.io
字段 | |
---|---|
containerName |
推荐适用的容器的名称。 |
target |
容器的推荐 CPU 请求和内存请求。 |
lowerBound |
容器的最小推荐 CPU 请求和内存请求。该数量不足以保证应用的稳定性。使用较小的 CPU 和内存请求运行可能会对性能或可用性产生重大影响。 |
upperBound |
容器的最大推荐 CPU 请求和内存请求。高于推荐值的 CPU 和内存请求可能会被浪费。 |
uncappedTarget |
由自动调节程序计算的最新资源推荐基于实际资源使用情况,而不考虑 ContainerResourcePolicy。如果实际资源使用情况会导致目标违反 ContainerResourcePolicy,则可能与限定的建议不同。此字段不会影响实际的资源分配,而是仅用于指示状态。 |
VerticalPodAutoscalerCondition v1 autoscaling.k8s.io
字段 | |
---|---|
type |
正在描述的条件的类型。可能的值为“RecommendationProvided”、“LowConfidence”、“NoPodsMatched”和“FetchingHistory”。 |
status |
条件的状态。可能的值为True、False和Unknown。 |
lastTransitionTime |
条件上次从一种状态转换到另一种状态的时间。 |
reason |
上次从一种状态转换到另一种状态的原因。 |
message |
人类可读的字符串,提供有关上次从一种状态转换到另一种状态的详细信息。 |
后续步骤
- 了解如何将 CPU 资源分配给容器和 Pod。
- 了解如何将内存资源分配给容器和 Pod。
- 了解如何扩缩应用。
- 详细了解如何根据自定义指标自动扩缩部署。
- 了解集群自动扩缩器。
- 了解多维 Pod 自动扩缩器。