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 资源更改。
资源策略示例
- 1
- 指定调整大小的策略。
除非 memory
的大小策略是 RestartContainer
,否则无法减少内存限值。
您无法将调整大小策略添加到现有 pod 中,但如果 Pod 具有所有者对象,您可以在 Pod 的所有者对象(如部署)中添加或编辑策略。
使用原位升级 pod 大小要求您在 OpenShift CLI (oc
)中编辑 pod 时,使用- subresource resize
标记,如下例所示:
示例命令
oc edit pod <pod_name> --subresource resize
$ oc edit pod <pod_name> --subresource resize
apply -f <file_name>.yaml --subresource resize
$ apply -f <file_name>.yaml --subresource resize
patch pod <pod_name> --subresource resize --patch \ '{"spec":{"containers":[{"name":"pause", "resources":{"requests":{"cpu":"800m"}, "limits":{"cpu":"800m"}}}]}}'
$ patch pod <pod_name> --subresource resize --patch \
'{"spec":{"containers":[{"name":"pause", "resources":{"requests":{"cpu":"800m"}, "limits":{"cpu":"800m"}}}]}}'
由于您需要使用带有调整大小 策略的-subresource resize
标志,所以您无法在 OpenShift Container Platform Web 控制台中编辑 pod 资源。
如果调整大小策略为 NotRequired
并更改请求或限值,则 pod 不会重启。
oc get pods
$ oc get pods
输出示例
NAME READY STATUS RESTARTS AGE resize-pod 1/1 Running 0 5s
NAME READY STATUS RESTARTS AGE
resize-pod 1/1 Running 0 5s
如果调整大小策略是 RestartContainer
,并且您更改了请求或限值,则 pod 会重启。
oc get pods
$ oc get pods
输出示例
NAME READY STATUS RESTARTS AGE resize-pod 1/1 Running 1 (5s ago) 5s
NAME READY STATUS RESTARTS AGE
resize-pod 1/1 Running 1 (5s ago) 5s
完成资源更改后,pod 状态条件通过使用以下信息来指示调整大小请求的状态:
-
PodResizeInProgress
:kubelet 能够分配所请求的资源,并会应用更改。 PodResizePending
: kubelet 无法立即更改以下原因:-
无效 :
请求的大小不能在当前节点上执行。例如,请求的资源超过节点可用的资源将导致无效条件
。 -
延迟
:请求的调整大小当前不可能,但可能会在以后出现。例如,如果从节点中删除另一个 pod,则请求的资源可能会可用。kubelet 在节点更改时重试调整大小。
-
-
错误
: kubelet 在资源分配过程中遇到错误,并在 message 字段中报告错误的原因。
不可容忍的更改状态示例
请注意以下限制:
- 不可重启的 init 容器和临时容器不支持原位升级 pod 大小调整。
- 如果更改违反了其他 pod mutability 约束,如 pod QoS 类,则不允许原位 pod 大小调整。
-
由静态
cpuManagerPolicy
或memoryManagerPolicy
参数管理的 Pod 无法调整原位 pod 的大小。 -
使用交换内存的 Pod 必须为带有 in-place pod 大小的内存请求使用
RestartContainer
策略。
2.6.2. 配置原位升级 pod 大小 复制链接链接已复制到粘贴板!
原位 pod 大小要求您将调整大小的策略添加到 pod 规格中。
您不能在现有 pod 中添加或修改调整大小的策略,但如果 Pod 具有所有者对象,您可以在 Pod 的所有者对象(如部署)中添加或编辑策略。
流程
创建具有调整大小策略的 pod 规格,或将调整大小的策略添加到现有 pod 的所有者对象中:
创建一个类似以下示例的 YAML 文件:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 指定调整大小的策略。对于 CPU 和/或内存资源,请指定以下值之一:
-
NotRequired
: 在不重启 pod 的情况下应用任何资源更改。这是使用调整大小策略时的默认设置。 -
RestartContainer
:应用任何资源更改并重启 pod。
-
运行以下命令来创建对象:
oc create -f <file_name>.yaml
$ oc create -f <file_name>.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
通过运行以下命令来修改 CPU 或内存请求或限值,以检查是否应用了类似如下的策略。您必须包含--
subresource 大小
标记。如果 pod 具有所有者对象,如部署,您必须编辑 owner 对象。oc edit pod <pod_name> --subresource resize
$ oc edit pod <pod_name> --subresource resize
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果应用了策略,pod 会如预期响应。
oc get pods
$ oc get pods
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果调整大小策略为
NotRequired
,则 pod 不会重启。输出示例
NAME READY STATUS RESTARTS AGE resize-pod 1/1 Running 0 5s
NAME READY STATUS RESTARTS AGE resize-pod 1/1 Running 0 5s
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果调整大小策略是
RestartContainer
,则 Pod 将重启。输出示例
NAME READY STATUS RESTARTS AGE resize-pod 1/1 Running 1 (5s ago) 5s
NAME READY STATUS RESTARTS AGE resize-pod 1/1 Running 1 (5s ago) 5s
Copy to Clipboard Copied! Toggle word wrap Toggle overflow