Google Kubernetes Engine(GKE)ワークロードでは、Linux cgroups API を使用して、子プロセスの CPU や メモリなどのリソースを管理できます。このドキュメントでは、特権モードでコンテナを実行せずに、コンテナに cgroups API への読み取り / 書き込みアクセス権を付与する方法について説明します。
書き込み可能な cgroups を使用する場合
デフォルトでは、Kubernetes は各コンテナに /sys/fs/cgroup ファイル システムをマウントすることで、すべての Linux コンテナに cgroups API への読み取り専用アクセス権を付与します。
必要に応じて、GKE でこのファイル システムを特定の Pod に読み取り / 書き込みモードでマウントし、ルートプロセスが子プロセスのリソースを管理して制約できるようにすることもできます。
これらの書き込み可能な cgroups は、同じコンテナ内で
システム プロセスとユーザーコードを実行する
Ray などのアプリケーションの信頼性を向上させるのに役立ちます。Ray は、/sys/fs/cgroup ファイル システムに書き込むことで、コンテナのリソースの一部を重要なプロセス用に予約できます。書き込み可能な cgroups を使用すると、コンテナに特権モードを使用するセキュリティ リスクを回避しながら、これらのアプリケーションの信頼性を向上させることができます。
始める前に
始める前に、次のタスクが完了していることを確認してください。
- 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 に移行するをご覧ください。
ノードの書き込み可能な cgroups を有効にする
containerd 構成をカスタマイズして、ノードプールで書き込み可能な cgroups を有効にします。この構成は、クラスタ全体に適用することも、Standard クラスタ内の特定のノードプールに適用することもできます。
containerd 構成ファイルに writableCgroups セクションを追加し、enabled フィールドを true に設定します。詳細については、
GKE ノードで containerd 構成をカスタマイズするをご覧ください。
writableCgroups:
enabled: true
クラスタまたはノードプールを作成または更新するときに、更新された構成ファイルを指定します。
ワークロードで書き込み可能な cgroups を使用する
クラスタまたはノードプールで書き込み可能な cgroups を有効にしたら、次の要件をすべて満たすようにワークロードを構成します。
- 書き込み可能な cgroups が有効になっているノードを選択します。
- Pod 内の 1 つ以上のコンテナで書き込み可能な cgroups を有効にします。
次のいずれかの条件を満たして、 保証付きサービス品質(QoS)クラス を使用します。
- Pod レベルでリソースを指定するワークロードの場合は、Pod 仕様で
resources.requestsとresources.limitsに同じ値を設定します。 - コンテナごとにリソースを指定するワークロードの場合は、初期化コンテナを含む Pod 内のすべてのコンテナの仕様で、
resources.requestsとresources.limitsに同じ値を設定します。
- Pod レベルでリソースを指定するワークロードの場合は、Pod 仕様で
これらの要件を構成する手順は次のとおりです。
書き込み可能な cgroups が有効になっているノードを選択するには、Pod 仕様の
spec.nodeSelectorフィールドにnode.gke.io/enable-writable-cgroups: "true"ラベルを追加します。node.gke.io/enable-writable-cgroups: "true"ワークロードで書き込み可能な cgroups を有効にするには、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 つのコンテナでのみ書き込み可能な cgroups を有効にする場合でも、すべてのコンテナに対して同じリクエストと上限を指定する必要があります。
最終的な Pod 仕様は、次の例のようになります。
この例では、Pod 内のすべてのコンテナで書き込み可能な cgroups を有効にします。
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 内の特定のコンテナで書き込み可能な cgroups を有効にします。
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 を特定します。ワークロードで書き込み可能な cgroups を使用する セクションの サンプル 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が表示された場合、ファイル システムは読み取り専用です。