kubell Creator's Note

ビジネスチャット「Chatwork」のエンジニアのブログです。

ビジネスチャット「Chatwork」のエンジニアのブログです。

読者になる

ArgoCD v3.0へのバージョンアップ

こんにちは。SREグループです。
今回は先日ArgoCD v3.0へのバージョンアップ対応の際に行ったことを書いていこうと思います。

経緯

経緯としては「Helm」に脆弱性が報告されたことによるものです。

www.security-next.com

これを受けてArgoCDも対応されましたが、v3.0以前のバージョンは対応しないことが書かれており、v3.1までアップデートする必要がありました。
また、利用していたArgoCDのバージョンはv2.14であったため、メジャーバージョンアップは破壊的な変更もあるため、まずv3.0にバージョンアップすることにしました。

対応内容

バージョン: v2.14 → v3.0.16

基本方針

対応の基本方針としては極力現行のv2の挙動を維持するような対応をすることにしました。
中には非推奨となる設定もあると思いますが、追って検討、対応する方針にしました。

1. RBAC設定の互換性維持

v3.0ではRBACの設定がサブリソースには適用されなくなる変更が入りました。
今回は基本方針に則り、v2を引き継ぐ設定にしました。

server.rbac.disableApplicationFineGrainedRBACInheritance: "false"

https://argo-cd.readthedocs.io/en/stable/operator-manual/upgrading/2.14-3.0/#fine-grained-rbac-for-application-update-and-delete-sub-resources

2. リソース比較オプション

v3.0ではignoreDifferencesの挙動が変わるようです。
デフォルトではシステムレベルのリソースの差分は無視されるようです。
こちらもv2を引き継ぐ設定にしました。

resource.compareoptions: |
  application.ignoreDifferencesOnResourceUpdates: "false"
  application.ignoreResourceStatusField: "crd"

https://argo-cd.readthedocs.io/en/stable/operator-manual/upgrading/2.14-3.0/#ignoring-resource-updates-configured-in-ignoredifferences-by-default

3. リソーストラッキング

v3.0ではリソースのトラッキングのデフォルトの挙動がラベルベースからアノテーションベースになるようです。
明示的にラベルベースにしていたわけではないですが今までと挙動が変わり思わぬ動作をする可能性もあるため、ラベルベースにするために設定を追加しました。

application.resourceTrackingMethod: label

https://argo-cd.readthedocs.io/en/stable/operator-manual/upgrading/2.14-3.0/#use-annotation-based-tracking-by-default

4. その他

その他としては、ArgoCDではhelmfileを利用しているので、そのプラグインのdockerイメージ (chatwork/argocd-helmfile-plugin)のバージョンもArgoCDのバージョンに対応するためアップデートしました。

アップデート後の追加対応

アップデート後に見つかった問題が2つほどあったのでそちらも共有したいと思います。

1. ignoreDifferencesOnResourceUpdatesのエラー対応

ArgoCD自体の変更というよりもCRD v1になったことの影響のようで、spec.preserveUnknownFieldsが廃止されたことで今まで出ていなかった差分がでるようになったため、対応しました。

resource.customizations.ignoreDifferences.apiextensions.k8s.io_CustomResourceDefinition: |
      jsonPointers:
        - /spec/preserveUnknownFields

https://argo-cd.readthedocs.io/en/stable/operator-manual/upgrading/2.14-3.0/#removing-default-ignores-of-preserveunknownfields-for-crd

2. ArgoCD Notificationのエラー対応

以下のようなログが出ていることを発見し、Notificationのwhenで指定しているプロパティが定義されておらずnilになってしまうために出ているようでした。

{"level":"error","msg":"failed to execute when condition: cannot fetch phase from \u003cnil\u003e (1:27)\n | app.status.operationState.phase in ['Succeeded'] and app.status.health.status == 'Healthy'\n | ..........................^","time":"2025-09-24T09:03:59Z"}

どう対応するべきか調べていたところexpr-langというライブラリに依存したもののようで、nilなる可能性がある箇所のプロパティに?を入れることで対応できるようです。 Rubyでいう「safe navigation operator (ぼっち演算子)」のようなものでしょうか。

when: app.status.operationState?.phase in ['Succeeded'] and app.status.health.status == 'Healthy'

https://github.com/argoproj/argo-cd/issues/21591 https://expr-lang.org/docs/language-definition#optional-chaining

こちらはあとから気付いたのですが、過去ログも調べてみると以前からでており条件に合わないパターンもあるようなので、対応する必要はなかったのかもしれません。

感想

以上のような対応でv3.0にアップデートしました。
メジャーバージョンアップということで細かい対応が必要でしたが、ドキュメントが整っていたので比較的スムーズにアップデート出来た気がします。

後日談として、このバージョンアップ後には脆弱性に対応したバージョンであるv3.1のバージョンアップも行いましたが、v3.0との差分は基本的にはなかったため何事もなくバージョンアップできました。

最後に、課題感として開発環境用、本番環境用のArgoCDはそれぞれあるのですが、どちらも全く同じ設定というわけではないため、本番環境でないと確認出来ないことというのがいくつかあったので、こういったバージョンアップや機能追加時などで事前に検証できる環境が別途ほしいなと思いました。