Autopilot で特権ワークロードの許可リストを作成する

このドキュメントでは、Autopilot ノードに特権ワークロードをデプロイできる許可リストを作成する方法について説明します。これらの許可リストは Cloud Storage バケットに保存します。このドキュメントは、特定の Kubernetes ワークロードに対して、特定の顧客所有のワークロードをデフォルトの Autopilot セキュリティ制約から除外するプラットフォーム管理者とオペレーターを対象としています。Autopilot での特権ワークロードの Admission Controller について精通している必要があります。

Autopilot の特権ワークロードについて

Autopilot モードでは、セキュリティ ポスチャーを改善するために、ワークロードにデフォルトの制約セットが適用されます。これらの制約をバイパスして特定の特権ワークロードを実行するには、それらのワークロードに対応する許可リストをインストールします。デフォルトでは、Autopilot クラスタまたは Standard クラスタで、Autopilot パートナーと特定のオープンソース プロジェクトの許可リストをインストールできます。

対象となる GKE のお客様は、デフォルトの Autopilot 制約と互換性のない独自の特権ワークロードの許可リストを作成して管理できます。これらの許可リストは、YAML ファイルで定義して Cloud Storage バケットに保存する WorkloadAllowlist Kubernetes カスタム リソースです。ID とアカウントの管理者は、組織のポリシーを使用して、これらの顧客管理の許可リストとバケットを認識するようにクラスタを構成します。クラスタ管理者は、これらの許可リストをインストールして、特権ワークロードを Autopilot モードで実行できるようにします。

プロセスと関係者について詳しくは、特権 Autopilot ワークロードの Admission コントロールの仕組みをご覧ください。

始める前に

作業を始める前に、次のタスクが完了していることを確認してください。

  • Google Kubernetes Engine API を有効にする。
  • Google Kubernetes Engine API を有効化
  • このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。gcloud CLI をインストール済みの場合は、gcloud components update コマンドを実行して最新のバージョンを取得します。以前のバージョンの gcloud CLI では、このドキュメントのコマンドを実行できない場合があります。
  • Enable the Cloud Storage API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  • バージョン 1.35 以降を実行する GKE クラスタがあることを確認します。このタスクでは、Autopilot クラスタを作成することもできます。
  • 許可リスト ファイルの保存に使用できる Cloud Storage バケットがあることを確認します。このタスク用にバケットを作成することもできます。
  • Autopilot で実行する特権ワークロードを定義する YAML マニフェストを開きます。

必要なロール

Cloud Storage に許可リストを保存し、同期を構成するために必要な権限を取得するには、バケットに対する次の IAM ロールを付与するよう管理者に依頼してください。

ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。

WorkloadAllowlist を作成してアップロードする

許可リストは、YAML ファイルで定義する WorkloadAllowlist カスタム リソースです。WorkloadAllowlist の仕様のフィールドは、Kubernetes Pod 仕様のフィールドと似ています。クラスタに許可リストをインストールして特権ワークロードをデプロイすると、GKE はインストールされた許可リストに対して特権ワークロード仕様を検証します。ワークロードは、許可リスト仕様のすべてのフィールドがワークロード仕様の対応するフィールドと一致する場合にのみ実行できます。

新しい WorkloadAllowlist を作成して Cloud Storage バケットにアップロードする手順は次のとおりです。

  1. 許可リストに登録する特権ワークロードを特定します。
  2. Pod 仕様の metadata.annotations フィールドに次のアノテーションを追加します。

    cloud.google.com/generate-allowlist: "true"
    

    DaemonSet や Deployment などのコントローラによって管理される Pod の場合は、spec.template.metadata.annotations フィールドにアノテーションを追加します。

  3. クラスタに特権ワークロードを作成しようとします。

    kubectl apply -f WORKLOAD_FILE_PATH
    

    WORKLOAD_FILE_PATH は、ワークロード マニフェスト ファイルのパスに置き換えます。GKE は、WorkloadAllowlist マニフェストを含むエラー メッセージでワークロードを拒否します。出力は次のようになります。

    This workload can be enabled using the following Custom Resource. To be used in-cluster, the WorkloadAllowlist must be uploaded to Google Cloud Storage and then installed using an AllowlistSynchronizer. Refer to https://cloud.google.com/kubernetes-engine/docs/how-to/autopilot-privileged-allowlists.
    
    Note that many common partner workloads are already allowlisted. These can be installed directly using an AllowlistSynchronizer. Refer to https://cloud.google.com/kubernetes-engine/docs/resources/autopilot-partners.
    ---
    apiVersion: auto.gke.io/v1
    kind: WorkloadAllowlist
    metadata:
        name: test-pod-allowlist-2025-09-11t22-40-37
        annotations:
            autopilot.gke.io/no-connect: "true"
    exemptions:
        - autogke-disallow-privilege
    matchingCriteria:
        containers:
            - name: pause-container2
              image: k8s.gcr.io/pause2
              securityContext:
                privileged: true
    
  4. テキスト エディタで、生成された WorkloadAllowlist を含む YAML ファイルを作成します。

  5. 許可リストの metadata.name フィールドを設定します。

  6. 省略可: 同様のワークロードを除外できるように、WorkloadAllowlist を一般化します。確認は次のいずれかの方法で行います。

    • 特定のフィールド(matchingCriteria.containers[*].imagematchingCriteria.containers[*].args など)では、正規表現がサポートされています。さまざまなワークロードで複数の値に一致する正規表現を使用します。

    • matchingCriteria.containersmatchingCriteria.securityContext.capabilities.add などの特定のフィールドは、WorkloadAllowlist の値のサブセットを持つワークロードと一致します。WorkloadAllowlist で、他のワークロードと一致する追加の値を指定します。

    使用できるサポート対象のフィールドと値の詳細については、WorkloadAllowlist CustomResourceDefinition をご覧ください。

  7. マニフェスト ファイルを Cloud Storage バケットにアップロードします

組織のポリシーで、クラスタ内のバケットからの許可リストのインストールが許可されている場合、クラスタ管理者は次の操作を行うことができます。

  1. 許可リストのパスをクラスタに追加します。
  2. バケットから許可リストをインストールする AllowlistSynchronizer を作成します。

クラスタを構成して許可リストをインストールする方法の詳細については、Autopilot モードで特権ワークロードの受け入れを制御するをご覧ください。

許可リスト構成の例

WorkloadAllowlist 仕様の matchingCriteria フィールドは、Kubernetes Pod 仕様と同様の構造になっています。WorkloadAllowlist CustomResourceDefinition は、使用できるすべてのフィールド、値、式の信頼できる情報源です。

このセクションでは、次のプロパティを持つワークロードに一致する許可リストの例を示します。

  • ワークロードの container-1 コンテナが特権モードで実行されます。
  • ワークロードは、ノードのファイル システムから /var/log/ ディレクトリを書き込みモードでマウントします。
  1. ワークロードの例を確認します。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: example-privileged-workload
      labels:
        env: dev
    spec:
      selector:
        matchLabels:
          env: dev
      template:
        metadata:
          labels:
            env: dev
        spec:
          containers:
          - name: container-1
            image: example-image-1
            resources:
              requests:
                cpu: "400m"
                memory: "4Gi"
            # Run the container in privileged mode
            securityContext:
              privileged: true
          - name: container-2
            image: example-image-2
            volumeMounts:
            - name: write-varlog
              mountPath: /logs
              readOnly: false
          # Mount a host directory
          volumes:
          - name: write-varlog
            hostPath:
              path: /var/log
              type: Directory
    

    デフォルトでは、Autopilot はこのワークロードを拒否します。

  2. WorkloadAllowlist の例を確認します。

    apiVersion: auto.gke.io/v1
    kind: WorkloadAllowlist
    minGKEVersion: 1.32.0-gke.1000000
    metadata:
      name: example-privileged-workload
      annotations:
        autopilot.gke.io/no-connect: "true"
    # List of constraints that the allowlist modifies
    exemptions:
    - autogke-disallow-privilege
    - autogke-no-write-mode-hostpath
    matchingCriteria:
      containers:
      - name: container-1
        image: example-image-1
        securityContext:
          privileged: true
      - name: container-2
        image: example-image-2
        volumeMounts:
        - name: write-varlog
          mountPath: /logs
          readOnly: false
      volumes:
      - name: write-varlog
        hostPath:
          path: /var/log
    

    この WorkloadAllowlist には次のプロパティがあります。

    • exemptions フィールドの値は、許可リストがバイパスする Autopilot 制約を指定します。
    • matchingCriteria フィールドの値は、ワークロードの例で使用されるコンテナと、通常は Autopilot 制約に違反するフィールドを指定します。

    許可リストには、制約に違反するフィールドの値のみが含まれます。ワークロード内の他のフィールド(resources.requests フィールドなど)は無視されます。

この WorkloadAllowlist の例をクラスタにインストールすると、GKE は特権ワークロードがそのクラスタで実行されることを許可します。たとえば、Autopilot ノードがある Standard クラスタでこの WorkloadAllowlist をインストールすると、特権ワークロードを Autopilot ノードで実行できます。

GKE サービス エージェントへのアクセス権を付与する

クラスタ内のバケットから許可リストを同期するには、クラスタ プロジェクトの GKE サービス エージェントに次の IAM ロールが必要です。

これらのロールをサービス エージェントに付与する手順は次のとおりです。

  1. クラスタ プロジェクトのプロジェクト番号を確認します。

    gcloud projects describe CLUSTER_PROJECT_ID \
        --format='value(projectNumber)'
    
  2. roles/storage.bucketViewer ロールを付与します。

    gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME
        --member=serviceAccount:service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com \
        --project=BUCKET_PROJECT_ID \
        --role=roles/storage.bucketViewer
    

    次のように置き換えます。

    • BUCKET_NAME: Cloud Storage バケットの名前。
    • CLUSTER_PROJECT_NUMBER: 前の手順の出力から取得したクラスタ プロジェクトのプロジェクト番号。
    • BUCKET_PROJECT_ID: バケットを含むプロジェクトの ID。
  3. roles/storage.objectViewer ロールを付与します。

    gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME
        --member=serviceAccount:service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com \
        --project=BUCKET_PROJECT_ID \
        --role=roles/storage.objectViewer
    

次のステップ