|
| 1 | +--- |
| 2 | +title: cgroup v2について |
| 3 | +content_type: concept |
| 4 | +weight: 50 |
| 5 | +--- |
| 6 | + |
| 7 | +<!-- overview --> |
| 8 | + |
| 9 | +Linuxでは、{{< glossary_tooltip text="コントロールグループ" term_id="cgroup" >}}がプロセスに割り当てられるリソースを制限しています。 |
| 10 | + |
| 11 | +コンテナ化されたワークロードの、CPU/メモリーの要求と制限を含む[Podとコンテナのリソース管理](/docs/concepts/configuration/manage-resources-containers/)を強制するために、 |
| 12 | +{{< glossary_tooltip text="kubelet" term_id="kubelet" >}}と基盤となるコンテナランタイムはcgroupをインターフェースとして接続する必要があります。 |
| 13 | + |
| 14 | +Linuxではcgroup v1とcgroup v2の2つのバージョンのcgroupがあります。 |
| 15 | +cgroup v2は新世代の`cgroup` APIです。 |
| 16 | + |
| 17 | +<!-- body --> |
| 18 | + |
| 19 | +## cgroup v2とは何か? {#cgroup-v2} |
| 20 | +{{< feature-state for_k8s_version="v1.25" state="stable" >}} |
| 21 | + |
| 22 | +cgroup v2はLinuxの`cgroup` APIの次のバージョンです。 |
| 23 | +cgroup v2はリソース管理機能を強化した統合制御システムを提供しています。 |
| 24 | + |
| 25 | +以下のように、cgroup v2はcgroup v1からいくつかの点を改善しています。 |
| 26 | + |
| 27 | +- 統合された単一階層設計のAPI |
| 28 | +- より安全なコンテナへのサブツリーの移譲 |
| 29 | +- [Pressure Stall Information](https://www.kernel.org/doc/html/latest/accounting/psi.html)などの新機能 |
| 30 | +- 強化されたリソース割り当て管理と複数リソース間の隔離 |
| 31 | + - 異なるタイプのメモリー割り当ての統一(ネットワークメモリー、カーネルメモリーなど) |
| 32 | + - ページキャッシュの書き戻しといった、非即時のリソース変更 |
| 33 | + |
| 34 | +Kubernetesのいくつかの機能では、強化されたリソース管理と隔離のためにcgroup v2のみを使用しています。 |
| 35 | +例えば、[MemoryQoS](/blog/2021/11/26/qos-memory-resources/)機能はメモリーQoSを改善し、cgroup v2の基本的な機能に依存しています。 |
| 36 | + |
| 37 | +## cgroup v2を使う {#using-cgroupv2} |
| 38 | + |
| 39 | +cgroup v2を使うおすすめの方法は、デフォルトでcgroup v2が有効で使うことができるLinuxディストリビューションを使うことです。 |
| 40 | + |
| 41 | +あなたのディストリビューションがcgroup v2を使っているかどうかを確認するためには、[Linux Nodeのcgroupバージョンを特定する](#check-cgroup-version)を参照してください。 |
| 42 | + |
| 43 | +### 必要要件 {#requirements} |
| 44 | + |
| 45 | +cgroup v2を使うには以下のような必要要件があります。 |
| 46 | + |
| 47 | +* OSディストリビューションでcgroup v2が有効であること |
| 48 | +* Linuxカーネルバージョンが5.8以上であること |
| 49 | +* コンテナランタイムがcgroup v2をサポートしていること。例えば、 |
| 50 | + * [containerd](https://containerd.io/) v1.4以降 |
| 51 | + * [cri-o](https://cri-o.io/) v1.20以降 |
| 52 | +* kubeletとコンテナランタイムが[systemd cgroupドライバー](/docs/setup/production-environment/container-runtimes#systemd-cgroup-driver)を使うように設定されていること |
| 53 | + |
| 54 | +### Linuxディストリビューションのcgroup v2サポート |
| 55 | + |
| 56 | +cgroup v2を使っているLinuxディストリビューションの一覧は[cgroup v2ドキュメント](https://github.com/opencontainers/runc/blob/main/docs/cgroup-v2.md)をご覧ください。 |
| 57 | + |
| 58 | +<!-- 一覧は https://github.com/opencontainers/runc/blob/main/docs/cgroup-v2.md と同期してください --> |
| 59 | +* Container-Optimized OS (M97以降) |
| 60 | +* Ubuntu (21.10以降, 22.04以降推奨) |
| 61 | +* Debian GNU/Linux (Debian 11 bullseye以降) |
| 62 | +* Fedora (31以降) |
| 63 | +* Arch Linux (April 2021以降) |
| 64 | +* RHEL and RHEL-like distributions (9以降) |
| 65 | + |
| 66 | +あなたのディストリビューションがcgroup v2を使っているかどうかを確認するためには、あなたのディストリビューションのドキュメントを参照するか、[Linux Nodeのcgroupバージョンを特定する](#check-cgroup-version)の説明に従ってください。 |
| 67 | + |
| 68 | +カーネルのcmdlineの起動時引数を修正することで、手動であなたのLinuxディストリビューションのcgroup v2を有効にすることもできます。 |
| 69 | +あなたのディストリビューションがGRUBを使っている場合は、 |
| 70 | +`/etc/default/grub`の中の`GRUB_CMDLINE_LINUX`に`systemd.unified_cgroup_hierarchy=1`を追加し、`sudo update-grub`を実行してください。 |
| 71 | +ただし、おすすめの方法はデフォルトですでにcgroup v2が有効になっているディストリビューションを使うことです。 |
| 72 | + |
| 73 | +### cgroup v2への移行 {#migrating-cgroupv2} |
| 74 | + |
| 75 | +cgroup v2に移行するには、[必要要件](#requirements)を満たすことを確認し、 |
| 76 | +cgroup v2がデフォルトで有効であるカーネルバージョンにアップグレードします。 |
| 77 | + |
| 78 | +kubeletはOSがcgroup v2で動作していることを自動的に検出し、それに応じて処理を行うため、追加設定は必要ありません。 |
| 79 | + |
| 80 | +ノード上やコンテナ内からユーザーが直接cgroupファイルシステムにアクセスしない限り、cgroup v2に切り替えたときのユーザー体験に目立った違いはないはずです。 |
| 81 | + |
| 82 | +cgroup v2はcgroup v1とは違うAPIを利用しているため、cgroupファイルシステムに直接アクセスしているアプリケーションはcgroup v2をサポートしている新しいバージョンに更新する必要があります。例えば、 |
| 83 | + |
| 84 | +* サードパーティーの監視またはセキュリティエージェントはcgroupファイルシステムに依存していることがあります。 |
| 85 | + エージェントをcgroup v2をサポートしているバージョンに更新してください。 |
| 86 | +* Podやコンテナを監視するために[cAdvisor](https://github.com/google/cadvisor)をスタンドアローンのDaemonSetとして起動している場合、v0.43.0以上に更新してください。 |
| 87 | +* JDKを利用している場合、[cgroup v2を完全にサポートしている](https://bugs.openjdk.org/browse/JDK-8230305)JDK 11.0.16以降、またはJDK15以降を利用することが望ましいです。 |
| 88 | + |
| 89 | +## Linux Nodeのcgroupバージョンを特定する {#check-cgroup-version} |
| 90 | + |
| 91 | +cgroupバージョンは利用されているLinuxディストリビューションと、OSで設定されているデフォルトのcgroupバージョンに依存します。 |
| 92 | +あなたのディストリビューションがどちらのcgroupバージョンを利用しているのかを確認するには、`stat -fc %T /sys/fs/cgroup/`コマンドをノード上で実行してください。 |
| 93 | + |
| 94 | +```shell |
| 95 | +stat -fc %T /sys/fs/cgroup/ |
| 96 | +``` |
| 97 | + |
| 98 | +cgroup v2では、`cgroup2fs`と出力されます。 |
| 99 | + |
| 100 | +cgroup v1では、`tmpfs`と出力されます。 |
| 101 | + |
| 102 | +## {{% heading "whatsnext" %}} |
| 103 | + |
| 104 | +- [cgroups](https://man7.org/linux/man-pages/man7/cgroups.7.html)についてもっと学習しましょう。 |
| 105 | +- [コンテナランタイム](/ja/docs/concepts/architecture/cri)についてもっと学習しましょう。 |
| 106 | +- [cgroupドライバー](/docs/setup/production-environment/container-runtimes#cgroup-drivers)についてもっと学習しましょう。 |
0 commit comments