Admission Webhook のトラブルシューティングを行う

このページでは、Config Sync Admission Webhook に関する問題を解決する方法について説明します。Webhook の詳細については、構成ファイルのドリフトを防止するをご覧ください。

KNV 2009 エラーのトラブルシューティング

以下の各セクションでは、KNV2009 エラーの解決方法について説明します。

Admission Webhook 接続の拒否

ドリフト保護を有効にしている場合は、Reconciler が構成ファイルのクラスタに適用しようとしたときに、次のエラーが表示される可能性があります。

KNV2009: Internal error occurred: failed calling webhook "v1.admission-webhook.configsync.gke.io": Post "https://admission-webhook.config-management-system.svc:8676/admission-webhook?timeout=3s": dial tcp 10.92.2.14:8676: connect: connection refused

このエラーは、Admission Webhook の準備がまだできていないか、異常になったこと表しています。これは通常、Config Sync のブートストラップ時に発生する可能性がある一時的なエラーです。

この問題が繰り返し発生する場合は、Admission Webhook Deployment を記述し、Pod がスケジュール可能かつ正常な状態であるかどうかを確認します。

kubectl describe deploy admission-webhook -n config-management-system

kubectl get pods -n config-management-system -l app=admission-webhook

Pod が正常な Deployment の出力は次のようになります。

Replicas:               2 desired | 2 updated | 2 total | 2 available | 0 unavailable
...
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
...

Admission Webhook リクエストの I/O タイムアウト

Reconciler がクラスタに構成を適用しようとしたときに、次のようなエラーが表示された場合は、Admission Webhook ポート 8676 で、ファイアウォールによってコントロール プレーン ネットワークへの通信がブロックされる可能性があります。

KNV2009: Internal error occurred: failed calling webhook "v1.admission-webhook.configsync.gke.io": Post https://admission-webhook.config-management-system.svc:8676/admission-webhook?timeout=3s: dial tcp 10.1.1.186:8676: i/o timeout

この問題を解決するには、ポート 8676 を許可するファイアウォール ルールを追加します。これは、Config Sync Admission Webhook がドリフト防止に使用するポートです。コントロール プレーンがクラスタノード上の Webhook バックエンドに到達できるようにするため、コントロール プレーンからノードへのポート 8676 を開く必要があります。

Admission Webhook によりリクエストが拒否された

Config Sync で管理されているフィールドに変更を適用しようとして次のエラーが発生した場合は、競合が生じる変更を行った可能性があります。

error: OBJECT could not be patched: admission webhook "v1.admission-webhook.configsync.gke.io"
denied the request: fields managed by Config Sync can not be modified

ドリフト保護を有効にしている場合、構成ファイルでフィールドを宣言し、リポジトリがクラスタに同期されると、対象のフィールドは Config Sync が管理します。対象フィールドを変更しようとすることは、競合する変更に該当します。

たとえば、リポジトリに environment:prod のラベルが付いた Deployment 構成ファイルがあり、クラスタ内でそのラベルを environment:dev に変更しようとすると、それは競合する変更となり、このエラー メッセージが表示されます。ただし、新しいラベル(tier:frontend など)を Deployment に追加しても競合は発生しません。

Config Sync でオブジェクトへの変更が無視されるようにするには、オブジェクトのミューテーションを無視するで説明されているアノテーションを追加します。

すべてのリソースタイプの削除ができなかった

Terminating フェーズで Namespace がスタックする際の条件は次のとおりです。

    message: 'Failed to delete all resource types, 1 remaining: admission webhook
      "v1.admission-webhook.configsync.gke.io" denied the request: system:serviceaccount:kube-system:namespace-controller
      is not authorized to delete managed resource "_configmap_bookstore_cm1"'
    reason: ContentDeletionFailed
    status: "True"
    type: NamespaceDeletionContentFailure

このエラーは、ルート リポジトリから Namespace オブジェクトを削除しようとしたときに、Namespace の下にある一部のオブジェクトが Namespace の Reconciler によってアクティブに管理されている場合に発生します。Namespace が削除されると、Namespace コントローラ(サービス アカウントが system:serviceaccount:kube-system:namespace-controller)は、対象の Namespace にあるすべてのオブジェクトを削除しようとします。ただし、Config Sync Admission Webhook は、ルートまたは Namespace の Reconciler にのみこれらのオブジェクトの削除を許可し、Namespace コントローラによる削除を拒否します。

この問題を回避するには、Config Sync Admission Webhook を削除します。

kubectl delete deployment.apps/admission-webhook -n config-management-system

ConfigManagement Operator が Config Sync Admission Webhook を再作成します。

この回避策で問題が解決しない場合は、Config Sync の再インストールが必要になることがあります。

エラーの再発を防ぐため、Namespace を削除する前にNamespace リポジトリを削除してください。

次のステップ

  • まだ問題が解決しない場合は、既知の問題かどうかを確認してください。