この記事は kubernetes Advent Calendar 2025 および デジタル創作サークル UniProject Advent Calendar 2025 6 日目の記事です。
こんにちは!
デジタル創作サークル UniProjectを運営している あかつきゆいと です。
当サークルでは、Kubernetes で Discord の管理 Bot やサークルのサイトなど、さまざまなアプリケーションをデプロイしています。
今回は、GitHub から CD できる ArgoCD というものについてのお話です。
ArgoCD ってなぁに?
まず、ArgoCD とは何かという話ですが、Git リポ上のマニュフェストファイルを読み取り、自動的に K8s にデプロイしてくれるものです。
更新にも追従してくれる優れものです。
詳しくは下記リンクをご覧ください。
ArgoCD の課題
ArgoCD は、Git リポジトリ上のマニュフェストファイルを自動的にデプロイしてくれるものです。
が、使用しているイメージのアップデートは追従しないので手動で deployment.yaml などを書き換えてバージョンアップしてやる必要があるのです。
latest運用をしたとて、キャッシュがある以上、手動で Pod を Kill してやる必要があります。
ArgoCD Image Updater という魔術
これを解決するのが、ArgoCD Image Updater です。
これを使うことで、Docker Registry 上のイメージのアップデートをチェックし、Kustomize や Helm 等のパラメータを変更してくれます。
構築する
今回は Helm+ArgoCD でデプロイしていきます。
(ArgoCD のためのものを ArgoCD で管理するという、とても不思議ですね。)
ArgoCD Image Updater は GitHub 上に Helm Chart が公開されています。
そのため、そのリポを指定して ArgoCD の Application としてデプロイします。
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: argocd-image-updater
namespace: argocd
spec:
project: infra
source:
repoURL: https://github.com/argoproj/argo-helm
path: charts/argocd-image-updater
helm:
releaseName: argocd-image-updater
valuesObject:
config:
argocd:
grpcWeb: true
serverAddress: https://argocd-server
insecure: true
destination:
server: https://kubernetes.default.svc
namespace: argocd
syncPolicy:
automated:
prune: true
syncOptions:
- CreateNamespace=true
一つずつ解説していきます。
まず、spec.source.helm.valuesObject.configの中身です。
ここには、主に ArgoCD へ接続するための情報が記載されています。
gRPC は使用するので、grpcWebはtrueに。
また、serverAddressは内部 DNS 解決できるサービス名で構いません。
ただし、ArgoCD 側でしっかりとした TLS の設定をしていない場合、自己証明書が使用されるので、insecureをtrueにする必要があります。
使ってみる
さて、使ってみましょう。
私はこれを v0 の時代から使っていたので、変更点も交えて解説していきます。
ファイルの最終系
最終的にはこのようなファイルになります。
apiVersion: argocd-image-updater.argoproj.io/v1alpha1
kind: ImageUpdater
metadata:
name: unibot
namespace: argocd
spec:
namespace: argocd
applicationRefs:
- namePattern: "unibot"
images:
- alias: "unibot"
imageName: "registry.uniproject.jp/unibot/unibot"
commonUpdateSettings:
updateStrategy: "semver"
- namePattern: "unibot-beta*"
images:
- alias: "unibot"
imageName: "registry.uniproject.jp/unibot/unibot:x.x.x-x"
commonUpdateSettings:
updateStrategy: "semver"
さて、解説していきましょう。
対象となる Application を決める
アップデートしたい ArgoCD Application を決めます。
applicationRefs:
- namePattern: "unibot"
ここでは、unibotと一致する Application を指定しています。
また、unibot-beta*のようにワイルドカードを使うことも可能です。
イメージの情報を入力する
アップデートしたいイメージの情報を入力する。
images:
- alias: "unibot"
imageName: "registry.uniproject.jp/unibot/unibot:x.x.x-x"
commonUpdateSettings:
updateStrategy: "semver"
-
alias- このイメージに名前をつけるためのものです。 -
imageName- そのままの意味です。ただし、semverで更新する場合、例のように x.x.x**-x**としなければ、ベータ版リリースを拾ってくれません。注意しましょう。 -
updateStrategy- 更新戦略です。後述します。
更新戦略の種類
更新方法にはいくつか種類があります。
semver
デフォルトです。-rc1などは先述の通り明示的に許可する必要があります。
また、設定する前から semver に則ったタグで運用されている必要があります。
imageNameに1.x.xなどと書くことで、メジャーバージョンを 1 に固定したりもできます。
newest-build
これは、Docker Image の最終更新日時を見て適切なタグやハッシュダイジェストに書き換えてくれるものです。
digest
これは、newest-buildと似ていますが、こちらは指定されたタグの最新のダイジェストを指定して更新します。
newest-buildはどのタグだろうとお構いなしに取得してくるので、そこが違いですね。
さて、ファイルができたら、後はこれを ArgoCD がデプロイされているのと同じ名前空間に放り込みます。
確認してみる
さて、確認してみましょう。
ArgoCD のダッシュボードから Application の詳細を確認すると、Kustomization のパラメータが変更されて、無事にアップデートが回っていることが確認できます。
これで完了です!
お疲れ様でした!!
最後に
今回は、ArgoCD のお悩みを解決する ArgoCD Image Updater を使ってみました。
宣伝
先にもあるように、当サークルでは、積極的にコンテナ技術を採用しています。
これを読んで「さらに学んでみたい」、「K8s も気になる!」という方、当サークルに参加してみませんか?
当サークルは初心者から上級者まで老若男女誰でも参加できるサークルです。
まずは Discord サーバーへ参加してみてください!
みなさんの参加をお待ちしております!
⭐︎ 公式サイト ↓
⭐︎ Discord サーバー ↓
(おまけ) トラブルシューティング + Tips
ローカルの Docker Registry を指定する
この時、ArgoCD にも Registry の認証情報を伝えてやる必要があります。
こういう時は、Helm の値を変更します。
valuesObject:
config:
argocd:
grpcWeb: true
serverAddress: https://argocd-server
insecure: true
+ registries:
+ - name: harbor
+ api_url: https://registry.uniproject.jp
+ default: false
+ prefix: registry.uniproject.jp
+ credentials: pullsecret:argocd/internal-harbor
こんな感じで追記してやると良いです。
この credential には、手動で作成したシークレットを投げます。
更新されない
ArgoCD に設定しているリポジトリが Directry になってはいませんか?
Helm か Kustomize 以外は対応していませんので、変更してみてください。
