cgroup v2について
Linuxでは、コントロールグループがプロセスに割り当てられるリソースを制限しています。
コンテナ化されたワークロードの、CPU/メモリーの要求と制限を含むPodとコンテナのリソース管理を強制するために、 kubeletと基盤となるコンテナランタイムはcgroupをインターフェースとして接続する必要があります。
Linuxではcgroup v1とcgroup v2の2つのバージョンのcgroupがあります。
cgroup v2は新世代のcgroup
APIです。
cgroup v2とは何か?
Kubernetes v1.25 [stable]
cgroup v2はLinuxのcgroup
APIの次のバージョンです。
cgroup v2はリソース管理機能を強化した統合制御システムを提供しています。
以下のように、cgroup v2はcgroup v1からいくつかの点を改善しています。
- 統合された単一階層設計のAPI
- より安全なコンテナへのサブツリーの移譲
- Pressure Stall Informationなどの新機能
- 強化されたリソース割り当て管理と複数リソース間の隔離
- 異なるタイプのメモリー割り当ての統一(ネットワークメモリー、カーネルメモリーなど)
- ページキャッシュの書き戻しといった、非即時のリソース変更
Kubernetesのいくつかの機能では、強化されたリソース管理と隔離のためにcgroup v2のみを使用しています。 例えば、MemoryQoS機能はメモリーQoSを改善し、cgroup v2の基本的な機能に依存しています。
cgroup v2を使う
cgroup v2を使うおすすめの方法は、デフォルトでcgroup v2が有効で使うことができるLinuxディストリビューションを使うことです。
あなたのディストリビューションがcgroup v2を使っているかどうかを確認するためには、Linux Nodeのcgroupバージョンを特定するを参照してください。
必要要件
cgroup v2を使うには以下のような必要要件があります。
- OSディストリビューションでcgroup v2が有効であること
- Linuxカーネルバージョンが5.8以上であること
- コンテナランタイムがcgroup v2をサポートしていること。例えば、
- containerd v1.4以降
- cri-o v1.20以降
- kubeletとコンテナランタイムがsystemd cgroupドライバーを使うように設定されていること
Linuxディストリビューションのcgroup v2サポート
cgroup v2を使っているLinuxディストリビューションの一覧はcgroup v2ドキュメントをご覧ください。
- Container-Optimized OS (M97以降)
- Ubuntu (21.10以降, 22.04以降推奨)
- Debian GNU/Linux (Debian 11 bullseye以降)
- Fedora (31以降)
- Arch Linux (April 2021以降)
- RHEL and RHEL-like distributions (9以降)
あなたのディストリビューションがcgroup v2を使っているかどうかを確認するためには、あなたのディストリビューションのドキュメントを参照するか、Linux Nodeのcgroupバージョンを特定するの説明に従ってください。
カーネルのcmdlineの起動時引数を修正することで、手動であなたのLinuxディストリビューションのcgroup v2を有効にすることもできます。
あなたのディストリビューションがGRUBを使っている場合は、
/etc/default/grub
の中のGRUB_CMDLINE_LINUX
にsystemd.unified_cgroup_hierarchy=1
を追加し、sudo update-grub
を実行してください。
ただし、おすすめの方法はデフォルトですでにcgroup v2が有効になっているディストリビューションを使うことです。
cgroup v2への移行
cgroup v2に移行するには、必要要件を満たすことを確認し、 cgroup v2がデフォルトで有効であるカーネルバージョンにアップグレードします。
kubeletはOSがcgroup v2で動作していることを自動的に検出し、それに応じて処理を行うため、追加設定は必要ありません。
ノード上やコンテナ内からユーザーが直接cgroupファイルシステムにアクセスしない限り、cgroup v2に切り替えたときのユーザー体験に目立った違いはないはずです。
cgroup v2はcgroup v1とは違うAPIを利用しているため、cgroupファイルシステムに直接アクセスしているアプリケーションはcgroup v2をサポートしている新しいバージョンに更新する必要があります。例えば、
- サードパーティーの監視またはセキュリティエージェントはcgroupファイルシステムに依存していることがあります。 エージェントをcgroup v2をサポートしているバージョンに更新してください。
- Podやコンテナを監視するためにcAdvisorをスタンドアローンのDaemonSetとして起動している場合、v0.43.0以上に更新してください。
- Javaアプリケーションをデプロイする場合は、完全にcgroup v2をサポートしているバージョンを利用してください:
- OpenJDK / HotSpot: jdk8u372、11.0.16、15以降
- IBM Semeru Runtimes: jdk8u345-b01、11.0.16.0、17.0.4.0、18.0.2.0以降
- IBM Java: 8.0.7.15以降
- uber-go/automaxprocsパッケージを利用している場合は、利用するバージョンがv1.5.1以上であることを確認してください。
Linux Nodeのcgroupバージョンを特定する
cgroupバージョンは利用されているLinuxディストリビューションと、OSで設定されているデフォルトのcgroupバージョンに依存します。
あなたのディストリビューションがどちらのcgroupバージョンを利用しているのかを確認するには、stat -fc %T /sys/fs/cgroup/
コマンドをノード上で実行してください。
stat -fc %T /sys/fs/cgroup/
cgroup v2では、cgroup2fs
と出力されます。
cgroup v1では、tmpfs
と出力されます。
次の項目
- cgroupsについてもっと学習しましょう。
- コンテナランタイムについてもっと学習しましょう。
- cgroupドライバーについてもっと学習しましょう。