コンテンツにスキップ

ArgoCD で Kubernetes リソースの差分を無視する

Argo CD が特定のフィールドの差分を検出し続ける場合、そのフィールドをignoreDifferencesで比較対象から外せます。本記事では、アプリケーション単位で差分を無視する設定例を紹介します。

Argo CD は、Kubernetes の継続的デリバリーを実現する宣言的な GitOps ツールです。Git リポジトリにある Kubernetes マニフェストと実際のクラスタの状態を比べ、差分があればあるべき状態に修正します。

ignoreDifferences の設定

Argo CD の役割は、Kubernetes 上のリソースとコードに差分がないように状態を保つことです。ただし、設定次第で変更に対する操作が競合してリソースの上書きがループし、outOfSync状態のまま sync が完了しなくなることがあります。ignoreDifferencesで特定のリソースやフィールドの差分を無視すれば、上書きの繰り返しを防ぎ、sync を正常に完了できます。

ignoreDifferencesの設定には、アプリケーション単位のものとシステム全体に適用するものの 2 種類があります。本記事で扱うのはアプリケーションレベルの設定です。システムレベルの設定については、公式ドキュメントのSystem-Level Configurationを参照してください。

アプリケーションレベルの設定

アプリケーションレベルの設定を使うと、特定のアプリケーションに限って差分を無視できます。Application リソースのspec.ignoreDifferencesに設定を記述し、次の例ではValidatingWebhookConfigurationリソースのcaBundleフィールドの差分を無視します。

1
2
3
4
5
6
spec:
  ignoreDifferences:
    - group: admissionregistration.k8s.io
      kind: ValidatingWebhookConfiguration
      jqPathExpressions:
        - ".webhooks[]?.clientConfig.caBundle"

上記の例では、jqPathExpressionsで対象のフィールドを指定しています。jqPathExpressionsの代わりにjsonPointersを使う場合は、次のように指定します。

1
2
3
4
5
6
spec:
  ignoreDifferences:
    - group: admissionregistration.k8s.io
      kind: ValidatingWebhookConfiguration
      jsonPointers:
        - "/webhooks/0/clientConfig/caBundle"

cluster-scoped リソースの注意点

ignoreDifferencesで対象のリソースのnameとnamespaceも指定できますが、cluster-scoped リソースにnamespaceを指定すると正しく動作しないので注意が必要です。上記の例でnamespaceを指定していないのも、ValidatingWebhookConfigurationリソースが cluster-scoped リソースだからです。

まとめ

ignoreDifferencesは、意図しない上書きの繰り返しを防ぐための機能です。アプリケーションレベルの設定では、jqPathExpressionsまたはjsonPointersを使って対象フィールドを指定します。cluster-scoped リソースを対象にする場合は、namespace を指定しないよう注意してください。