2.6. 在不中断 pod 的情况下调整 pod 资源级别


您可以使用 原位 pod 重新定义大小调整,在不重新创建或重启 pod 的情况下更改分配给容器的 CPU 或内存资源请求和限值。

2.6.1. 关于原位 pod 大小调整

通过原位升级 pod 大小,您可以在不中断应用程序的情况下更改正在运行的 pod 中的容器的 CPU 和内存资源。更改 pod CPU 和内存资源的标准方法会导致重新创建 pod,从而导致中断。通过原位 pod 大小调整,您可以扩展或缩减 pod 资源,而不会遇到与 pod 重启相关的停机时间或状态丢失。

当使用原位升级 pod 调整大小来更改 CPU 或内存资源时,您可以通过在 pod 规格中配置调整大小策略来控制 pod 是否重启。以下示例调整大小的策略需要在更改内存资源时重启 pod,但会阻止重启 CPU 资源更改。

资源策略示例

apiVersion: v1
kind: Pod
metadata:
  name: resize-demo
spec:
  securityContext:
    runAsNonRoot: true
    seccompProfile:
      type: RuntimeDefault
  containers:
  - name: pause
# ...
    resizePolicy: 
1

    - resourceName: cpu
      restartPolicy: NotRequired
    - resourceName: memory
      restartPolicy: RestartContainer
Copy to Clipboard Toggle word wrap

1
指定调整大小的策略。
注意

除非 memory 的大小策略是 RestartContainer,否则无法减少内存限值。

您无法将调整大小策略添加到现有 pod 中,但如果 Pod 具有所有者对象,您可以在 Pod 的所有者对象(如部署)中添加或编辑策略。

使用原位升级 pod 大小要求您在 OpenShift CLI (oc)中编辑 pod 时,使用- subresource resize 标记,如下例所示:

示例命令

$ oc edit pod <pod_name>  --subresource resize
Copy to Clipboard Toggle word wrap

$ apply -f <file_name>.yaml --subresource resize
Copy to Clipboard Toggle word wrap
$ patch pod <pod_name> --subresource resize --patch \
  '{"spec":{"containers":[{"name":"pause", "resources":{"requests":{"cpu":"800m"}, "limits":{"cpu":"800m"}}}]}}'
Copy to Clipboard Toggle word wrap

由于您需要使用带有调整大小 策略的-subresource resize 标志,所以您无法在 OpenShift Container Platform Web 控制台中编辑 pod 资源。

如果调整大小策略为 NotRequired 并更改请求或限值,则 pod 不会重启。

$ oc get pods
Copy to Clipboard Toggle word wrap

输出示例

NAME                          READY   STATUS    RESTARTS     AGE
resize-pod                    1/1     Running   0            5s
Copy to Clipboard Toggle word wrap

如果调整大小策略是 RestartContainer,并且您更改了请求或限值,则 pod 会重启。

$ oc get pods
Copy to Clipboard Toggle word wrap

输出示例

NAME                         READY   STATUS    RESTARTS    AGE
resize-pod                   1/1     Running   1 (5s ago)  5s
Copy to Clipboard Toggle word wrap

完成资源更改后,pod 状态条件通过使用以下信息来指示调整大小请求的状态:

  • PodResizeInProgress :kubelet 能够分配所请求的资源,并会应用更改。
  • PodResizePending: kubelet 无法立即更改以下原因:

    • 无效 : 请求的大小不能在当前节点上执行。例如,请求的资源超过节点可用的资源将导致 无效条件
    • 延迟 :请求的调整大小当前不可能,但可能会在以后出现。例如,如果从节点中删除另一个 pod,则请求的资源可能会可用。kubelet 在节点更改时重试调整大小。
  • 错误: kubelet 在资源分配过程中遇到错误,并在 message 字段中报告错误的原因。

不可容忍的更改状态示例

apiVersion: v1
kind: Pod
metadata:
  name: resize-demo
# ...
status:
  conditions:
  - lastProbeTime: "2025-09-03T15:00:50Z"
    lastTransitionTime: "2025-09-03T15:00:50Z"
    message: 'Node didn''t have enough capacity: cpu, requested: 1000000, capacity:
      3500'
    reason: Infeasible
    status: "True"
    type: PodResizePending
Copy to Clipboard Toggle word wrap

请注意以下限制:

  • 不可重启的 init 容器和临时容器不支持原位升级 pod 大小调整。
  • 如果更改违反了其他 pod mutability 约束,如 pod QoS 类,则不允许原位 pod 大小调整。
  • 由静态 cpuManagerPolicymemoryManagerPolicy 参数管理的 Pod 无法调整原位 pod 的大小。
  • 使用交换内存的 Pod 必须为带有 in-place pod 大小的内存请求使用 RestartContainer 策略。

2.6.2. 配置原位升级 pod 大小

原位 pod 大小要求您将调整大小的策略添加到 pod 规格中。

您不能在现有 pod 中添加或修改调整大小的策略,但如果 Pod 具有所有者对象,您可以在 Pod 的所有者对象(如部署)中添加或编辑策略。

流程

  1. 创建具有调整大小策略的 pod 规格,或将调整大小的策略添加到现有 pod 的所有者对象中:

    1. 创建一个类似以下示例的 YAML 文件:

      apiVersion: v1
      kind: Pod
      metadata:
        name: resize-pod
      spec:
      # ...
        containers:
        - name: pause
          resizePolicy: 
      1
      
          - resourceName: cpu
            restartPolicy: NotRequired
          - resourceName: memory
            restartPolicy: RestartContainer
      # ...
      Copy to Clipboard Toggle word wrap
      1
      指定调整大小的策略。对于 CPU 和/或内存资源,请指定以下值之一:
      • NotRequired: 在不重启 pod 的情况下应用任何资源更改。这是使用调整大小策略时的默认设置。
      • RestartContainer :应用任何资源更改并重启 pod。
    2. 运行以下命令来创建对象:

      $ oc create -f <file_name>.yaml
      Copy to Clipboard Toggle word wrap

验证

  • 通过运行以下命令来修改 CPU 或内存请求或限值,以检查是否应用了类似如下的策略。您必须包含-- subresource 大小 标记。如果 pod 具有所有者对象,如部署,您必须编辑 owner 对象。

    $ oc edit pod <pod_name>  --subresource resize
    Copy to Clipboard Toggle word wrap

    如果应用了策略,pod 会如预期响应。

    $ oc get pods
    Copy to Clipboard Toggle word wrap

    如果调整大小策略为 NotRequired,则 pod 不会重启。

    输出示例

    NAME                          READY   STATUS    RESTARTS     AGE
    resize-pod                    1/1     Running   0            5s
    Copy to Clipboard Toggle word wrap

    如果调整大小策略是 RestartContainer,则 Pod 将重启。

    输出示例

    NAME                         READY   STATUS    RESTARTS    AGE
    resize-pod                   1/1     Running   1 (5s ago)  5s
    Copy to Clipboard Toggle word wrap

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat