Linux cgroups API を使用すると、Google Kubernetes Engine(GKE)ワークロードで子プロセスの CPU やメモリなどのリソースを管理できます。このドキュメントでは、コンテナを特権モードで実行せずに、cgroups API への読み取り / 書き込みアクセス権をコンテナに付与する方法について説明します。
書き込み可能な cgroup を使用する場合
デフォルトでは、Kubernetes は各コンテナに /sys/fs/cgroup ファイル システムをマウントすることで、すべての Linux コンテナに cgroups API への読み取り専用アクセスを提供します。必要に応じて、GKE でこのファイル システムを特定の Pod の読み取り / 書き込みモードでマウントし、ルートプロセスが子プロセスのリソースを管理および制約できるようにします。
書き込み可能な cgroup は、同じコンテナでシステム プロセスとユーザーコードを実行する Ray などのアプリケーションの信頼性を高めるのに役立ちます。/sys/fs/cgroup ファイル システムに書き込むことで、Ray はコンテナのリソースの一部をクリティカルなプロセス用に予約できます。書き込み可能な cgroup を使用すると、コンテナの特権モードを使用するセキュリティ リスクを回避しながら、これらのアプリケーションの信頼性を向上させることができます。
始める前に
作業を始める前に、次のタスクが完了していることを確認してください。
- Google Kubernetes Engine API を有効にする。 Google Kubernetes Engine API を有効化
- このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。gcloud CLI をインストール済みの場合は、
gcloud components updateコマンドを実行して最新のバージョンを取得します。以前のバージョンの gcloud CLI では、このドキュメントのコマンドを実行できない場合があります。
- バージョン 1.34.1-gke.2541000 以降を実行している Autopilot クラスタまたは Standard クラスタがあることを確認します。新しいクラスタを作成するには、Autopilot クラスタの作成をご覧ください。
- クラスタで cgroup v2 が使用されていることを確認します。詳細については、ノードを Linux cgroup v2 に移行するをご覧ください。
ノードの書き込み可能な cgroup を有効にする
containerd 構成をカスタマイズして、ノードプールで書き込み可能な cgroup を有効にします。この構成は、クラスタ全体に適用することも、Standard クラスタ内の特定のノードプールに適用することもできます。
containerd 構成ファイルに writableCgroups セクションを追加し、enabled フィールドを true に設定します。詳細については、GKE ノードで containerd 構成をカスタマイズするをご覧ください。
writableCgroups:
enabled: true
クラスタまたはノードプールを作成または更新するときに、更新された構成ファイルを指定します。
ワークロードで書き込み可能な cgroup を使用する
クラスタまたはノードプールで書き込み可能な cgroup を有効にしたら、次のすべての要件を満たすようにワークロードを構成します。
- 書き込み可能な cgroup が有効になっているノードを選択します。
- Pod 内の 1 つ以上のコンテナで書き込み可能な cgroup を有効にします。
次のいずれかの条件を満たして、保証付き Quality of Service(QoS)クラスを使用します。
- Pod レベルでリソースを指定するワークロードの場合は、Pod 仕様で
resources.requestsとresources.limitsに同じ値を設定します。 - 各コンテナのリソースを指定するワークロードの場合は、Pod 内のすべてのコンテナ(初期コンテナを含む)の仕様で、
resources.requestsとresources.limitsに同じ値を設定します。
- Pod レベルでリソースを指定するワークロードの場合は、Pod 仕様で
これらの要件を構成する手順は次のとおりです。
書き込み可能な cgroup が有効になっているノードを選択するには、Pod 仕様の
spec.nodeSelectorフィールドにnode.gke.io/enable-writable-cgroups: "true"ラベルを追加します。node.gke.io/enable-writable-cgroups: "true"ワークロードで書き込み可能な cgroup を有効にするには、Pod 仕様の
metadata.annotationsフィールドに次のいずれかのラベルを追加します。Pod 全体で有効にする:
node.gke.io/enable-writable-cgroups: "true"Pod 内の特定のコンテナに対して有効にする:
node.gke.io/enable-writable-cgroups.CONTAINER_NAME: "true"CONTAINER_NAMEは、コンテナの名前に置き換えます。
Pod の保証 QoS クラスを構成するには、次の例のように、Pod 内のすべてのコンテナまたは Pod 全体に対して、CPU とメモリのリクエストと上限を同じ値で指定します。
resources: requests: cpu: "100m" memory: "100Mi" limits: cpu: "100m" memory: "100Mi"Pod 内の 1 つのコンテナに対してのみ書き込み可能な cgroup を有効にする場合でも、すべてのコンテナに対して同じリクエストと上限を指定する必要があります。
最終的な Pod 仕様は、次の例のようになります。
この例では、Pod 内のすべてのコンテナで書き込み可能な cgroup を有効にします。
apiVersion: v1 kind: Pod metadata: name: writable-cgroups-pod annotations: node.gke.io/enable-writable-cgroups: "true" spec: nodeSelector: node.gke.io/enable-writable-cgroups: "true" containers: - name: container image: busybox:stable command: ["/bin/sh", "-c"] args: - | trap 'echo "Caught SIGTERM, exiting..."; exit 0' TERM echo "Waiting for termination signal..." while true; do sleep 1; done resources: requests: cpu: "100m" memory: "100Mi" limits: cpu: "100m" memory: "100Mi"この例では、マルチコンテナ Pod の特定のコンテナに対して書き込み可能な cgroup を有効にします。
apiVersion: v1 kind: Pod metadata: name: writable-cgroups-per-container annotations: node.gke.io/enable-writable-cgroups.busybox-container: "true" spec: nodeSelector: node.gke.io/enable-writable-cgroups: "true" containers: - name: busybox-container image: busybox:stable command: ["/bin/sh", "-c"] args: - | trap 'echo "Caught SIGTERM, exiting..."; exit 0' TERM echo "Waiting for termination signal..." while true; do sleep 1; done resources: requests: cpu: "100m" memory: "100Mi" limits: cpu: "100m" memory: "100Mi" - name: container-disabled image: busybox:stable command: ["/bin/sh", "-c"] args: - | trap 'echo "Caught SIGTERM, exiting..."; exit 0' TERM echo "Waiting for termination signal..." while true; do sleep 1; done resources: requests: cpu: "100m" memory: "100Mi" limits: cpu: "100m" memory: "100Mi"
cgroup ファイル システムが書き込み可能であることを確認する
Pod またはコンテナの /sys/fs/cgroup ファイル システムの権限を確認する手順は次のとおりです。
- 確認する Pod を特定します。ワークロードで書き込み可能な cgroup を使用するセクションのサンプル Pod のいずれかを使用できます。
Pod でシェル セッションを作成します。
kubectl exec -it POD_NAME -- /bin/shPOD_NAMEは、Pod の名前で置き換えます。マウントされた cgroup ファイル システムの説明を取得します。
mount | grep cgroup出力は次のようになります。
cgroup on /sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime)この出力では、
rwはファイル システムが書き込み可能であることを示しています。出力にroが表示された場合、ファイル システムは読み取り専用です。