コントローラの競合のトラブルシューティング

このページでは、コントローラの競合に関する問題の解決方法について説明します。このような競合が発生すると、大量のリソースが消費され、パフォーマンスが低下する可能性があります。競合はリソース競合とも呼ばれます。

Config Sync は、クラスタに適用したオブジェクトを監視し、信頼できる情報源で宣言された値に対する変更を元に戻します。このような変更が別のコントローラによって行われている場合、競合するコントローラによってリソースの状態がさらに変更される可能性があります。この動作の兆候の一つは、metadata.generation フィールドと metadata.resourceVersion フィールドの急激な増加です。このため、マネージド オブジェクトの更新頻度が 1 分あたり 5 回を超えると、Config Sync は競合を検出し、ブレをログに記録して、RootSync オブジェクトまたは RepoSync オブジェクトのステータスにエラーを報告します。

Config Sync には、複数の RootSync オブジェクトと RepoSync オブジェクト間の競合を検出する特別なロジックがあります。RepoSync オブジェクトの場合、オブジェクトが別の Reconciler によってすでに管理されているものとして Reconciler が認識すると、以降の更新はスキップされます。RootSync オブジェクトの場合、別の RootSync オブジェクトによって管理されていない限り、Reconciler は、管理するように構成されているオブジェクトを使用しようとします。これにより、Config Sync Reconciler の競合がなくなり、関連するすべての RootSync オブジェクトと RepoSync オブジェクトのステータスでエラーが報告されます。

コントローラの競合を特定する

競合エラーを確認するには、nomos status コマンドを使用するか、RootSync オブジェクトまたは RepoSync オブジェクトのステータス フィールドを確認します。

nomos コマンドライン ツールがインストールされていない場合は、次のコマンドを実行して RootSync Reconciler のログを確認できます。

kubectl logs -n config-management-system \
    --selector "app=reconciler,configsync.gke.io/sync-name=root-sync" \
    --container reconciler

特定の RepoSync Reconciler をフィルタするには、次のコマンドを実行します。

kubectl logs -n config-management-system \
    --selector "app=reconciler,configsync.gke.io/sync-namespace=NAMESPACE" \
    --container reconciler

NAMESPACE は、Namespace スコープの信頼できる情報源を作成した Namespace に置き換えます。

結果に KNV2005 が表示されている場合は、コントローラの競合が発生しています。

次のエラー メッセージは、ログに表示される可能性のあるエラーの例です。

KNV2005: detected excessive object updates, approximately 6 times per
minute. This may indicate Config Sync is fighting with another controller over
the object.

コントローラの競合を調査する

コントローラの競合の詳細を確認するには、次のコマンドを実行してリソースの YAML ファイルの更新を確認します。

 kubectl get RESOURCE OBJECT_NAME \
     --namespace NAMESPACE \
     --watch -o yaml

次のように置き換えます。

  • RESOURCE: 競合しているリソースの種類。
  • OBJECT_NAME: 競合が発生しているオブジェクトの名前。
  • NAMESPACE: 競合しているリソースが存在する Namespace。

ログ結果には、追加する必要のあるリソース、オブジェクト名、Namespace が含まれています。

このコマンドは、更新が API サーバーに適用された後のリソースの状態のストリームを返します。ファイル比較ツールで出力を比較します。

コントローラの競合を解決する

コントローラの競合を解決する方法はいくつかあります。Config Sync の設定に最適なオプションを選択してください。

  • 他のコントローラが求める値と一致するように、ソース内のリソース マニフェストを更新します。
  • 問題のフィールドをソースから削除して、他のコントローラで管理できるようにします。
  • もう一方のコントローラを無効にするか、アンインストールします。
  • ソースからリソースを削除し、手動で、または特定の変更や共同管理を許容するカスタム コントローラを使用して、リソースを管理します。
  • リソース競合を引き起こしているコントローラを所有しており、変更するフィールドが信頼できる情報源にない場合は、更新ではなく、パッチ適用を実行するようにコントローラを更新します。こうすることで、変更が Config Sync によって許可され、元に戻されることがなくなります。

また、他のコントローラに属する必要があるリソースもあります(たとえば、CRD をインストールまたは管理するオペレーターなど)。こうしたコントローラは、Config Sync に固有のメタデータを自動的に削除します。Kubernetes クラスタ内の別のコンポーネントによって Config Sync メタデータが削除された場合は、Config Sync でリソースの管理を停止します。方法については、マネージド オブジェクトの管理を停止するをご覧ください。

また、クラスタ内のマネージド オブジェクトに対する変更を Config Sync が元に戻さないようにするには、Config Sync がミューテーションを無視するように設定するオブジェクトに client.lifecycle.config.k8s.io/mutation: ignore アノテーションを追加します。方法については、オブジェクトのミューテーションを無視するをご覧ください。

次のステップ

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