调整分配给容器的 CPU 和内存资源

FEATURE STATE: Kubernetes v1.27 [alpha]

本页面假设您熟悉 Kubernetes Pod 的服务质量

本页面展示了如何在不重启 Pod 或其容器的情况下调整分配给运行中 Pod 的容器的 CPU 和内存资源。Kubernetes 节点根据 Pod 的 requests 为 Pod 分配资源,并根据 Pod 的容器中指定的 limits 限制 Pod 的资源使用。

更改运行中 Pod 的资源分配需要启用 InPlacePodVerticalScaling 功能开关。另一种方法是删除 Pod,并让 工作负载控制器 创建一个具有不同资源需求的替换 Pod。

对于 Pod 资源的原地调整

  • 容器的资源 requestslimits 对于 CPU 和内存资源是 可变的
  • Pod 状态的 containerStatuses 中的 allocatedResources 字段反映分配给 Pod 容器的资源。
  • Pod 状态的 containerStatuses 中的 resources 字段反映容器运行时报告的运行容器上配置的实际资源 requestslimits
  • 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,其容器的 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"

创建具有资源请求和限制的 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) 之类的实体确定并以编程方式应用。

现在,用 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

下一步

对于应用程序开发人员

对于集群管理员

上次修改时间:2024 年 2 月 20 日,太平洋标准时间上午 9:48:将更多功能状态简码切换为数据驱动 (7b6866063f)