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

功能状态: Kubernetes v1.27 [alpha]

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

本页展示了如何在不重启 Pod 或其容器的情况下调整分配给运行中 Pod 的容器的 CPU 和内存资源。Kubernetes 节点根据 Pod 的 requests 为其分配资源,并根据 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)