Policy Controller のトラブルシューティング

このページでは、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 を一時停止して問題を解決できるかどうかを試してみてください。

  1. フリート全体で Policy Controller の接続を切断します。

    gcloud container fleet policycontroller detach
    
  2. 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 フィールドに報告されます。

次のステップ