ArgoCD Image Updaterを使ってlatest運用をやめた
はじめに
現在ArgoCDでおうちクラスタを管理しているのですが、今回はImage Updaterを用いてContainer Registryの変更に応じてイメージを更新する方法を試します。
また、今回はkustomizeでイメージが管理されていることを前提に、それを書き換えるブランチを作成するところまで実施したいと思います。
Image Updaterとは
ArgoCD Image Updaterは、ArgoCDの拡張ツールであり、各Application単位で使用されているコンテナイメージの更新を監視するためのものです。これはArgoCDの一部として動作するため、RBACやRepositoryのクレデンシャルなど既に構築されているArgoCDの設定を活かし運用することができます。そのため、導入自体は比較的容易に行えますが現在バージョンが1に満たないため、今後破壊的な変更が入る可能性があるため注意が必要です。
また、このツールではHelmかKustomizeで管理されているコンテナイメージが対象となっており、今回はKustomizeで管理されている想定で検証を行います。
構成
今回は上記の図の通り、コンテナイメージが更新された際、変更を検知しイメージタグを書き換えたものを、新たなブランチを作成しプッシュする部分まで設定したいと思います。また、先述の通り今回はKustomizeでイメージが管理されていることが前提のため、Deploymentではなく下記のようなkustomization.yamlにイメージタグが記載されている想定で設定を進めます。
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- manifest.yaml
images:
- name: example.com/hoge/fuga
newTag: v0.0.1
Image Updaterの導入
公式ホームページのGetting Startedに沿ってインストールを進めます。
特にネームスペース等を分けなければ、インストール用のマニフェストをapplyしいくつか設定を行うのみで導入することができます。今回の自分の環境では、追加でRBACの設定を行いました。また、タグを確認する関係で、既にあるContainer RegistryのクレデンシャルにArgoCDがアクセスできる必要があるため、必要に応じて追加で設定します。
(.dockerconfigjsonなどの設定を行なっている場合、そのSecretにアクセスできる必要があります。)
apiVersion: v1
kind: ConfigMap
metadata:
labels:
app.kubernetes.io/name: argocd-rbac-cm
app.kubernetes.io/part-of: argocd
name: argocd-rbac-cm
data:
policy.default: role:readonly
policy.csv: |
...
p, role:image-updater, applications, get, */*, allow
p, role:image-updater, applications, update, */*, allow
g, image-updater, role:image-updater
Applicationの設定
今回はkustomization.yamlに記載してあるイメージタグを書き換えることを目的としているため、write-back-method
をgit
にし、write-back-target
にはkustomization
を指定しています。
これにより、コンテナレジストリのイメージの更新を検知した際イメージタグを書き換えてGitのコミットを積みます。しかし、このままではDefaultブランチに直接コミットが積まれてしまうため、git-branch
でコミットを積むためのブランチを指定します。
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: hoge-application
namespace: argocd
annotations:
# ArgoCD Image Updater
argocd-image-updater.argoproj.io/write-back-method: git:repocreds
argocd-image-updater.argoproj.io/write-back-target: kustomization
argocd-image-updater.argoproj.io/image-list: my-image=ghcr.io/example/hoge
argocd-image-updater.argoproj.io/my-image.update-strategy: newest-build
argocd-image-updater.argoproj.io/my-image.ignore-tags: latest
argocd-image-updater.argoproj.io/my-image.pull-secret: pullsecret:argocd/<container-registry-credential>
argocd-image-updater.argoproj.io/git-branch: master:feature/image-updater{{range .Images}}-{{.Name}}-{{.NewTag}}{{end}}
...
-
write-back-method
今回はgit:repocreds
という形でgit+Repositoryのシークレットを使うように設定しています。
こちらは、Repositoryに関係なく他のシークレットを指定することもできます。
また、今回のように変更をGitに書き込むのではなく、ArgoCD自体でタグの変更を管理したい場合はargocd
を指定することもできます。 -
write-back-target
今回はkustomizationのみを指定していますが、他にディレクトリを指定することもできます。また、kustomizationを指定しなかった場合、管理対象のマニフェストがあるディレクトリに.argocd-source-<appName>.yamlが作成され、その中でイメージの情報が管理されます。 -
image-list
今回はghcr.io/example/hogeのイメージをmy-imageと定義しそこから下のアノテーションで設定を行なっています。-
pull-secret
今回はGHCR(Github Container Registry)を使用しているため、そこからイメージをプルするために使用しているPATなどからなる.dockerconfigjsonを管理しているSecretを指定しています。また、タグ監視のためにOCI(Distribution)で定義されたエンドポイントを叩く際にも用いられています。
-
pull-secret
差分検知とコミット
ArgoCD Image Updaterはデフォルトだと2分間隔でポーリングされており、コンテナレジストリでイメージを更新されるとmaster
をからfeature/image-updater{{range .Images}}-{{.Name}}-{{.NewTag}}{{end}}
のブランチを切りbuild: automatic update of hoge-application
とコミットが積まれます。
Image Updaterではブランチ作成までのため、feature/image-updater*
がプッシュされた際自動でPRを出すようなGithub Actionsを作成することで、自動でPR作成やマージを行うことができます。
まとめ
今回はArgoCD Image Updaterを用いてコンテナレジストリの変更を検知しマニフェストを書き換える部分まで検証を行いました。まだ、実験的な段階のため実環境で使用する場合は注意する必要がありますが、ここまで簡単にArgoCDと統合された状態でイメージタグの書き換えとプッシュを行なってくれるのは非常に魅力的だと感じました。
特に、ArgoCDのベストプラクティスにあるようなコードとマニフェストのリポジトリを分けている場合、コンテナレジストリの変更をトリガーとし書き換えを行うことができるため、頑張ってアプリケーションのCD結果を通知する必要もなく非常に快適なフローを構築できると思われます。
参考文献
Discussion