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 分ごとに許可リストファイルの更新を確認します。更新が存在する場合、同期ツールは更新された許可リストをクラスタにインストールします。

特定のワークロードを許可しないようにするには、既存の 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 ワークロードのデプロイのトラブルシューティングをご覧ください。

次のステップ