このページでは、Policy Controller に関する問題を解決する方法について説明します。
全般的なヒント
次のセクションでは、Policy Controller に関する問題を解決するための一般的なアドバイスを示します。
Policy Controller を停止する
Policy Controller がクラスタの問題を引き起こしている場合、問題を調査する間は Policy Controller を停止できます。
指標を調べる
Policy Controller の指標を調べることにより、Policy Controller の問題を診断できます。
インストールを確認する
Policy Controller と制約テンプレート ライブラリが正常にインストールされたかどうかを確認します。
Policy Controller の接続を切断する
まれに、Policy Controller とクラスタとの接続の切断が必要になります。これを行うと、Policy Controller の管理が完全に無効になります。detach
コマンドを使用する前に、Policy Controller を一時停止して問題を解決できるかどうかを試してみてください。
フリート全体で Policy Controller の接続を切断します。
gcloud container fleet policycontroller detach
Policy Controller を再接続します。
gcloud container fleet policycontroller enable
制約テンプレートの作成エラー
disallowed ref
に関するエラーが表示された場合は、参照制約が有効になっていることを確認してください。たとえば、始めに参照制約を設定せずに制約テンプレートで data.inventory
を使用すると、エラーは次のようになります。
admission webhook "validation.gatekeeper.sh" denied the request: check refs failed on module {templates["admission.k8s.gatekeeper.sh"]["MyTemplate"]}: disallowed ref data.inventory...
制約が適用されない
次のセクションでは、制約が適用されていないと思われる場合、または適用されていないことが判明した場合のトラブルシューティング ガイダンスを示します。
制約が適用されているかどうかを確認する
制約が適用されていないと思われる場合は、制約の spec.status
と制約テンプレートを確認します。ステータスを確認するには、次のコマンドを実行します。
kubectl describe CONSTRAINT_TEMPLATE_NAME CONSTRAINT_NAME
次のように置き換えます。
CONSTRAINT_TEMPLATE_NAME
: 確認する制約テンプレートの名前。例:K8sNoExternalServices
CONSTRAINT_NAME
: 確認する制約のName
。必要に応じて
kubectl get constraint
を実行し、システムにインストールされている制約テンプレートと制約を確認します。
kubectl describe
コマンドの出力で、metadata.generation
フィールドと status.byPod.observedGeneration
フィールドの値をメモします。次の例で太字で示した値です。
Name: no-internet-services
Namespace:
API Version: constraints.gatekeeper.sh/v1beta1
Kind: K8sNoExternalServices
Metadata:
Creation Timestamp: 2021-12-03T19:00:06Z
Generation: 1
Managed Fields:
API Version: constraints.gatekeeper.sh/v1beta1
Fields Type: FieldsV1
fieldsV1:
f:metadata:
f:annotations:
f:config.k8s.io/owning-inventory:
f:configmanagement.gke.io/cluster-name:
f:configmanagement.gke.io/managed:
f:configmanagement.gke.io/source-path:
f:configmanagement.gke.io/token:
f:configsync.gke.io/declared-fields:
f:configsync.gke.io/git-context:
f:configsync.gke.io/manager:
f:configsync.gke.io/resource-id:
f:labels:
f:app.kubernetes.io/managed-by:
f:configsync.gke.io/declared-version:
f:spec:
f:parameters:
f:internalCIDRs:
Manager: configsync.gke.io
Operation: Apply
Time: 2022-02-15T17:13:20Z
API Version: constraints.gatekeeper.sh/v1beta1
Fields Type: FieldsV1
fieldsV1:
f:status:
Manager: gatekeeper
Operation: Update
Time: 2021-12-03T19:00:08Z
Resource Version: 41460953
UID: ac80849d-a644-4c5c-8787-f73e90b2c988
Spec:
Parameters:
Internal CID Rs:
Status:
Audit Timestamp: 2022-02-15T17:21:51Z
By Pod:
Constraint UID: ac80849d-a644-4c5c-8787-f73e90b2c988
Enforced: true
Id: gatekeeper-audit-5d4d474f95-746x4
Observed Generation: 1
Operations:
audit
status
Constraint UID: ac80849d-a644-4c5c-8787-f73e90b2c988
Enforced: true
Id: gatekeeper-controller-manager-76d777ddb8-g24dh
Observed Generation: 1
Operations:
webhook
Total Violations: 0
Events: <none>
すべての Policy Controller Pod で observedGeneration
の値が metadata.generation
の値と等しい場合(上記の例のような場合)、制約が適用されている可能性が高いと考えられます。しかし、これらの値が一致しているにもかかわらず制約の適用に関する問題が解決しない場合は、次のセクションのヒントをご覧ください。一部の値のみが一致する場合や、一部の Pod が表示されていない場合、制約のステータスは不明です。制約が、Policy Controller の複数の Pod 間で一貫して適用されていないか、まったく適用されていない可能性があります。一致する値がない場合、制約は適用されていません。
制約は適用されないが監査結果が報告される
前のセクションで説明した observedGeneration
のチェックで値が一致していて、制約に関する監査結果が報告されていて、その報告で(受信リクエストではなく既存のオブジェクトの)違反が存在する可能性が示されているが、それでも制約が適用されない場合は、Webhook に関連する問題である可能性があります。Webhook で次のいずれかの問題が発生している可能性があります。
- Policy Controller の Webhook Pod が動作していない可能性があります。Kubernetes のデバッグ手法が、Webhook Pod の問題の解決に役立つ可能性があります。
- API サーバーと Webhook サービスの間にファイアウォールが存在する可能性があります。ファイアウォールの修正方法については、ファイアウォール プロバイダのドキュメントをご覧ください。
参照制約が適用されない
制約が参照制約の場合は、必要なリソースがキャッシュされていることを確認してください。リソースをキャッシュする方法の詳細については、参照制約用の Policy Controller の構成をご覧ください。
制約テンプレートの構文を確認する
独自の制約テンプレートを記述して、それが適用されない場合は、制約テンプレートの構文にエラーがある可能性があります。
次のコマンドを使用してテンプレートを確認できます。
kubectl describe constrainttemplate CONSTRAINT_TEMPLATE_NAME
CONSTRAINT_TEMPLATE_NAME
を調査するテンプレートの名前に置き換えます。エラーは status
フィールドに報告されます。
次のステップ
- さらにサポートを必要とされる場合は、Google Cloud サポートにお問い合わせください。