このページでは、Google Kubernetes Engine(GKE)Autopilot クラスタにデプロイする特権ワークロードに関する問題を解決する方法について説明します。
許可リストの同期に関する問題
AllowlistSynchronizer
をデプロイすると、GKE は指定した許可リスト ファイルをインストールして同期しようとします。この同期が失敗した場合、AllowlistSynchronizer
の status
フィールドにエラーが報告されます。
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"
conditions.message
フィールドと managedAllowlistStatus.lastError
フィールドには、エラーの詳細情報が表示されます。以下の情報を参考にして問題を解決してください。
特権ワークロードのデプロイに関する問題
許可リストのインストールが正常に完了したら、対応する特権ワークロードをクラスタにデプロイします。場合によっては、GKE がワークロードを拒否することがあります。
次の解決策を試します。
- クラスタの GKE バージョンがワークロードのバージョン要件を満たしていることを確認します。
- デプロイするワークロードが、許可リスト ファイルが適用されるワークロードであることを確認します。
特権ワークロードが拒否された理由を確認するには、許可リスト違反に関する詳細情報を GKE にリクエストします。
クラスタにインストールされている許可リストのリストを取得します。
kubectl get workloadallowlist
特権ワークロードに適用する許可リストの名前を確認します。
特権ワークロードの YAML マニフェストをテキスト エディタで開きます。ワークロードのデプロイ プロセスで他のツールを使用している場合など、YAML マニフェストにアクセスできない場合は、ワークロード プロバイダに連絡して問題を報告してください。以降の手順はスキップします。
特権ワークロード Pod 仕様の
spec.metadata.labels
セクションに次のラベルを追加します。labels: cloud.google.com/matching-allowlist: ALLOWLIST_NAME
ALLOWLIST_NAME
は、前の手順で取得した許可リストの名前に置き換えます。許可リスト ファイルのパスではなく、kubectl get workloadallowlist
コマンドの出力から名前を使用します。マニフェストを保存し、ワークロードをクラスタに適用します。
kubectl apply -f WORKLOAD_MANIFEST_FILE
WORKLOAD_MANIFEST_FILE
は、マニフェスト ファイルのパスに置き換えます。出力には、ワークロード内のどのフィールドが指定された許可リストと一致しなかったかに関する詳細情報が示されます。次の例をご覧ください。
Error from server (GKE Warden constraints violations): error when creating "STDIN": admission webhook "warden-validating.common-webhooks.networking.gke.io" denied the request: =========================================================================== Workload Mismatches Found for Allowlist (example-allowlist-1): =========================================================================== HostNetwork Mismatch: Workload=true, Allowlist=false HostPID Mismatch: Workload=true, Allowlist=false Volume[0]: data - data not found in allowlist. Verify volume with matching name exists in allowlist. Container[0]: - Envs Mismatch: - env[0]: 'ENV_VAR1' has no matching string or regex pattern in allowlist. - env[1]: 'ENV_VAR2' has no matching string or regex pattern in allowlist. - Image Mismatch: Workload=k8s.gcr.io/diff/image, Allowlist=k8s.gcr.io/pause2. Verify that image string or regex match. - SecurityContext: - Capabilities.Add Mismatch: the following added capabilities are not permitted by the allowlist: [SYS_ADMIN SYS_PTRACE] - VolumeMount[0]: data - data not found in allowlist. Verify volumeMount with matching name exists in allowlist.
この例では、次の違反が発生します。
- ワークロードで
hostNetwork: true
が指定されているが、許可リストでhostNetwork: true
が指定されていない。 - ワークロードで
hostPID: true
が指定されているが、許可リストでhostPID: true
が指定されていない。 - ワークロードでは
data
という名前のボリュームが指定されていますが、許可リストではdata
という名前のボリュームが指定されていません。 - コンテナには
ENV_VAR1
とENV_VAR2
という名前の環境変数が指定されていますが、許可リストにはこれらの環境変数が指定されていません。 - コンテナではイメージ
k8s.gcr.io/diff/image
が指定されていますが、許可リストではk8s.gcr.io/pause2
が指定されています。 - コンテナは
SYS_ADMIN
機能とSYS_PTRACE
機能を追加しますが、許可リストではこれらの機能の追加が許可されていません。 - コンテナは
data
という名前のボリューム マウントを指定していますが、許可リストにはdata
という名前のボリューム マウントが指定されていません。
- ワークロードで
サードパーティ プロバイダが提供するワークロードをデプロイしている場合は、そのプロバイダに問題を報告して違反を解決します。前のステップの出力を問題に提供します。
特権ワークロードと許可リストに関するバグと機能リクエスト
パートナーは、特権ワークロードと許可リストの作成、開発、維持を行う責任があります。バグが発生した場合や、特権ワークロードまたは許可リストに関する機能リクエストがある場合は、該当するパートナーにお問い合わせください。