kube-prometheus-stackをargocdでデプロイするときはServerSideApplyがよさそう
課題
kube-prometheus-stack を argocd でデプロイする際、以下の場合に sync failed になることがあります。
crds.enabled=trueで Client Side Apply をしたときcrds.enabled=trueで Replace=true で Sync したとき
crds.enabled=true で Client Side Apply をしたとき
Client Side Apply の際、annotations に kubectl.kubernetes.io/last-applied-configurationが設定されます。
これのサイズが大きいため apply できないというエラーです。

これを回避するには Replace=true を指定しますが、後述するエラーが発生します。
crds.enabled=true で Replace=true で Sync したとき
こんな感じで Replace にチェックを入れて Sync します。 これによって crds の annotations のサイズデカい問題を回避します。

しかし、以下画像のように失敗してしまいます。

整理
- CRD をインストールするときは Replace=true を使いたい
kubectl.kubernetes.io/last-applied-configurationが大きくなるから
- CRD 以外をインストールするときは Replace=true だとエラーになる
- 具体的に「なぜか」はわかってないですが argocd の処理的なところかなと勝手に想像しています・・・
解決策 1: CRD とそれ以外で Application を別ける
解決する方法として、まず思い浮かんだのは CRD とそれ以外で別々の Application として ArgoCD に登録し管理するという方法です。 実際にそのような管理方法で運用してたりします。
別けることで、CRD は Replace=true で Sync して CRD 以外は Replace=false で Sync できるということです。
解決策 2: Server Side Apply を使う
今日知ったのですが、ServerSideApply を使うと kubectl.kubernetes.io/last-applied-configurationは登録されません。
そのため、今回の annotations が長い問題は起こりません。
また、annotations が長い問題が起こらなければ Replace=true にする必要がないので CRD も CRD 以外を Replace=false で Sync することができます。

これによってcrds.enabled=trueで CRD とそれ以外を同じ Application で管理できるようにもなりました。
(とはいえ、管理しやすさという観点では CRD を別けておくのも悪くないかなというお気持ちなので、等分は CRD とそれ以外で Application を別けて置こうかなと思います・・・)
さいごに
表題の通り kube-prometheus-stack を argocd でデプロイする際は Server Side Apply で Sync するのがよさそうです。 特に CRD を一緒にデプロイしたいときはこの方法になると思います。