[Red Hat OpenShift on IBM Cloud] Worker NodeのOSごとのcgroupのバージョンを調べた

今回は Red Hat OpenShift on IBM Cloud で Worker Node の OS の種類ごとに cgroup のバージョンを調べてみました。

<h2>実際に調べてみた</h2>

ワーカーノード OS についてバージョンアップを検討する場合、バージョンアップ後の OS におけるミドルウェアやアプリケーションなどワークロードのサポート状況を調べる必要があります。最近では意識する必要がある点として、cgroup の v1 と v2 のどちらを利用しているかという点があります。例えば Java のワークロードで古いバージョンの実行環境を使用している場合、 cgroup v2 が有効化されている環境で稼働させると、メモリーリークが発生することなどがわかっています。ミドルウェアを新しいバージョンにする場合、そのテストを行う必要があるだけでなく、場合によってはソフトウェアの稼働スタックの更新にあわせてアプリケーションの更新が必要になってしまいます。

記事執筆時点の 2024 年 12 月に選択可能なワーカーノードの OS は以下の 3 種類です。OpenShift のバージョンやインフラストラクチャーの種類 (Classic IaaS/VPC) により利用できるワーカーノード OS がこれより少ないケースもありますが、今回はすべての選択肢を利用可能な VPC 上で稼働する OpenShift クラスター バージョン 4.16 で試しました。
- Red Hat Enterprise Linux Core OS (RHCOS)
- Red Hat Enterprise Linux 9 (RHEL9)
- Red Hat Enterprise Linux 8 (RHEL8)

ワーカーノードの OS の種類ごとに別々のクラスターを作成し、それぞれのクラスターのワーカーノードに `oc debug` コマンドを使ってアクセスして cgroup のバージョンを調べます。
調べ方は参考資料の `Identify the cgroup version on Linux Nodes` に記載がある通り、 `stat -fc %T /sys/fs/cgroup/` コマンドを利用します。


実際に実行したコマンドと結果をワーカーノード OS ごとに示します。
最後のコマンドの実行で `cgroup2fs` となっている場合には `cgroupv2`、`tmpfs`となっている場合には `cgroupv1` が利用されています。



```:RHCOS の場合

% ibmcloud ks cluster config --cluster mycluster-RHCOS --admin
OK
The configuration for mycluster-RHCOS was downloaded successfully.

Added context for mycluster-RHCOS to the current kubeconfig file.
You can now run 'kubectl' commands against your cluster. For example, run 'kubectl get nodes'.


% oc get nodes
NAME                                                     STATUS   ROLES           AGE   VERSION
kube-cti2i6et038cekgjto0g-myclusterjp-default-000001cc   Ready    master,worker   15h   v1.29.10+67d3387
kube-cti2i6et038cekgjto0g-myclusterjp-default-0000020a   Ready    master,worker   15h   v1.29.10+67d3387


% oc debug node/kube-cti2i6et038cekgjto0g-myclusterjp-default-000001cc
Warning: metadata.name: this is used in the Pod's hostname, which can result in surprising behavior; a DNS label is recommended: [must be no more than 63 characters]
Starting pod/kube-cti2i6et038cekgjto0g-myclusterjp-default-000001cc-debug-swntr ...
To use host binaries, run `chroot /host`
Pod IP: 192.168.3.41
If you don't see a command prompt, try pressing enter.


sh-5.1# stat -fc %T /sys/fs/cgroup/
cgroup2fs

```


```:RHEL9 の場合

% ibmcloud ks cluster config --cluster mycluster-RHEL9 --admin
OK
The configuration for mycluster-RHEL9 was downloaded successfully.

Added context for mycluster-RHEL9 to the current kubeconfig file.
You can now run 'kubectl' commands against your cluster. For example, run 'kubectl get nodes'.


% oc get nodes
NAME           STATUS   ROLES           AGE   VERSION
192.168.3.34   Ready    master,worker   22h   v1.29.10+67d3387
192.168.3.36   Ready    master,worker   22h   v1.29.10+67d3387


% oc debug node/192.168.3.34                                          

Starting pod/192168334-debug-9j5gx ...
To use host binaries, run `chroot /host`
Pod IP: 192.168.3.34
If you don't see a command prompt, try pressing enter.


sh-5.1# stat -fc %T /sys/fs/cgroup/
cgroup2fs

```

```:RHEL8 の場合

% ibmcloud ks cluster config --cluster mycluster-RHEL8 --admin
OK
The configuration for mycluster-RHEL8 was downloaded successfully.

Added context for mycluster-RHEL8 to the current kubeconfig file.
You can now run 'kubectl' commands against your cluster. For example, run 'kubectl get nodes'.


% oc get nodes
NAME           STATUS   ROLES           AGE   VERSION
192.168.3.11   Ready    master,worker   44h   v1.29.10+67d3387
192.168.3.22   Ready    master,worker   44h   v1.29.10+67d3387


% oc debug node/192.168.3.11 
Starting pod/192168311-debug-swhzr ...
To use host binaries, run `chroot /host`
Pod IP: 192.168.3.11
If you don't see a command prompt, try pressing enter.


sh-5.1# stat -fc %T /sys/fs/cgroup/
tmpfs
```



<h2>まとめ</h2>

ワーカーノードのOSごとにcgroupは以下のバージョンのものが利用されていると言えそうです。
- Red Hat Enterprise Linux Core OS (RHCOS) >> <b>cgroup v2</b>
- Red Hat Enterprise Linux 9 (RHEL9) >> <b>cgroup v2</b>
- Red Hat Enterprise Linux 8 (RHEL8) >> <b>cgroup v1</b>

OCP 4.14 以前のバージョンではワーカーノードの OS として RHEL8 が唯一の選択肢ですが、それより新しい OCP 4.15 以降のバージョンでは選択肢が増えます。ばーじょんあっｐケースでは既存のワークロードが cgroup v2 に対応しているか確認/検証してご利用いただきたいです、

<h2>参考資料</h2>

[Identify the cgroup version on Linux Nodes](https://kubernetes.io/docs/concepts/architecture/cgroups/#check-cgroup-version)