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

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 を有効にしたら、次の要件をすべて満たすようにワークロードを構成します。

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

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

    node.gke.io/enable-writable-cgroups: "true"
    
  2. ワークロードで書き込み可能な cgroups を有効にするには、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 つのコンテナでのみ書き込み可能な 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 ファイル システムの権限を確認する手順は次のとおりです。

  1. 確認する Pod を特定します。ワークロードで書き込み可能な cgroups を使用する セクションの サンプル 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 が表示された場合、ファイル システムは読み取り専用です。

次のステップ