调整分配给容器的 CPU 和内存资源
Kubernetes v1.27 [alpha]
本页面假设您熟悉 Kubernetes Pod 的服务质量。
本页面展示了如何在不重启 Pod 或其容器的情况下调整分配给运行中 Pod 的容器的 CPU 和内存资源。Kubernetes 节点根据 Pod 的 requests
为 Pod 分配资源,并根据 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