ArgoCD Image UpdaterでDeclarativeにイメージ更新する方法を試す

とっても便利な機能を教えてもらったので試しました。

ArgoCD Image Updaterはクラスタで使われているイメージの状態とコンテナレジストリの状態を取得して、 その差分からクラスタのコンテナイメージを書き換えてくれるとっても便利なOSSです。

一方で、Everything in under ArgoCD の環境ではマニフェストがすべてGit管理されており、 Declarativeなイメージの更新を行う動機が存在します。 ということを業務で相談したところ、Kubernetesの専門家が「ArgoCD Image Updaterにそういう機能なかったっけ」と教えてくれました。

調べてみるとwrite-backという機構が存在し、 これを利用することでArgoCD ApplicationのrepoURLで指定されたリポジトリに対し、イメージの更新を行うコミットをしてくれる、というものです。

今回の例は https://github.com/Drumato/blog_samples/tree/main/kubernetes/argocd-image-updater においてあります。

まずは適当に、以下のシェルスクリプトを実行します。

set -eux

function create_cluster() {
  kind create cluster
  kubectl cluster-info --context kind-kind
}

function install_argocd() {
  kubectl create namespace argocd
  kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
}

function install_argocd_image_updater() {
  kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj-labs/argocd-image-updater/stable/manifests/install.yaml
}

create_cluster
install_argocd
install_argocd_image_updater

これで環境は整ったので、 kubectl port-forward でargocd-serverにアクセスして、適当にRepositoryを追加します。 このとき、HTTPSで追加するかSSHで追加するかによって後々作業が異なります。 ここではSSHで作成しておきます。

リポジトリの連携が完了したら、ArgoCD Applicationを作成します。

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  annotations:
    argocd-image-updater.argoproj.io/write-back-method: git:secret:argocd/git-creds
    argocd-image-updater.argoproj.io/image-list: nginx=nginx
    argocd-image-updater.argoproj.io/git-branch: "main:image-updater{{range .Images}}-{{.Name}}-{{.NewTag}}{{end}}"
    argocd-image-updater.argoproj.io/write-back-target: "kustomization:/kubernetes/argocd-image-updater/old-nginx"
  name: old-nginx
  namespace: argocd
spec:
  destination:
    namespace: default
    server: https://kubernetes.default.svc
  project: default
  source:
    path: kubernetes/argocd-image-updater/old-nginx
    repoURL: git@github.com:Drumato/blog_samples
    targetRevision: main
    kustomize:

annotationにargocd-image-updaterの設定をいれるのは、従来のArgoCD Image Updaterと変わらないですが、 write-back-method: git を入れるのが重要です。 また、コミット時に使う認証情報を secret:<namespace>/<name>として指定します。

secret自体は、以下のように作りました。 本当はArgoCD Image Updater用に別途アカウントを発行するのが良いと思います。

kubectl -n argocd create secret generic git-creds --from-file=sshPrivateKey=/home/drumato/.ssh/id_rsa

また、 write-back-target はイメージをどこに書き込むか、またどのように書き込むかという設定です。 デフォルトでは .argocd-source-<app-name>.yaml という名前で新しくファイルが作成され、 ArgoCD Applicationのsourceに書き込める感じで生成されますが、 kustomization を指定すると kustomization.yamlimages に書き込んでくれます。これが非常に便利。

そしたら kubectl apply -f application.yaml してみます。 リポジトリを見に行くと、なんかブランチが生えています。

例としてPR作ってみたので、こちらを見ていただけると雰囲気がつかめると思います。 https://github.com/Drumato/blog_samples/pull/1

https://github.com/Drumato/drumato.comv2/assets/41734896/8b391fa4-4b8f-4748-87c0-7c1bfca0d8da

ということで、なんかめちゃくちゃ簡単にできてしまいました。すごい。