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

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

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

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

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

プロセスと関係者の詳細については、特権 Autopilot ワークロードのアドミッション制御の仕組みをご覧ください。

始める前に

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

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

    API を有効にするために必要なロール

    API を有効にするには、serviceusage.services.enable 権限が必要です。プロジェクトを作成した場合は、オーナーロール(roles/owner)を介してこの権限がすでに付与されている可能性があります。それ以外の場合は、Service Usage 管理者ロール(roles/serviceusage.serviceUsageAdmin)を介してこの権限を取得できます。ロールを付与する方法を確認する。

    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://docs.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://docs.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[*].image や matchingCriteria.containers[*].args など)では、正規表現がサポートされています。さまざまなワークロードで複数の値と一致する正規表現を使用します。

    • matchingCriteria.containers や matchingCriteria.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
    

次のステップ