$ oc get all -n openshift-vertical-pod-autoscaler
OpenShift Container Platform垂直Pod自动缩放操作符(VPA)会自动检查Pod中容器的历史和当前CPU和内存资源,并可以根据它学习到的使用值更新资源限制和请求。VPA使用单独的自定义资源(CR)来更新与工作负载对象(例如Deployment
、DeploymentConfig
、StatefulSet
、Job
、DaemonSet
、ReplicaSet
或ReplicationController
)关联的所有Pod。
VPA帮助您了解Pod的最佳CPU和内存使用情况,并可以通过Pod生命周期自动维护Pod资源。
垂直Pod自动缩放操作符(VPA)实现为API资源和自定义资源(CR)。CR确定VPA操作符应对项目中与特定工作负载对象(例如守护进程集、复制控制器等)关联的Pod采取的操作。
VPA操作符包含三个组件,每个组件在VPA命名空间中都有自己的Pod。
VPA推荐器监控当前和过去的资源消耗,并根据这些数据确定关联工作负载对象中Pod的最佳CPU和内存资源。
VPA更新程序检查关联工作负载对象中的Pod是否具有正确的资源。如果资源正确,更新程序不执行任何操作。如果资源不正确,更新程序将终止Pod,以便其控制器可以使用更新的请求重新创建它们。
VPA准入控制器在关联工作负载对象的每个新Pod上设置正确的资源请求,无论Pod是新的还是由于VPA更新程序操作而由其控制器重新创建。
您可以使用默认推荐器或使用您自己的替代推荐器来根据您自己的算法进行自动缩放。
默认推荐器会自动计算这些Pod中容器的历史和当前CPU和内存使用情况,并使用这些数据确定优化的资源限制和请求,以确保这些Pod始终高效运行。例如,默认推荐器建议减少请求的资源超过其使用的Pod的资源,并增加请求不足的Pod的资源。
然后,VPA会自动一次删除一个与这些建议不符的Pod,以便您的应用程序可以继续提供服务请求而不会出现停机。工作负载对象随后会使用原始资源限制和请求重新部署Pod。VPA使用变异准入Webhook在Pod被接纳到节点之前使用优化的资源限制和请求更新Pod。如果您不希望VPA删除Pod,您可以查看VPA资源限制和请求,并根据需要手动更新Pod。
默认情况下,工作负载对象必须至少指定两个副本才能使VPA自动删除其Pod。指定少于此最小值的副本数的工作负载对象不会被删除。如果您手动删除这些Pod,当工作负载对象重新部署Pod时,VPA确实会使用其建议更新新的Pod。您可以通过修改 |
例如,如果您有一个Pod使用了50%的CPU,但只请求了10%,则VPA会确定该Pod消耗的CPU超过了请求,并删除该Pod。工作负载对象(例如副本集)将重新启动Pod,VPA将使用其推荐的资源更新新Pod。
对于开发者而言,您可以使用垂直 Pod 自动伸缩器 (VPA) 来确保您的 Pod 在高需求期间保持运行,方法是将 Pod 调度到具有每个 Pod 适当资源的节点上。
管理员可以使用 VPA 来更好地利用集群资源,例如防止 Pod 预留超过需要的 CPU 资源。VPA 监控工作负载实际使用的资源,并调整资源需求,以便为其他工作负载提供可用容量。VPA 还维护初始容器配置中指定的限制和请求之间的比率。
如果您停止运行 VPA 或删除集群中特定的 VPA CR,则 VPA 已修改的 Pod 的资源请求不会更改。任何新的 Pod 都将获得工作负载对象中定义的资源,而不是 VPA 之前提供的建议。 |
您可以使用 OpenShift Container Platform Web 控制台安装垂直 Pod 自动伸缩器操作符 (VPA)。
在 OpenShift Container Platform Web 控制台中,单击**操作符** → **OperatorHub**。
从可用操作符列表中选择**VerticalPodAutoscaler**,然后单击**安装**。
在**安装操作符**页面上,确保选中**操作符推荐的命名空间**选项。这会将操作符安装到强制性的 `openshift-vertical-pod-autoscaler` 命名空间中,如果该命名空间不存在,则会自动创建。
单击**安装**。
通过列出 VPA 操作符组件来验证安装
导航到**工作负载** → **Pod**。
从下拉菜单中选择 `openshift-vertical-pod-autoscaler` 项目,并验证是否有四个 Pod 正在运行。
导航到**工作负载** → **部署**,以验证是否有四个部署正在运行。
可选:使用以下命令在 OpenShift Container Platform CLI 中验证安装
$ oc get all -n openshift-vertical-pod-autoscaler
输出显示四个 Pod 和四个部署
NAME READY STATUS RESTARTS AGE
pod/vertical-pod-autoscaler-operator-85b4569c47-2gmhc 1/1 Running 0 3m13s
pod/vpa-admission-plugin-default-67644fc87f-xq7k9 1/1 Running 0 2m56s
pod/vpa-recommender-default-7c54764b59-8gckt 1/1 Running 0 2m56s
pod/vpa-updater-default-7f6cc87858-47vw9 1/1 Running 0 2m56s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/vpa-webhook ClusterIP 172.30.53.206 <none> 443/TCP 2m56s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/vertical-pod-autoscaler-operator 1/1 1 1 3m13s
deployment.apps/vpa-admission-plugin-default 1/1 1 1 2m56s
deployment.apps/vpa-recommender-default 1/1 1 1 2m56s
deployment.apps/vpa-updater-default 1/1 1 1 2m56s
NAME DESIRED CURRENT READY AGE
replicaset.apps/vertical-pod-autoscaler-operator-85b4569c47 1 1 1 3m13s
replicaset.apps/vpa-admission-plugin-default-67644fc87f 1 1 1 2m56s
replicaset.apps/vpa-recommender-default-7c54764b59 1 1 1 2m56s
replicaset.apps/vpa-updater-default-7f6cc87858 1 1 1 2m56s
垂直 Pod 自动伸缩器操作符 (VPA) 和每个组件在控制平面节点上的 VPA 命名空间中都有其自己的 Pod。您可以通过向 VPA 订阅和 `VerticalPodAutoscalerController` CR 添加节点选择器,将 VPA 操作符和组件 Pod 移动到基础设施节点或工作节点。
您可以创建并使用基础设施节点来仅托管基础设施组件,例如默认路由器、集成容器镜像注册表以及集群指标和监控组件。这些基础设施节点不计入运行环境所需的订阅总数。有关更多信息,请参见《创建基础设施机器集》。
您可以根据组织的需要将组件移动到同一节点或单独的节点。
以下示例显示 VPA Pod 到控制平面节点的默认部署。
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
vertical-pod-autoscaler-operator-6c75fcc9cd-5pb6z 1/1 Running 0 7m59s 10.128.2.24 c416-tfsbj-master-1 <none> <none>
vpa-admission-plugin-default-6cb78d6f8b-rpcrj 1/1 Running 0 5m37s 10.129.2.22 c416-tfsbj-master-1 <none> <none>
vpa-recommender-default-66846bd94c-dsmpp 1/1 Running 0 5m37s 10.129.2.20 c416-tfsbj-master-0 <none> <none>
vpa-updater-default-db8b58df-2nkvf 1/1 Running 0 5m37s 10.129.2.21 c416-tfsbj-master-1 <none> <none>
通过向 VPA 操作符的 `Subscription` 自定义资源 (CR) 添加节点选择器来移动 VPA 操作符 Pod
编辑 CR
$ oc edit Subscription vertical-pod-autoscaler -n openshift-vertical-pod-autoscaler
添加节点选择器以匹配要在其上安装 VPA 操作符 Pod 的节点上的节点角色标签
apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
labels:
operators.coreos.com/vertical-pod-autoscaler.openshift-vertical-pod-autoscaler: ""
name: vertical-pod-autoscaler
# ...
spec:
config:
nodeSelector:
node-role.kubernetes.io/<node_role>: "" (1)
1 | 指定要在其上移动 VPA 操作符 Pod 的节点的节点角色。 |
如果基础设施节点使用污点,则需要向 `Subscription` CR 添加容忍。 例如
|
1 | 指定要在其上移动 VPA 操作符 Pod 的节点上的污点的容忍。 |
通过向 `VerticalPodAutoscaler` 自定义资源 (CR) 添加节点选择器来移动每个 VPA 组件
编辑 CR
$ oc edit VerticalPodAutoscalerController default -n openshift-vertical-pod-autoscaler
添加节点选择器以匹配要在其上安装 VPA 组件的节点上的节点角色标签
apiVersion: autoscaling.openshift.io/v1
kind: VerticalPodAutoscalerController
metadata:
name: default
namespace: openshift-vertical-pod-autoscaler
# ...
spec:
deploymentOverrides:
admission:
container:
resources: {}
nodeSelector:
node-role.kubernetes.io/<node_role>: "" (1)
recommender:
container:
resources: {}
nodeSelector:
node-role.kubernetes.io/<node_role>: "" (2)
updater:
container:
resources: {}
nodeSelector:
node-role.kubernetes.io/<node_role>: "" (3)
1 | 可选:指定 VPA 准入 Pod 的节点角色。 |
2 | 可选:指定 VPA 推荐器 Pod 的节点角色。 |
3 | 可选:指定 VPA 更新器 Pod 的节点角色。 |
如果目标节点使用污点,则需要向 `VerticalPodAutoscalerController` CR 添加容忍。 例如
|
1 | 指定要在其上安装 Pod 的节点上的污点的准入控制器 Pod 的容忍。 |
2 | 指定要在其上安装 Pod 的节点上的污点的推荐器 Pod 的容忍。 |
3 | 指定要在其上安装 Pod 的节点上的污点的更新器 Pod 的容忍。 |
您可以使用以下命令验证 Pod 是否已移动
$ oc get pods -n openshift-vertical-pod-autoscaler -o wide
Pod 不再部署到控制平面节点。
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
vertical-pod-autoscaler-operator-6c75fcc9cd-5pb6z 1/1 Running 0 7m59s 10.128.2.24 c416-tfsbj-infra-eastus3-2bndt <none> <none>
vpa-admission-plugin-default-6cb78d6f8b-rpcrj 1/1 Running 0 5m37s 10.129.2.22 c416-tfsbj-infra-eastus1-lrgj8 <none> <none>
vpa-recommender-default-66846bd94c-dsmpp 1/1 Running 0 5m37s 10.129.2.20 c416-tfsbj-infra-eastus1-lrgj8 <none> <none>
vpa-updater-default-db8b58df-2nkvf 1/1 Running 0 5m37s 10.129.2.21 c416-tfsbj-infra-eastus1-lrgj8 <none> <none>
要使用垂直 Pod 自动伸缩器操作符 (VPA),您需要为集群中的工作负载对象创建一个 VPA 自定义资源 (CR)。VPA 会学习并应用与该工作负载对象关联的 Pod 的最佳 CPU 和内存资源。您可以将 VPA 与部署、有状态集、作业、守护程序集、副本集或复制控制器工作负载对象一起使用。VPA CR 必须与要监控的 Pod 位于同一项目中。
您可以使用 VPA CR 来关联工作负载对象并指定 VPA 的运行模式
`Auto` 和 `Recreate` 模式会在整个 Pod 生命周期中自动应用 VPA CPU 和内存建议。VPA 会删除项目中与建议不符的任何 Pod。当工作负载对象重新部署时,VPA 会使用其建议更新新的 Pod。
`Initial` 模式仅在 Pod 创建时自动应用 VPA 建议。
`Off` 模式仅提供推荐的资源限制和请求,允许您手动应用建议。`off` 模式不会更新 Pod。
您还可以使用 CR 将某些容器排除在 VPA 评估和更新之外。
例如,一个 Pod 具有以下限制和请求
resources:
limits:
cpu: 1
memory: 500Mi
requests:
cpu: 500m
memory: 100Mi
创建设置为 `auto` 的 VPA 后,VPA 会学习资源使用情况并删除 Pod。重新部署时,Pod 将使用新的资源限制和请求
resources:
limits:
cpu: 50m
memory: 1250Mi
requests:
cpu: 25m
memory: 262144k
您可以使用以下命令查看 VPA 建议
$ oc get vpa <vpa-name> --output yaml
几分钟后,输出将显示 CPU 和内存请求的建议,类似于以下内容
...
status:
...
recommendation:
containerRecommendations:
- containerName: frontend
lowerBound:
cpu: 25m
memory: 262144k
target:
cpu: 25m
memory: 262144k
uncappedTarget:
cpu: 25m
memory: 262144k
upperBound:
cpu: 262m
memory: "274357142"
- containerName: backend
lowerBound:
cpu: 12m
memory: 131072k
target:
cpu: 12m
memory: 131072k
uncappedTarget:
cpu: 12m
memory: 131072k
upperBound:
cpu: 476m
memory: "498558823"
...
输出显示推荐的资源 `target`、最低推荐资源 `lowerBound`、最高推荐资源 `upperBound` 和最新的资源建议 `uncappedTarget`。
VPA 使用 `lowerBound` 和 `upperBound` 值来确定是否需要更新 Pod。如果 Pod 的资源请求低于 `lowerBound` 值或高于 `upperBound` 值,VPA 将终止并使用 `target` 值重新创建 Pod。
默认情况下,工作负载对象必须指定至少两个副本才能使 VPA 自动删除和更新其 Pod。因此,指定少于两个副本的工作负载对象不会被 VPA 自动处理。如果 Pod 被 VPA 之外的某些进程重新启动,则 VPA 会更新来自这些工作负载对象的新 Pod。您可以通过修改 `VerticalPodAutoscalerController` 自定义资源 (CR) 中的 `minReplicas` 参数来更改此集群范围的最小值。
例如,如果您将 `minReplicas` 设置为 `3`,则 VPA 不会删除和更新为指定少于三个副本的工作负载对象。
如果将 |
VerticalPodAutoscalerController
对象示例apiVersion: autoscaling.openshift.io/v1
kind: VerticalPodAutoscalerController
metadata:
creationTimestamp: "2021-04-21T19:29:49Z"
generation: 2
name: default
namespace: openshift-vertical-pod-autoscaler
resourceVersion: "142172"
uid: 180e17e9-03cc-427f-9955-3b4d7aeb2d59
spec:
minReplicas: 3 (1)
podMinCPUMillicores: 25
podMinMemoryMb: 250
recommendationOnly: false
safetyMarginFraction: 0.15
1 | 指定 VPA 要对其进行操作的工作负载对象中的最小副本数。任何副本数少于最小副本数的对象都不会被 VPA 自动删除。 |
要使用 VPA 自动更新 Pod,请为特定工作负载对象创建 VPA CR,并将updateMode
设置为Auto
或Recreate
。
为工作负载对象创建 Pod 后,VPA 会持续监控容器以分析其 CPU 和内存需求。VPA 会删除任何不符合 VPA 对 CPU 和内存建议的 Pod。重新部署时,Pod 将根据 VPA 建议使用新的资源限制和请求,遵守为您的应用程序设置的任何 Pod 中断预算。这些建议会添加到 VPA CR 的status
字段中以供参考。
默认情况下,工作负载对象必须至少指定两个副本才能使VPA自动删除其Pod。指定少于此最小值的副本数的工作负载对象不会被删除。如果您手动删除这些Pod,当工作负载对象重新部署Pod时,VPA确实会使用其建议更新新的Pod。您可以通过修改 |
Auto
模式下的 VPA CR 示例apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: vpa-recommender
spec:
targetRef:
apiVersion: "apps/v1"
kind: Deployment (1)
name: frontend (2)
updatePolicy:
updateMode: "Auto" (3)
1 | 您希望此 VPA CR 管理的工作负载对象类型。 |
2 | 您希望此 VPA CR 管理的工作负载对象的名称。 |
3 | 将模式设置为Auto 或Recreate
|
在 VPA 能够确定资源建议并将推荐的资源应用于新 Pod 之前,必须存在并运行操作 Pod。 如果工作负载的资源使用情况(例如 CPU 和内存)一致,则 VPA 可以在几分钟内确定资源建议。如果工作负载的资源使用情况不一致,则 VPA 必须在不同的资源使用间隔收集指标,才能做出准确的建议。 |
要仅在首次部署 Pod 时使用 VPA 应用推荐的资源,请为特定工作负载对象创建 VPA CR,并将updateMode
设置为Initial
。
然后,手动删除与您要使用 VPA 建议的工作负载对象关联的任何 Pod。在Initial
模式下,VPA 不会删除 Pod,也不会在学习新的资源建议时更新 Pod。
Initial
模式下的 VPA CR 示例apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: vpa-recommender
spec:
targetRef:
apiVersion: "apps/v1"
kind: Deployment (1)
name: frontend (2)
updatePolicy:
updateMode: "Initial" (3)
1 | 您希望此 VPA CR 管理的工作负载对象类型。 |
2 | 您希望此 VPA CR 管理的工作负载对象的名称。 |
3 | 将模式设置为Initial 。VPA 在创建 Pod 时分配资源,并且在 Pod 的生命周期内不会更改资源。 |
在 VPA 能够确定推荐的资源并将建议应用于新 Pod 之前,必须存在并运行操作 Pod。 为了获得 VPA 最准确的建议,请至少等待 8 天让 Pod 运行并让 VPA 稳定。 |
要仅使用 VPA 确定推荐的 CPU 和内存值,请为特定工作负载对象创建 VPA CR,并将updateMode
设置为off
。
为该工作负载对象创建 Pod 后,VPA 会分析容器的 CPU 和内存需求,并将这些建议记录在 VPA CR 的status
字段中。VPA 在确定新的资源建议时不会更新 Pod。
Off
模式下的 VPA CR 示例apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: vpa-recommender
spec:
targetRef:
apiVersion: "apps/v1"
kind: Deployment (1)
name: frontend (2)
updatePolicy:
updateMode: "Off" (3)
1 | 您希望此 VPA CR 管理的工作负载对象类型。 |
2 | 您希望此 VPA CR 管理的工作负载对象的名称。 |
3 | 将模式设置为Off 。 |
您可以使用以下命令查看建议。
$ oc get vpa <vpa-name> --output yaml
有了这些建议,您可以编辑工作负载对象以添加 CPU 和内存请求,然后使用推荐的资源删除并重新部署 Pod。
在 VPA 能够确定推荐的资源并将建议应用于新 Pod 之前,必须存在并运行操作 Pod。 为了获得 VPA 最准确的建议,请至少等待 8 天让 Pod 运行并让 VPA 稳定。 |
如果您的工作负载对象具有多个容器,并且您不希望 VPA 评估和处理所有容器,请为特定工作负载对象创建 VPA CR 并添加resourcePolicy
以选择退出特定容器。
当 VPA 使用推荐的资源更新 Pod 时,任何具有resourcePolicy
的容器都不会被更新,并且 VPA 不会在 Pod 中显示这些容器的建议。
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: vpa-recommender
spec:
targetRef:
apiVersion: "apps/v1"
kind: Deployment (1)
name: frontend (2)
updatePolicy:
updateMode: "Auto" (3)
resourcePolicy: (4)
containerPolicies:
- containerName: my-opt-sidecar
mode: "Off"
1 | 您希望此 VPA CR 管理的工作负载对象类型。 |
2 | 您希望此 VPA CR 管理的工作负载对象的名称。 |
3 | 将模式设置为Auto 、Recreate 或Off 。Recreate 模式应很少使用,仅当您需要确保在资源请求更改时重新启动 Pod 时才使用。 |
4 | 指定您要选择退出的容器并将mode 设置为Off 。 |
例如,一个 Pod 具有两个容器,相同的资源请求和限制
# ...
spec:
containers:
- name: frontend
resources:
limits:
cpu: 1
memory: 500Mi
requests:
cpu: 500m
memory: 100Mi
- name: backend
resources:
limits:
cpu: "1"
memory: 500Mi
requests:
cpu: 500m
memory: 100Mi
# ...
在启动带有设置为选择退出的backend
容器的 VPA CR 后,VPA 将终止并重新创建 Pod,仅将推荐的资源应用于frontend
容器
...
spec:
containers:
name: frontend
resources:
limits:
cpu: 50m
memory: 1250Mi
requests:
cpu: 25m
memory: 262144k
...
name: backend
resources:
limits:
cpu: "1"
memory: 500Mi
requests:
cpu: 500m
memory: 100Mi
...
作为集群管理员,您可以调整垂直 Pod 自动缩放器运算符 (VPA) 的性能,以限制 VPA 对 Kubernetes API 服务器发出请求的速率,并为 VPA 推荐器、更新器和准入控制器组件 Pod 指定 CPU 和内存资源。
此外,您可以配置 VPA 运算符仅监控由 VPA 自定义资源 (CR) 管理的工作负载。默认情况下,VPA 运算符会监控集群中的每个工作负载。这允许 VPA 运算符累积并存储所有工作负载的 8 天历史数据,如果为工作负载创建新的 VPA CR,运算符可以使用这些数据。但是,这会导致 VPA 运算符使用大量的 CPU 和内存,这可能会导致运算符失败,尤其是在较大的集群中。通过将 VPA 运算符配置为仅监控具有 VPA CR 的工作负载,您可以节省 CPU 和内存资源。一个权衡是,如果您有一个一直在运行的工作负载,并且您创建了一个 VPA CR 来管理该工作负载,则 VPA 运算符没有任何该工作负载的历史数据。因此,初始建议不如工作负载运行一段时间后的建议有用。
这些调整允许您确保 VPA 拥有足够的资源以最佳效率运行,并防止限制和 Pod 准入的潜在延迟。
您可以通过编辑VerticalPodAutoscalerController
自定义资源 (CR) 来对 VPA 组件执行以下调整
为了防止限制和 Pod 准入延迟,请使用kube-api-qps
和kube-api-burst
参数设置 VPA 对 Kubernetes API 服务器请求的每秒查询数 (QPS) 和突发速率。
为了确保足够的 CPU 和内存,请使用标准的cpu
和memory
资源请求设置 VPA 组件 Pod 的 CPU 和内存请求。
要将 VPA 运算符配置为仅监控由 VPA CR 管理的工作负载,请为推荐器组件将memory-saver
参数设置为true
。
下面的 VPA 控制器 CR 示例设置了 VPA API QPS 和突发速率,配置了组件 Pod 资源请求,并将推荐器的memory-saver
设置为true
VerticalPodAutoscalerController
CRapiVersion: autoscaling.openshift.io/v1
kind: VerticalPodAutoscalerController
metadata:
name: default
namespace: openshift-vertical-pod-autoscaler
spec:
deploymentOverrides:
admission: (1)
container:
args: (2)
- '--kube-api-qps=30.0'
- '--kube-api-burst=40.0'
resources:
requests: (3)
cpu: 40m
memory: 40Mi
recommender: (4)
container:
args:
- '--kube-api-qps=20.0'
- '--kube-api-burst=60.0'
- '--memory-saver=true' (5)
resources:
requests:
cpu: 60m
memory: 60Mi
updater: (6)
container:
args:
- '--kube-api-qps=20.0'
- '--kube-api-burst=80.0'
resources:
requests:
cpu: 80m
memory: 80Mi
minReplicas: 2
podMinCPUMillicores: 25
podMinMemoryMb: 250
recommendationOnly: false
safetyMarginFraction: 0.15
1 | 指定 VPA 准入控制器的调整参数。 |
2 | 指定 VPA 准入控制器的 API QPS 和突发速率。
|
3 | 指定 VPA 准入控制器 Pod 的 CPU 和内存请求。 |
4 | 指定 VPA 推荐器的调整参数。 |
5 | 指定 VPA 运算符仅监控具有 VPA CR 的工作负载。默认值为 false 。 |
6 | 指定 VPA 更新器的调整参数。 |
您可以验证设置是否已应用于每个 VPA 组件 Pod。
apiVersion: v1
kind: Pod
metadata:
name: vpa-updater-default-d65ffb9dc-hgw44
namespace: openshift-vertical-pod-autoscaler
# ...
spec:
containers:
- args:
- --logtostderr
- --v=1
- --min-replicas=2
- --kube-api-qps=20.0
- --kube-api-burst=80.0
# ...
resources:
requests:
cpu: 80m
memory: 80Mi
# ...
apiVersion: v1
kind: Pod
metadata:
name: vpa-admission-plugin-default-756999448c-l7tsd
namespace: openshift-vertical-pod-autoscaler
# ...
spec:
containers:
- args:
- --logtostderr
- --v=1
- --tls-cert-file=/data/tls-certs/tls.crt
- --tls-private-key=/data/tls-certs/tls.key
- --client-ca-file=/data/tls-ca-certs/service-ca.crt
- --webhook-timeout-seconds=10
- --kube-api-qps=30.0
- --kube-api-burst=40.0
# ...
resources:
requests:
cpu: 40m
memory: 40Mi
# ...
apiVersion: v1
kind: Pod
metadata:
name: vpa-recommender-default-74c979dbbc-znrd2
namespace: openshift-vertical-pod-autoscaler
# ...
spec:
containers:
- args:
- --logtostderr
- --v=1
- --recommendation-margin-fraction=0.15
- --pod-recommendation-min-cpu-millicores=25
- --pod-recommendation-min-memory-mb=250
- --kube-api-qps=20.0
- --kube-api-burst=60.0
- --memory-saver=true
# ...
resources:
requests:
cpu: 60m
memory: 60Mi
# ...
您可以使用您自己的推荐器根据您自己的算法进行自动缩放。如果您没有指定替代推荐器,OpenShift Container Platform 将使用默认推荐器,该推荐器根据历史使用情况建议 CPU 和内存请求。由于没有适用于所有类型工作负载的通用推荐策略,您可能需要为特定工作负载创建和部署不同的推荐器。
例如,当容器表现出某些资源行为(例如,监控应用程序使用的交替使用峰值和空闲的循环模式,或深度学习应用程序使用的重复模式)时,默认推荐器可能无法准确预测未来的资源使用情况。对这些使用行为使用默认推荐器可能会导致您的应用程序出现严重的过度配置和内存不足 (OOM) 终止。
创建推荐器的说明不在本文档的范围之内。 |
要为您的 Pod 使用替代推荐器
为替代推荐器创建一个服务帐户,并将该服务帐户绑定到所需的集群角色。
apiVersion: v1 (1)
kind: ServiceAccount
metadata:
name: alt-vpa-recommender-sa
namespace: <namespace_name>
---
apiVersion: rbac.authorization.k8s.io/v1 (2)
kind: ClusterRoleBinding
metadata:
name: system:example-metrics-reader
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:metrics-reader
subjects:
- kind: ServiceAccount
name: alt-vpa-recommender-sa
namespace: <namespace_name>
---
apiVersion: rbac.authorization.k8s.io/v1 (3)
kind: ClusterRoleBinding
metadata:
name: system:example-vpa-actor
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:vpa-actor
subjects:
- kind: ServiceAccount
name: alt-vpa-recommender-sa
namespace: <namespace_name>
---
apiVersion: rbac.authorization.k8s.io/v1 (4)
kind: ClusterRoleBinding
metadata:
name: system:example-vpa-target-reader-binding
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:vpa-target-reader
subjects:
- kind: ServiceAccount
name: alt-vpa-recommender-sa
namespace: <namespace_name>
1 | 在部署推荐器的命名空间中创建一个服务帐户。 |
2 | 将推荐器服务帐户绑定到 metrics-reader 角色。指定要部署推荐器的命名空间。 |
3 | 将推荐器服务帐户绑定到 vpa-actor 角色。指定要部署推荐器的命名空间。 |
4 | 将推荐器服务帐户绑定到 vpa-target-reader 角色。指定要部署推荐器的命名空间。 |
要将替代推荐器添加到集群,请创建一个类似于以下内容的 Deployment 对象
apiVersion: apps/v1
kind: Deployment
metadata:
name: alt-vpa-recommender
namespace: <namespace_name>
spec:
replicas: 1
selector:
matchLabels:
app: alt-vpa-recommender
template:
metadata:
labels:
app: alt-vpa-recommender
spec:
containers: (1)
- name: recommender
image: quay.io/example/alt-recommender:latest (2)
imagePullPolicy: Always
resources:
limits:
cpu: 200m
memory: 1000Mi
requests:
cpu: 50m
memory: 500Mi
ports:
- name: prometheus
containerPort: 8942
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
seccompProfile:
type: RuntimeDefault
serviceAccountName: alt-vpa-recommender-sa (3)
securityContext:
runAsNonRoot: true
1 | 为您的替代推荐器创建一个容器。 |
2 | 指定您的推荐器镜像。 |
3 | 关联您为推荐器创建的服务帐户。 |
将在同一命名空间中为替代推荐器创建一个新的 Pod。
$ oc get pods
NAME READY STATUS RESTARTS AGE
frontend-845d5478d-558zf 1/1 Running 0 4m25s
frontend-845d5478d-7z9gx 1/1 Running 0 4m25s
frontend-845d5478d-b7l4j 1/1 Running 0 4m25s
vpa-alt-recommender-55878867f9-6tp5v 1/1 Running 0 9s
配置包含替代推荐器 Deployment
对象名称的 VPA CR。
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: vpa-recommender
namespace: <namespace_name>
spec:
recommenders:
- name: alt-vpa-recommender (1)
targetRef:
apiVersion: "apps/v1"
kind: Deployment (2)
name: frontend
1 | 指定替代推荐器部署的名称。 |
2 | 指定您希望此 VPA 管理的现有工作负载对象的名称。 |
您可以通过创建 VPA 自定义资源 (CR) 来使用垂直 Pod 自动缩放器运算符 (VPA)。CR 指示它应该分析哪些 Pod,并确定 VPA 应该对这些 Pod 执行的操作。
您想要自动缩放的工作负载对象必须存在。
如果您想使用替代推荐器,则必须存在包含该推荐器的部署。
为特定工作负载对象创建 VPA CR
切换到您要缩放的工作负载对象所在的项目。
创建一个 VPA CR YAML 文件
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: vpa-recommender
spec:
targetRef:
apiVersion: "apps/v1"
kind: Deployment (1)
name: frontend (2)
updatePolicy:
updateMode: "Auto" (3)
resourcePolicy: (4)
containerPolicies:
- containerName: my-opt-sidecar
mode: "Off"
recommenders: (5)
- name: my-recommender
1 | 指定您希望此 VPA 管理的工作负载对象的类型:Deployment 、StatefulSet 、Job 、DaemonSet 、ReplicaSet 或 ReplicationController 。 |
2 | 指定您希望此 VPA 管理的现有工作负载对象的名称。 |
3 | 指定 VPA 模式
|
4 | 可选。指定您想要选择退出的容器并将模式设置为 Off 。 |
5 | 可选。指定替代推荐器。 |
创建 VPA CR
$ oc create -f <file-name>.yaml
片刻之后,VPA 将学习与工作负载对象关联的 Pod 中容器的资源使用情况。
您可以使用以下命令查看 VPA 建议
$ oc get vpa <vpa-name> --output yaml
输出显示 CPU 和内存请求的建议,类似于以下内容
...
status:
...
recommendation:
containerRecommendations:
- containerName: frontend
lowerBound: (1)
cpu: 25m
memory: 262144k
target: (2)
cpu: 25m
memory: 262144k
uncappedTarget: (3)
cpu: 25m
memory: 262144k
upperBound: (4)
cpu: 262m
memory: "274357142"
- containerName: backend
lowerBound:
cpu: 12m
memory: 131072k
target:
cpu: 12m
memory: 131072k
uncappedTarget:
cpu: 12m
memory: 131072k
upperBound:
cpu: 476m
memory: "498558823"
...
1 | lowerBound 是最低推荐资源级别。 |
2 | target 是推荐的资源级别。 |
3 | upperBound 是最高的推荐资源级别。 |
4 | uncappedTarget 是最新的资源建议。 |
您可以从 OpenShift Container Platform 集群中删除垂直 Pod 自动缩放器运算符 (VPA)。卸载后,现有 VPA CR 已修改的 Pod 的资源请求不会更改。任何新的 Pod 都将获得工作负载对象中定义的资源,而不是垂直 Pod 自动缩放器运算符之前做出的建议。
您可以使用 |
删除 VPA 运算符后,建议您删除与运算符关联的其他组件,以避免潜在问题。
必须安装垂直 Pod 自动缩放器运算符。
在 OpenShift Container Platform Web 控制台中,单击**运算符** → **已安装的运算符**。
切换到 openshift-vertical-pod-autoscaler 项目。
对于**垂直 Pod 自动伸缩器 (VerticalPodAutoscaler)** 运算符,单击“选项”菜单 并选择**卸载运算符**。
可选:要删除与运算符关联的所有操作数,请在对话框中选中**删除此运算符的所有操作数实例**复选框。
单击**卸载**。
可选:使用 OpenShift CLI 删除 VPA 组件
删除 VPA 命名空间
$ oc delete namespace openshift-vertical-pod-autoscaler
删除 VPA 自定义资源定义 (CRD) 对象
$ oc delete crd verticalpodautoscalercheckpoints.autoscaling.k8s.io
$ oc delete crd verticalpodautoscalercontrollers.autoscaling.openshift.io
$ oc delete crd verticalpodautoscalers.autoscaling.k8s.io
删除 CRD 将删除关联的角色、集群角色和角色绑定。
此操作将从集群中删除所有用户创建的 VPA CR。如果重新安装 VPA,则必须重新创建这些对象。 |
运行以下命令删除MutatingWebhookConfiguration
对象
$ oc delete MutatingWebhookConfiguration vpa-webhook-config
删除 VPA 运算符
$ oc delete operator/vertical-pod-autoscaler.openshift-vertical-pod-autoscaler