コンテナの書き込み可能な cgroup を構成する

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.requestsresources.limits に同じ値を設定します。
    • 各コンテナのリソースを指定するワークロードの場合は、Pod 内のすべてのコンテナ(初期コンテナを含む)の仕様で、resources.requestsresources.limits に同じ値を設定します。

これらの要件を構成する手順は次のとおりです。

  1. 書き込み可能な cgroup が有効になっているノードを選択するには、Pod 仕様の spec.nodeSelector フィールドに node.gke.io/enable-writable-cgroups: "true" ラベルを追加します。

    node.gke.io/enable-writable-cgroups: "true"
    
  2. ワークロードで書き込み可能な cgroup を有効にするには、Pod 仕様の metadata.annotations フィールドに次のいずれかのラベルを追加します。

    • Pod 全体で有効にする:

      node.gke.io/enable-writable-cgroups: "true"
      
    • Pod 内の特定のコンテナに対して有効にする:

      node.gke.io/enable-writable-cgroups.CONTAINER_NAME: "true"
      

      CONTAINER_NAME は、コンテナの名前に置き換えます。

  3. 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 ファイル システムの権限を確認する手順は次のとおりです。

  1. 確認する Pod を特定します。ワークロードで書き込み可能な cgroup を使用するセクションのサンプル Pod のいずれかを使用できます。
  2. Pod でシェル セッションを作成します。

    kubectl exec -it POD_NAME -- /bin/sh
    

    POD_NAME は、Pod の名前で置き換えます。

  3. マウントされた cgroup ファイル システムの説明を取得します。

    mount | grep cgroup
    

    出力は次のようになります。

    cgroup on /sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime)
    

    この出力では、rw はファイル システムが書き込み可能であることを示しています。出力に ro が表示された場合、ファイル システムは読み取り専用です。

次のステップ