GKE Autopilot パートナーの権限付きワークロードを実行する


このページでは、Google Kubernetes Engine(GKE)Autopilot パートナーの特権ワークロードを実行する方法について説明します。クラスタに許可リストをインストールし、許可リストを最新の状態に保つ同期ワークロードを設定する方法について説明します。

このページは、次のタイプのロールを対象としています。

  • サードパーティ ワークロードがクラスタで実行され、GKE 承認済みのソースから取得されるように、許可リストが必要であることを確認するセキュリティ エンジニア。
  • クラスタでサードパーティのワークロードを有効にして、アプリケーション チームのブロックを解除したいプラットフォーム エンジニア。

ドキュメントで参照する一般的なロールとタスクの例の詳細については、一般的な GKE Enterprise ユーザーロールとタスクをご覧ください。

このページを読む前に、次のことをよく理解しておいてください。

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

GKE では、承認されたパートナーのサブセットが Autopilot クラスタで特権ワークロードを実行できます。これらの特権ワークロードは、Autopilot が適用するセキュリティ制約の一部をバイパスできます。たとえば、特定の Linux 機能を使用するワークロードを実行したり、特権コンテナを必要とするワークロードを実行したりする必要がある場合があります。

パートナーは、特権ワークロードの許可リストを作成して維持します。各許可リストは、特定の特権パートナー ワークロードに一致するファイルです。パートナーは、これらの許可リスト ファイルを GKE に送信して承認を受けます。承認後、GKE は Google 管理のリポジトリで許可リスト ファイルをホストします。

パートナー ワークロードを実行するには、対応する許可リスト ファイルをクラスタにインストールします。GKE には、許可リストをインストールして最新の状態に保つ AllowlistSynchronizer という名前の Kubernetes カスタム リソースが用意されています。許可リストが正常にインストールされたら、対応する特権パートナー ワークロードをデプロイできます。

特権ワークロードと許可リストに関するバグと機能リクエスト

パートナーは、特権ワークロードと許可リストの作成、開発、維持を行う責任があります。バグが発生した場合や、特権ワークロードまたは許可リストに関する機能リクエストがある場合は、該当するパートナーにお問い合わせください。

AllowlistSynchronizer コントローラについて

AllowlistSynchronizer は、GKE コントロール プレーンで実行されるコントローラです。他の Kubernetes ワークロードをデプロイする場合と同様に、新しい AllowlistSynchronizer を YAML マニフェストとしてデプロイします。マニフェストで、インストールする許可リスト ファイルのパスを指定します。このパスはサードパーティ パートナーから取得します。同期ツールは、Google 管理のリポジトリでパートナーの許可リスト ファイルを見つけ、クラスタに許可リストをインストールします。

同期ツールは 10 分ごとに許可リスト ファイルの更新を確認します。アップデートが存在する場合、Synchronizer は更新された許可リストをクラスタにインストールします。

特定のワークロードを許可しないようにするには、既存の AllowlistSynchronizer を更新して対応する許可リスト ファイルパスを削除し、クラスタから WorkloadAllowlist オブジェクトを削除します。許可リスト同期ツールからパスを削除せずに、インストール済みの WorkloadAllowlist オブジェクトを削除すると、同期ツールによって許可リストが再インストールされます。パートナーは、Google 管理のリポジトリから許可リスト ファイルを削除できません。

始める前に

作業を始める前に、次のことを確認してください。

  • Google Kubernetes Engine API を有効にする。
  • Google Kubernetes Engine API の有効化
  • このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。すでに gcloud CLI をインストールしている場合は、gcloud components update を実行して最新のバージョンを取得する。

要件

  • AllowlistSynchronizer カスタム リソースには、GKE バージョン 1.32.2-gke.1652000 以降が必要です。
  • クラスタで実行するパートナー ワークロードを把握しておく必要があります。特権ワークロードをインストールする手順については、パートナーのドキュメントをご覧ください。

新しい AllowlistSynchronizer を作成します。

パートナーから特権ワークロードを実行するには、対応する許可リスト ファイルのパスを AllowlistSynchronizer カスタム リソースに追加します。次に、AllowlistSynchronizer をクラスタにデプロイします。

  1. テキスト エディタで、新しい YAML ファイルを作成します。
  2. YAML ファイルに次の内容を追加します。

    apiVersion: auto.gke.io/v1
    kind: AllowlistSynchronizer
    metadata:
      name: ALLOWLIST_SYNCHRONIZER_NAME
    spec:
      allowlistPaths:
      - ALLOWLIST1_PATH
      - ALLOWLIST2_PATH
    

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

    • ALLOWLIST_SYNCHRONIZER_NAME: 新しい同期ツールの名前。許可リストがサポートするワークロードまたはチームを識別するわかりやすい名前を選択します。
    • ALLOWLIST1_PATH, ALLOWLIST2_PATH, ...: インストールするパートナー許可リスト ファイルの 1 つ以上のパス。このパスについては、選択したパートナーのワークロードのドキュメントを確認してください。ディレクトリ全体または個々のファイルを指定できます。
  3. YAML ファイルをクラスタにデプロイします。

    kubectl apply -f PATH_TO_YAML_FILE
    

    PATH_TO_YAML_FILE は、前の手順で作成した YAML ファイルのパスに置き換えます。

    AllowlistSynchronizer コントローラは、クラスタ内の指定されたパスから許可リスト ファイルをインストールします。

  4. 同期ツールが Ready ステータスを報告するまで待ちます。

    kubectl wait --for=condition=Ready allowlistsynchronizer/ALLOWLIST_SYNCHRONIZER_NAME \
      --timeout=60s
    

パートナー ワークロードのデプロイを継続的インテグレーションと継続的デプロイ(CI/CD)パイプラインに統合することもできます。許可リストが正常にインストールされるまで待ってから、対応するワークロードをデプロイするようにワークフローを構成します。

既存の AllowlistSynchronizer を更新する

既存の AllowlistSynchronizer を更新して、許可リスト ファイルを追加または削除できます。次のような状況では、既存の同期ツールを更新することがあります。

  • パートナーが別の名前の新しい許可リスト ファイルを追加します。
  • 関連する許可リストをグループ化する既存の同期ツールに、新しいワークロード許可リストを追加する。
  • 対応するワークロードを使用しなくなったため、同期ツールから許可リストを削除したい。

既存の AllowlistSynchronizer オブジェクトを更新するには、次の操作を行います。

  1. クラスタ内の既存の同期ツールを一覧表示します。

    kubectl get allowlistsynchronizer
    
  2. テキスト エディタで、更新する同期ツールの仕様を開きます。

  3. spec.allowlistPaths フィールドを更新して、許可リストのファイルパスを追加、変更、削除します。

  4. 保存してテキスト エディタを閉じます。

  5. 更新された構成をクラスタに適用します。

    kubectl apply -f PATH_TO_YAML_FILE
    

    PATH_TO_YAML_FILE は、前の手順で更新した YAML ファイルのパスに置き換えます。

更新された同期ツールの構成をデプロイすると、AllowlistSynchronizer オブジェクトのステータスの managedAllowlistStatus.generation フィールドが 1 ずつ増加します。AllowlistSynchronizer コントローラが変更を適用します。

許可リストの同期ステータスをモニタリングする

AllowlistSynchronizer をインストールするか、既存の同期ツールを更新すると、同期ステータスをモニタリングできます。ステータスは、許可リスト ファイルのインストール、削除、変更、および発生する可能性のあるエラーを追跡するのに役立ちます。

同期の一般的なステータスをモニタリングするには、次のコマンドを実行します。

kubectl get allowlistsynchronizer ALLOWLIST_SYNCHRONIZER_NAME -o yaml

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

...
status:
  conditions:
  - type: Ready
    status: "False"
    reason: "SyncError"
    message: "some allowlists failed to sync: example-allowlist-1.yaml"
    lastTransitionTime: "2024-10-12T10:00:00Z"
    observedGeneration: 2
  managedAllowlistStatus:
    - filePath: "gs://path/to/allowlist1.yaml"
      generation: 1
      phase: Installed
      lastSuccessfulSync: "2024-10-10T10:00:00Z"
    - filePath: "gs://path/to/allowlist2.yaml"
      phase: Failed
      lastError: "Initial install failed: invalid contents"
      lastSuccessfulSync: "2024-10-08T10:00:00Z"

これらのフィールドの説明については、AllowlistSynchronizer ステータスをご覧ください。

クラスタに許可リストが存在することを確認する

クラスタに許可リストが存在することを確認するには、次のコマンドを実行します。

kubectl get workloadallowlist

出力は、クラスタにインストールされている許可リストのリストです。出力に、使用する許可リストが含まれていることを確認します。

特権付きワークロードをデプロイする

許可リストのインストールが正常に完了したら、対応するワークロードをクラスタにデプロイできます。ワークロードを提供するパートナーは、ワークロードのインストール手順も提供する必要があります。Autopilot パートナーのリストとドキュメントへのリンクについては、Autopilot パートナーをご覧ください。

非公開イメージ ミラー リポジトリを使用する

パートナー ワークロードのコンテナ イメージを、所有するプライベート リポジトリにミラーリングできます。これらのミラーリングされたイメージをワークロードで実行するには、次の要件をすべて満たす必要があります。

  • ミラーリングされたイメージの SHA-256 ダイジェストは、一般公開されているパートナー ワークロードのイメージ ダイジェストと一致する必要があります。
  • 指定する SHA-256 イメージ ダイジェストは、パートナーから提供され、クラスタに同期される WorkloadAllowlist オブジェクトに存在する必要があります。

パートナー ワークロードがミラーリングされたイメージをサポートしている場合、そのワークロードの許可リスト仕様には、そのワークロードの許可リスト仕様の containers.imageDigests フィールドにイメージ ダイジェストのリストが含まれます。通常、このフィールドには、使用可能なコンテナ イメージのバージョンごとに個別のダイジェストがあります。イメージ ダイジェストのリストを表示する手順は次のとおりです。

  1. 許可リストがクラスタに存在することを確認します
  2. インストールされている許可リストの仕様を取得します。

    kubectl get workloadallowlist ALLOWLIST_NAME -o yaml
    

    ALLOWLIST_NAME は、インストールされた許可リストの名前に置き換えます。例: company-name-solution-v1.0.0

    この機能をサポートするワークロードの場合、出力は次のようになります。imageDigests フィールドには、許可されるダイジェストのリストがあります。

    # lines omitted for clarity
    - containerName: pause-container1
      imageDigests:
      - cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229
      - 932ea160d395f3d7f76c0c17a52a63c4cfe1836a900f1058b6bc20b16fd10d23
    

    出力に imageDigests フィールドが含まれていない場合や、使用するリリースのダイジェストがリストにない場合は、パートナーに直接連絡して、許可リストの更新を依頼してください。パートナーがイメージ ダイジェストを許可リストに追加して GKE に変更を送信すると、クラスタ内の許可リスト同期ツールが更新された許可リストを自動的にインストールします。

  3. サポートされているイメージ ダイジェストのいずれかをワークロード マニフェストに追加します。

たとえば、パートナーの一般公開されている Pod 仕様で次の画像について考えてみましょう。

...
  containers:
  - name: pause-container1
    image: partner-repo/pause1@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229
    securityContext:
      privileged: true

次の例のように、ダイジェストが一般公開されているダイジェストと一致する場合は、ミラーリングされたイメージを使用できます。

...
  containers:
  - name: pause-container1
    image: my-private-repo/pause1@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229
    securityContext:
      privileged: true

前の例と同様に、SHA-256 ダイジェストを画像フィールドに含める必要があります。ダイジェストが一致しない場合、ミラーリングされたイメージは実行されません。パートナー イメージをミラーリングするときにイメージ ダイジェストを保持するには、craneORASskopeo などのツールの使用を検討してください。

特権ワークロードを削除する

クラスタで特権ワークロードの実行を停止するには、対応する許可リストのパスを AllowlistSynchronizer から削除します。同期ツールは許可リストをアンインストールします。

同期ツールを更新する代わりに、クラスタから WorkloadAllowlist オブジェクトを削除すると、同期ツールは許可リストを再インストールします。AllowlistSynchronizer からパスを削除してください。

許可リストをアンインストールするには、次の操作を行います。

  1. 許可リストを管理する AllowlistSynchronizer の YAML マニフェストで、アンインストールする許可リストのパスを削除します。手順については、既存の AllowlistSynchronizer を更新するをご覧ください。
  2. 許可リストがアンインストールされたことを確認するには、クラスタ内の WorkloadAllowlist オブジェクトのリストを取得します。

    kubectl get workloadallowlist
    

    出力で、削除する許可リストが表示されていないことを確認します。

  3. クラスタからワークロードを削除します。手順については、ワークロード プロバイダのドキュメントをご覧ください。

クラスタでの許可リストのインストールを防止する

特定のクラスタで特権ワークロードの許可リストがインストールされないようにするには、ValidatingAdmissionPolicy を使用します。検証用アドミッション ポリシーは、Kubernetes リソースがクラスタで実行される前に、特定条件を満たしていることを確認します。たとえば、ラベルに特定の値があることを検証できます。

クラスタに許可リストがインストールされないようにするには、次の操作を行います。

  1. 次の ValidatingAdmissionPolicy マニフェストを disallow-allowlists.yaml として保存します。

    apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingAdmissionPolicy
    metadata:
      name: "disallow-allowlists"
    spec:
      failurePolicy: Fail
      matchConstraints:
        resourceRules:
        - apiGroups:   ["auto.gke.io"]
          apiVersions: ["*"]
          operations:  ["*"]
          resources:   ["allowlistsynchronizers"]
      validations:
      - expression: "false"
        message: 'AllowlistSynchronizer creation is not allowed'
    
  2. 次の ValidatingAdmissionPolicyBinding マニフェストを disallow-allowlists-binding.yaml として保存します。

    apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingAdmissionPolicyBinding
    metadata:
      name: "disallow-allowlists-binding"
    spec:
      policyName: "disallow-allowlists"
      validationActions: [Deny]
    
  3. クラスタに ValidatingAdmissionPolicy をデプロイします。

    kubectl apply -f disallow-allowlists.yaml
    kubectl apply -f disallow-allowlists-binding.yaml
    

このポリシーにより、クラスタで新しい AllowlistSynchronizer を作成できなくなります。

トラブルシューティング

同期またはワークロードのデプロイが失敗した場合は、特権 Autopilot ワークロードのデプロイのトラブルシューティングをご覧ください。

次のステップ