背景
プライベートでは web サービスや定期実行されるバッチ、Slack bot や LINE bot などを開発しています。これらはすべて Kubernetes 上で動いておりリリースには Argo CD を使用しています。
アプリケーションは基本別々のリポジトリで管理しており Argo CD が Sync する manifest は1つのリポジトリに格納しています。何かを開発してコンテナイメージの新しいタグを作成した時は manifest を新しいタグに更新する必要があります。
この更新処理は手動で行っても良いのですが、自分はプライベートで開発する時はその作りたいものだけに集中するために自動化できる部分は自動化するようにしています。そのため今までは各リポジトリで新しいタグを作成したタイミングで manifest を管理しているリポジトリを clone してタグを更新するようなスクリプトを作成して使用していました。
課題
さきほどの更新処理は問題なく動くのですが、個人的には下記の2つの点が気になっていました。
- スクリプトのメンテナンス
- 手動で管理するクレデンシャル
前者に関しては一度スクリプトを作ってしまえばそこまで更新頻度は多くないので現状は大きな問題にはなっていません。
後者のクレデンシャルは Github の personal access token なのですが、手動で設定しています。Github Actions を使っているので Organization secrets を使うことで、リポジトリの数が増えても設定自体の手間は最小限に減らすことはできます。しかしセキュリティ面からもできればクレデンシャルを CI に持たせたくありません。AWS のクレデンシャルのように OIDC を使って都度取得できれば良いのですが、固定なのでローテーションは自分で行う必要があります。
解決策
課題の解決策を考えた時、最初は ECR への push イベントを SQS にキューイングして、何かでそれをサブスクライブしてリポジトリのマニフェストを更新する方法も考えました。 しかしいずれの場合も新しくトークンを発行して設定する必要があるので、現状の課題の解決策にはなりません。
そんな時に見つけたのが、 Argo CD Image Updater でした。Argo CD Image Updater は名前から察することができるように Argo CD で管理されているアプリケーションのコンテナイメージをアップデートしてくれるものです。 argocd-image-updater.readthedocs.io
Argo CD Image Updater は指定されたイメージのレジストリを polling しつつ Argo CD で管理しているアプリケーションで管理しているイメージのタグとの差分があれば Argo CD の API を介して直接更新するかリポジトリのマニフェストを更新してくれます。
またこのコンポーネントはデフォルトとして Argo CD で使用しているクレデンシャルを使用します。そのため新しく Image Updater 用にクレデンシャルを発行する必要がありません。更新処理もスクリプトから Argo CD Image Updater になるのでメンテナンスが少し楽になります。
導入
Argo CD Image Updater の導入自体は難しくありません。自分は Helm Chart を使用してインストールしました。
ただ設定には少し工夫が必要なのとちょっとしたハマりどころがありました。
まず設定の工夫はレジストリの設定です。自分は ECR を使用しておりクレデンシャル自体は IRSA を使って渡すことができます。しかし Image Updater は現状 ECR をサポートしていません。現状は対応するためには下記の issue にあるように Image Updater で読み取れる形で認証情報を出力するスクリプトを作成します。 github.com
ハマりどころはイメージの更新です。Image Updater はイメージの更新方法として最新のタグを使用する方法やセマンティックバージョニングの一番大きい値を使用する方法などがあります。デフォルトはセマンティックバージョニングを使用します。 argocd-image-updater.readthedocs.io
自分もこのセマンティックバージョニングを使用していたのですが、Invalid Semantic Version
というエラーがどうしても取れませんでした。Image Updater にはタグをフィルタリングする機能もついているのでレジストリから取得されるタグはセマンティックバージョニングにそったものになっているはずです。ドキュメントやコード読んだ結果 Image Updater が最初に更新が必要かの情報を Argo CD から取得する際のタグに invalid なタグが含まれたいたのが原因でした。自分の場合は一部の Job resource でセマンティックバージョニングに沿ってないタグを使用していました。
最後に
Argo CD Image Updater を使用することで今まで各アプリケーションのリポジトリで管理していたスクリプトやトークンを消すことができて、また1つ開発に集中しやすい環境になった気がします。