8.6. 在节点上配置 Linux cgroup 版本
自 OpenShift Container Platform 4.14 起,OpenShift Container Platform 在集群中使用 Linux 控制组版本 2 (cgroup v2)。如果您在 OpenShift Container Platform 4.13 或更早版本中使用 cgroup v1,迁移到 OpenShift Container Platform 4.14 不会自动将 cgroup 配置更新至版本 2。全新安装 OpenShift Container Platform 4.14 默认将使用 cgroup v2。但是,您可以在安装时启用 Linux 控制组群版本 1 (cgroup v1)。
cgroup v2 是 Linux cgroup API 的当前版本。cgroup v2 比 cgroup v1 提供多种改进,包括统一层次结构、更安全的子树委派、新功能,如 Pressure Stall Information,以及增强的资源管理和隔离。但是,cgroup v2 与 cgroup v1 具有不同的 CPU、内存和 I/O 管理特征。因此,在运行 cgroup v2 的集群上,一些工作负载可能会遇到内存或 CPU 用量差异。
您可以根据需要在 cgroup v1 和 cgroup v2 之间更改。在 OpenShift Container Platform 中启用 cgroup v1 禁用集群中的所有 cgroup v2 控制器和层次结构。
- 如果您运行依赖于 cgroup 文件系统的第三方监控和安全代理,请将代理更新为支持 cgroup v2 的版本。
- 如果您配置了 cgroup v2,并将 cAdvisor 作为监控 pod 和容器的独立守护进程集运行,请将 cAdvisor 更新至 v0.43.0 或更高版本。
如果您部署 Java 应用程序,请使用完全支持 cgroup v2 的版本,如以下软件包:
- OpenJDK / HotSpot: jdk8u372, 11.0.16, 15 及更新版本
- NodeJs 20.3.0 或更高版本
- IBM Semeru Runtimes: jdk8u345-b01, 11.0.16.0, 17.0.4.0, 18.0.2.0 及更新版本
- IBM SDK Java 技术版本(IBM Java): 8.0.7.15 及更新版本
8.6.1. 配置 Linux cgroup
您可以通过编辑 node.config
对象来启用 Linux 控制组群版本 1 (cgroup v1) 或 Linux 控制组群版本 2 (cgroup v2)。默认值为 cgroup v2。
在 Telco 中,因为缺少对 cgroup v2 的支持,使用 PerformanceProfile
进行低延迟、实时和 Data Plane Development Kit (DPDK) 工作负载的集群会自动恢复到使用 cgroup v1。如果您使用 PerformanceProfile
,则不支持启用 cgroup v2。
先决条件
- 您有一个正在运行的 OpenShift Container Platform 集群,它使用版本 4.12 或更高版本。
- 以具有管理特权的用户身份登录集群。
流程
在节点上启用 cgroup v1:
编辑
node.config
对象:$ oc edit nodes.config/cluster
编辑
spec.cgroupMode
参数:node.config
对象示例apiVersion: config.openshift.io/v2 kind: Node metadata: annotations: include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" include.release.openshift.io/single-node-developer: "true" release.openshift.io/create-only: "true" creationTimestamp: "2022-07-08T16:02:51Z" generation: 1 name: cluster ownerReferences: - apiVersion: config.openshift.io/v2 kind: ClusterVersion name: version uid: 36282574-bf9f-409e-a6cd-3032939293eb resourceVersion: "1865" uid: 0c0f7a4c-4307-4187-b591-6155695ac85b spec: cgroupMode: "v1" 1 ...
- 1
- 指定
v1
启用 cgroup v1,或v2
启用 cgroup v2。
验证
检查机器配置以查看是否添加了新的机器配置:
$ oc get mc
输出示例
NAME GENERATEDBYCONTROLLER IGNITIONVERSION AGE 00-master 52dd3ba6a9a527fc3ab42afac8d12b693534c8c9 3.2.0 33m 00-worker 52dd3ba6a9a527fc3ab42afac8d12b693534c8c9 3.2.0 33m 01-master-container-runtime 52dd3ba6a9a527fc3ab42afac8d12b693534c8c9 3.2.0 33m 01-master-kubelet 52dd3ba6a9a527fc3ab42afac8d12b693534c8c9 3.2.0 33m 01-worker-container-runtime 52dd3ba6a9a527fc3ab42afac8d12b693534c8c9 3.2.0 33m 01-worker-kubelet 52dd3ba6a9a527fc3ab42afac8d12b693534c8c9 3.2.0 33m 97-master-generated-kubelet 52dd3ba6a9a527fc3ab42afac8d12b693534c8c9 3.2.0 33m 99-worker-generated-kubelet 52dd3ba6a9a527fc3ab42afac8d12b693534c8c9 3.2.0 33m 99-master-generated-registries 52dd3ba6a9a527fc3ab42afac8d12b693534c8c9 3.2.0 33m 99-master-ssh 3.2.0 40m 99-worker-generated-registries 52dd3ba6a9a527fc3ab42afac8d12b693534c8c9 3.2.0 33m 99-worker-ssh 3.2.0 40m rendered-master-23d4317815a5f854bd3553d689cfe2e9 52dd3ba6a9a527fc3ab42afac8d12b693534c8c9 3.2.0 10s 1 rendered-master-23e785de7587df95a4b517e0647e5ab7 52dd3ba6a9a527fc3ab42afac8d12b693534c8c9 3.2.0 33m rendered-worker-5d596d9293ca3ea80c896a1191735bb1 52dd3ba6a9a527fc3ab42afac8d12b693534c8c9 3.2.0 33m rendered-worker-dcc7f1b92892d34db74d6832bcc9ccd4 52dd3ba6a9a527fc3ab42afac8d12b693534c8c9 3.2.0 10s
- 1
- 创建新机器配置,如预期一样。
检查新的
kernelArguments
是否已添加到新机器配置中:$ oc describe mc <name>
cgroup v2 的输出示例
apiVersion: machineconfiguration.openshift.io/v2 kind: MachineConfig metadata: labels: machineconfiguration.openshift.io/role: worker name: 05-worker-kernelarg-selinuxpermissive spec: kernelArguments: systemd_unified_cgroup_hierarchy=1 1 cgroup_no_v1="all" 2 psi=1 3
cgroup v1 的输出示例
apiVersion: machineconfiguration.openshift.io/v2 kind: MachineConfig metadata: labels: machineconfiguration.openshift.io/role: worker name: 05-worker-kernelarg-selinuxpermissive spec: kernelArguments: systemd.unified_cgroup_hierarchy=0 1 systemd.legacy_systemd_cgroup_controller=1 2
检查节点以查看是否禁用了在节点上调度。这表示要应用更改:
$ oc get nodes
输出示例
NAME STATUS ROLES AGE VERSION ci-ln-fm1qnwt-72292-99kt6-master-0 Ready,SchedulingDisabled master 58m v1.27.3 ci-ln-fm1qnwt-72292-99kt6-master-1 Ready master 58m v1.27.3 ci-ln-fm1qnwt-72292-99kt6-master-2 Ready master 58m v1.27.3 ci-ln-fm1qnwt-72292-99kt6-worker-a-h5gt4 Ready,SchedulingDisabled worker 48m v1.27.3 ci-ln-fm1qnwt-72292-99kt6-worker-b-7vtmd Ready worker 48m v1.27.3 ci-ln-fm1qnwt-72292-99kt6-worker-c-rhzkv Ready worker 48m v1.27.3
节点返回
Ready
状态后,为该节点启动 debug 会话:$ oc debug node/<node_name>
将
/host
设置为 debug shell 中的根目录:sh-4.4# chroot /host
检查节点上是否存在
sys/fs/cgroup/cgroup2fs
或sys/fs/cgroup/tmpfs
文件:$ stat -c %T -f /sys/fs/cgroup
cgroup v2 的输出示例
cgroup2fs
cgroup v1 的输出示例
tmpfs