ArgoCDで差分が無視されるパターン、その他tips

ArgoCDを実際の運用に乗せてみての気付きやtipsをつらつらと

# 検出されない差分

ArgoCDのweb画面では、リポジトリでの定義（desired manifest）と現在deployされているもの（live manifest）を確認でき、差分があれば表示されるようなUIになっています
また、このlive manifestの画面から直接リソースを編集することも可能で、いちいちリポジトリに変更をpushせずにちょっと試したい、みたいな時は便利です
live manifestからの編集によってリポジトリとの差分が発生した場合は、当然その差分がUI上に示されます
が、これが出ないパターンがあります

こちらのシンプルなnginxのmanifest
![スクリーンショット 2021-12-20 22.24.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122084/2d26a065-239e-69f8-9521-dfba3804cb2c.png)
✅ 💚 で問題なく同期されていることがわかります

ここにlive manifestの画面から手動でenvを追加してみます
![スクリーンショット 2021-12-20 22.32.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122084/b61a5268-94a1-1c8f-a41a-d0dab9e34634.png)
saveするとpodが入れ替わり、環境変数の設定されたpodが立ち上がりました
が、deploymentに差分は検出されていません
![スクリーンショット 2021-12-20 22.33.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122084/9b7e624f-ed83-0b9f-b478-8c868bb62a75.png)
このように、既存fieldの変更ではなく、追加するような形で変更を入れると差分が検出されないようです
他のenvの設定が既に存在するところに新しいenvを追加しても、サイドカーコンテナを立てても差分は検出されません
今回はUIから変更しましたが、kubectl editで変更しても同じ結果になります

ちなみにこの差分は、他の関係ないところで差分が発生してout of snycになってからリソースをsyncしても残り続けます
手動で直接戻すか、一度リソースを消して作り直すしかないと思いますので、変更したことを忘れてしまったらなかなかの罠になりそうです

ArgoCDを使っておきながら本番環境でリソースを直接編集することはさすがにないと思いますが、少人数で使っている開発環境なんかは割とやりがちだと思うので、謎の本番との動作の違いに悩む可能性があります

# 同期は基本ポーリング
リポジトリとの同期はポーリングになっていて、その間隔はデフォルト3分です
これは待ってると結構長いです
application-controllerのflag `--app-resync`で間隔を調整できますが、ポーリングなのであんまり短くしても無用な負荷がかかってしまいます

スマートに素早く同期させたいなら、webhookを使用するのがよいかと思います
https://argo-cd.readthedocs.io/en/stable/operator-manual/webhook/

# 消えない差分

HPAのspec.metricsなどの一部のリソースのフィールドでは、順番が勝手にソートされてそれが差分になってしまうことがあります
残念ながら現状ではArgoCDで表示される順番を正としてリポジトリ側を変更しないとこの差分は消えません
何度かsyncしても差分がなくならないようならこれかもしれないです

どうやらこれはkubernetesの問題らしいです
https://github.com/argoproj/argo-cd/issues/1079
https://github.com/kubernetes/kubernetes/issues/74099
結構古いissueなのでもしかしたら解消されないかもしれません…

# リモートリポジトリの同期
ArgoCDを同期させているkustomizeで、更にこのように他のリポジトリを参照している場合

```yaml:kustomization.yaml
resources:
  - github.com/kubernetes-sigs/kustomize/examples/helloWorld
```

この例の場合の`kustomize/examples/helloWorld`の変更はデフォルトでは直ちに検出されません
repo-serverのflag `--repo-cache-expiration`で更新間隔を設定できます
が。やはりこれもやたら短くしては各所に負荷がかかることになります

手動で更新する方法はいくつかあり、

- applicationのmanifestにannotation `argocd.argoproj.io/refresh: hard` を付ける
    - ドキュメントには見当たらなかったけど使えるみたいです https://github.com/argoproj/argo-cd/blob/v2.1.3/pkg/apis/application/v1alpha1/application_annotations.go#L4-L6
    - refreshしたい時にこのannotationを付け、refreshが終わったらこのannotationは消える流れです
- UIでHard Refresh
    - REFRESHのとこの三角からできます
    - ![スクリーンショット 2021-12-20 23.13.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122084/5f9cbdb2-1d3c-95c5-2035-caca117514b6.png)

# 内部で使っているツールのバージョン管理
内部で使うhelmやkustomizeのバージョンを変更するには、自分でそのパッケージをダウンロードする必要があります
ので、initContainerでwgetなどを使い事前処理する必要があります、なんだか意外にも地道なやり方
https://argo-cd.readthedocs.io/en/stable/user-guide/kustomize/#custom-kustomize-versions
ちなみにこの処理をする対象はargocd-repo-server

# 結構リソースを食う
管理するクラスタの規模にもよりますが、意外とリソースを要求されます
application-controllerは何もしてないように見えても延々リソースを使っているし、
repo-serverも必要に応じてスパイクしたりするので、普段はあまり消費してないように見えても高めにlimitを設定する必要が
リソースの予算管理がシビアな場合の導入はこの点でも注意する必要があるかも

# 環境の見分け方
開発本番で使い分けるなど、いくつかのArgoCD環境を使っていると、UIでどれを開いているのかわからなくなりがちです
そんな場合はカスタムCSSを当てられます
https://argo-cd.readthedocs.io/en/stable/operator-manual/custom-styles/

# 色々文句をたれましたが…
ArgoCDはものすごく便利なツールです
私はもう今ではArgoCDで管理されていない環境を触るのが恐ろしくてしょうがないです
依存症はよくないと思いますが、そうなってしまうくらい運用負荷を減らしてくれます

キャラクターがイケてるのもグッド :grinning: