🚀

ArgoCD Image Updaterを使ってlatest運用をやめた

2024/07/31に公開

はじめに

現在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-methodgitにし、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)で定義されたエンドポイントを叩く際にも用いられています。

差分検知とコミット

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結果を通知する必要もなく非常に快適なフローを構築できると思われます。

参考文献

https://argocd-image-updater.readthedocs.io/en/stable/
https://visionsincode.com/2023/02/11/argo-cd-image-updater-will-make-your-gitops-life-easier-for-your-sitecore-setup-in-kubernetes/
https://techblog.zozo.com/entry/measure-argocd-image-updater

AI Shift Tech Blog

Discussion