调整分配给容器的 CPU 和内存资源
Kubernetes v1.27 [alpha]
本页假设您熟悉 Kubernetes Pod 的服务质量。
本页展示了如何在不重启 Pod 或其容器的情况下调整分配给运行中 Pod 的容器的 CPU 和内存资源。Kubernetes 节点根据 Pod 的 requests
为其分配资源,并根据 Pod 的容器中指定的 limits
限制 Pod 的资源使用。
更改运行中 Pod 的资源分配需要启用 InPlacePodVerticalScaling
功能门控。另一种方法是删除 Pod 并让 工作负载控制器 创建一个具有不同资源需求的替换 Pod。
用于就地调整 Pod 资源
- 容器的资源
requests
和limits
对 CPU 和内存资源是 可变 的。 - Pod 状态的
containerStatuses
中的allocatedResources
字段反映分配给 Pod 容器的资源。 - Pod 状态的
containerStatuses
中的resources
字段反映容器运行时报告的运行容器的实际资源requests
和limits
。 - Pod 状态中的
resize
字段显示上次请求的待处理调整状态。它可以具有以下值Proposed
:此值表示对请求的调整的确认,以及该请求已验证并记录。InProgress
:此值表示节点已接受调整请求,并且正在将其应用于 Pod 的容器。Deferred
:此值表示目前无法满足请求的调整,节点将继续重试。当其他 Pod 离开并释放节点资源时,可能会批准调整。Infeasible
:表示节点无法满足请求的调整。如果请求的调整超过节点可以为 Pod 分配的最大资源,则可能会发生这种情况。
在您开始之前
您需要有一个 Kubernetes 集群,并且 kubectl 命令行工具必须配置为与您的集群通信。建议在至少有两个节点(不充当控制平面主机)的集群上运行本教程。如果您还没有集群,可以使用 minikube 创建一个,也可以使用以下 Kubernetes 游乐场之一
您的 Kubernetes 服务器必须为 1.27 或更高版本。要检查版本,请输入kubectl version
。您集群中的控制平面和所有节点都必须启用 InPlacePodVerticalScaling
功能门控。
容器调整策略
调整策略允许更细粒度地控制如何调整 Pod 容器的 CPU 和内存资源。例如,容器的应用程序可能能够处理 CPU 资源调整而无需重新启动,但调整内存可能需要应用程序(因此容器)重新启动。
要启用此功能,容器规范允许用户指定 resizePolicy
。可以为调整 CPU 和内存指定以下重启策略
NotRequired
:在容器运行时调整其资源。RestartContainer
:重新启动容器并在重新启动后应用新的资源。
如果未指定 resizePolicy[*].restartPolicy
,则其默认值为 NotRequired
。
注意
如果 Pod 的restartPolicy
为 Never
,则容器的调整重启策略必须设置为 Pod 中所有容器的 NotRequired
。以下示例显示了一个 Pod,其容器的 CPU 可以调整而无需重新启动,但调整内存需要重新启动容器。
apiVersion: v1
kind: Pod
metadata:
name: qos-demo-5
namespace: qos-example
spec:
containers:
- name: qos-demo-ctr-5
image: nginx
resizePolicy:
- resourceName: cpu
restartPolicy: NotRequired
- resourceName: memory
restartPolicy: RestartContainer
resources:
limits:
memory: "200Mi"
cpu: "700m"
requests:
memory: "200Mi"
cpu: "700m"
注意
在上面的示例中,如果 CPU 和 内存的所需请求或限制都发生了更改,则将重新启动容器以调整其内存。创建一个具有资源请求和限制的 Pod
您可以通过为 Pod 的容器指定请求和/或限制来创建一个保证或突发 服务质量 类别 Pod。
请考虑以下具有一个容器的 Pod 的清单。
apiVersion: v1
kind: Pod
metadata:
name: qos-demo-5
namespace: qos-example
spec:
containers:
- name: qos-demo-ctr-5
image: nginx
resources:
limits:
memory: "200Mi"
cpu: "700m"
requests:
memory: "200Mi"
cpu: "700m"
在 qos-example
命名空间中创建 Pod
kubectl create namespace qos-example
kubectl create -f https://k8s.io/examples/pods/qos/qos-pod-5.yaml
此 Pod 被归类为保证 QoS 类别,请求 700m CPU 和 200Mi 内存。
查看有关 Pod 的详细的信息
kubectl get pod qos-demo-5 --output=yaml --namespace=qos-example
另请注意,resizePolicy[*].restartPolicy
的值默认为 NotRequired
,表示可以在容器运行时调整 CPU 和内存。
spec:
containers:
...
resizePolicy:
- resourceName: cpu
restartPolicy: NotRequired
- resourceName: memory
restartPolicy: NotRequired
resources:
limits:
cpu: 700m
memory: 200Mi
requests:
cpu: 700m
memory: 200Mi
...
containerStatuses:
...
name: qos-demo-ctr-5
ready: true
...
allocatedResources:
cpu: 700m
memory: 200Mi
resources:
limits:
cpu: 700m
memory: 200Mi
requests:
cpu: 700m
memory: 200Mi
restartCount: 0
started: true
...
qosClass: Guaranteed
更新 Pod 的资源
假设 CPU 需求已增加,现在需要 0.8 CPU。这可以手动指定,也可以由诸如 垂直 Pod 自动缩放器 (VPA) 等实体确定并以编程方式应用。
注意
虽然您可以更改 Pod 的请求和限制以表达新的所需资源,但不能更改 Pod 创建时的 QoS 类别。现在,使用 CPU 请求和限制都设置为 800m
来修补 Pod 的容器。
kubectl -n qos-example patch pod qos-demo-5 --patch '{"spec":{"containers":[{"name":"qos-demo-ctr-5", "resources":{"requests":{"cpu":"800m"}, "limits":{"cpu":"800m"}}}]}}'
在修补 Pod 后查询 Pod 的详细信息。
kubectl get pod qos-demo-5 --output=yaml --namespace=qos-example
以下 Pod 的规范反映了更新的 CPU 请求和限制。
spec:
containers:
...
resources:
limits:
cpu: 800m
memory: 200Mi
requests:
cpu: 800m
memory: 200Mi
...
containerStatuses:
...
allocatedResources:
cpu: 800m
memory: 200Mi
resources:
limits:
cpu: 800m
memory: 200Mi
requests:
cpu: 800m
memory: 200Mi
restartCount: 0
started: true
请注意,allocatedResources
值已更新以反映新的所需 CPU 请求。这表示节点能够满足增加的 CPU 资源需求。
在容器的状态中,更新的 CPU 资源值显示已应用了新的 CPU 资源。容器的 restartCount
保持不变,表示容器的 CPU 资源已调整,而无需重新启动容器。
清理
删除您的命名空间
kubectl delete namespace qos-example