《OpenShift / RHEL / DevSecOps 汇总目录》
说明:本文已经在 OpenShift 4.14 的环境中验证
为什么需要就地调整 Pod 资源
以往在 Kubernetes 中调整 Pod 的 CPU 和内存资源的过程需要创建一个新的 Pod 来替换原有 Pod,不过在 Kubernetes 1.27.以及 OpenShift 4.14 版本开始支持原地调整 Pod 使用的资源。
在原有 Pod 就地调整资源具备以下优势:
- 减少停机时间:重新创建 Pod 以调整其资源可能会导致停机,特别是如果 Pod 是 StatefulSet 的一部分或正在处理关键任务时。就地调整 Pod 大小可减少停机时间,确保更顺畅的运行。
- 高效利用资源:资源配置过多会造成浪费,而资源配置不足则会导致性能问题。动态调整大小可确保根据实时需求高效使用资源。
- 节约成本:高效的资源利用可以节约成本,尤其是在云环境中,使用多少资源就要支付多少费用。
- 简化操作:无需手动干预和重新创建 Pod 或调整部署配置。这简化了运营开销。
启动 InPlacePodVerticalScaling 特性
为了在 OpenShift 中使用就地调整 Pod 资源的功能,需要先通过 FeatureGate 启动相关功能。
- 在 OpenShift 管理控制台进入“管理->集群设置”,在 “配置” 中查找 “featuregate”,然后进入 FeatureGate。
- 在 FeatureGate 的 YAML 中增加以下部分,然后保存。
spec:
customNoUpgrade:
enabled:
- InPlacePodVerticalScaling
- BuildCSIVolumes
- CloudDualStackNodeIPs
- OpenShiftPodSecurityAdmission
featureSet: CustomNoUpgrade
实现就地调整 Pod 资源
- 执行命令创建测试 Pod,其中设置了 cpu 和 memory 使用量。
$ cat << EOF | oc apply -f -
apiVersion: v1
kind: Pod
metadata:
name: resizeme
spec:
containers:
- name: resizeme
image: ubi9/ubi
command: ["tail", "-f", "/dev/null"]
resources:
requests:
cpu: 1
memory: "512Mi"
limits:
cpu: 2
memory: "1Gi"
EOF
- 执行命令查看 Pod 的 resizePolicy,确认 restartPolicy 缺省都是 NotRequired。
$ oc get pod resizeme -ojsonpath="{.spec.containers[0].resizePolicy}" | jq
[
{
"resourceName": "cpu",
"restartPolicy": "NotRequired"
},
{
"resourceName": "memory",
"restartPolicy": "NotRequired"
}
]
- 执行命令修改 Pod 使用的资源,将 cpu 调整为 2。
$ oc patch pod resizeme -p ' {"spec": {"containers": [{"name": "resizeme", "resources": { "requests" :{ "cpu" : 2, "memory": "512Mi"}, "limits" :{ "cpu" : 2, "memory" : "1Gi" } } }] }}'
- 执行命令查看 resize 的状态。InProgress 为正在进行中,成功完成后将没有返回。
$ oc get pods resizeme -o jsonpath="{.status.resize}{'\n'}"
InProgress
- 执行命令查看 Pod 使用资源,可以看到 Pod 可使用的 cpu 已经调整为 2。
$ oc get pod resizeme -ojsonpath="{.status.containerStatuses[0].resources}" | jq
{
"limits": {
"cpu": "2",
"memory": "1Gi"
},
"requests": {
"cpu": "2",
"memory": "512Mi"
}
}
- 也可在 Pod 的指标界面中可以看到 Pod 可使用的 cpu 已经调整为 2。
参考
https://cloud.redhat.com/blog/in-place-resource-resize-of-openshift-pod-spec
https://kubernetes.io/docs/reference/command-line-tools-reference/feature-gates/