SUPER-G.EEK.JP

twitter: @hum_op_dev
github: ophum

kube-prometheus-stackをargocdでデプロイするときはServerSideApplyがよさそう

目次

課題

kube-prometheus-stack を argocd でデプロイする際、以下の場合に sync failed になることがあります。

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 のサイズデカい問題を回避します。

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

整理

解決策 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 を一緒にデプロイしたいときはこの方法になると思います。