Flux Image Automation でイメージの更新を自動化する
新しいコンテナイメージのタグを Flux に検出させ、Git に commit させます。
ほとんどの GitOps 構成では、CI パイプラインがイメージをビルドし、新しいタグを設定リポジトリに commit します。Flux には代替手段があります。2 つのオプションのコントローラーが、コンテナレジストリを監視し、ルールに一致する最新のタグを選び、その変更を自分で Git に commit します。クラスターは、Git の commit によってのみ変更されるため、監査証跡は保たれます。このガイドでは、公開されている podinfo イメージを使います。
部品の組み合わせ方
3 つのリソースが連携して動作します。
ImageRepositoryは、レジストリをスキャンして、1 つのイメージのタグを調べます。ImagePolicyは、そのリストから 1 つのタグを選びます。たとえば、範囲内で最も高い semantic version です。ImageUpdateAutomationは、マーカーが指示する Git リポジトリ内の YAML を編集し、commit して push します。
3 つとも image.toolkit.fluxcd.io/v1 API を使います。古い v1beta2 バージョンは Flux 2.9 で CRD から削除されたため、アップグレードの前に、古いマニフェストを移行してください。
追加のコントローラーをインストールする
イメージのコントローラーは、デフォルトのインストールには含まれません。それらを追加して、もう一度 bootstrap し、Flux がリポジトリに push できるようにします。
flux bootstrap github \
--owner=<your-github-user> \
--repository=fleet-infra \
--branch=main \
--path=clusters/dev \
--personal \
--components-extra=image-reflector-controller,image-automation-controller \
--read-write-key
bootstrap は繰り返しても安全です。新しいコントローラーのマニフェストを commit してインストールします。--read-write-key は、自動化が push できるように、deploy key を書き込み可能にします。kubectl get pods -n flux-system で確認します。
レジストリをスキャンする
apps/podinfo/image-repository.yaml(Deployment と同じフォルダー):
apiVersion: image.toolkit.fluxcd.io/v1
kind: ImageRepository
metadata:
name: podinfo
namespace: flux-system
spec:
image: ghcr.io/stefanprodan/podinfo
interval: 5m
プライベートレジストリの場合は、Docker レジストリの secret(kubectl create secret docker-registry または flux create secret oci で作成)を指す secretRef を追加します。
ポリシーでタグを選ぶ
apiVersion: image.toolkit.fluxcd.io/v1
kind: ImagePolicy
metadata:
name: podinfo
namespace: flux-system
spec:
imageRepositoryRef:
name: podinfo
policy:
semver:
range: 6.x
range: 6.x の semver は、最も高い 6.x のバージョンを選びます。他のポリシータイプには、numerical(最も高い数値)と alphabetical があり、ビルド番号や日付のようなタグに適しています。タグ名に基づくルールには、ポリシーに正規表現の filterTags を追加します。
更新する行にマークを付ける
Flux は、コメントでマークを付けた行を正確に更新します。apps/podinfo/deployment.yaml で:
spec:
containers:
- name: podinfo
image: ghcr.io/stefanprodan/podinfo:6.5.0 # {"$imagepolicy": "flux-system:podinfo"}
マーカーは namespace:policy-name です。デフォルトでは、イメージ参照全体が置き換えられます。タグだけを更新するには、{"$imagepolicy": "flux-system:podinfo:tag"} を使います。Helm の values や Kustomize の images のエントリでは、タグを保持する行に同じマーカーが使えます。マーカーのないものは、そのままにされます。
commit の方法を Flux に伝える
apiVersion: image.toolkit.fluxcd.io/v1
kind: ImageUpdateAutomation
metadata:
name: flux-system
namespace: flux-system
spec:
interval: 30m
sourceRef:
kind: GitRepository
name: flux-system
git:
checkout:
ref:
branch: main
commit:
author:
name: fluxcdbot
email: fluxcdbot@users.noreply.github.com
messageTemplate: |
Automated image update
{{range .Changed.Changes}}
- {{.OldValue}} -> {{.NewValue}}
{{end}}
push:
branch: main
update:
path: ./apps
strategy: Setters
重要なポイントは次のとおりです。
sourceRefは、commit 先の Git リポジトリです。書き込み可能である必要があり、そのために--read-write-keyがあります。checkout.ref.branchは開始元のブランチで、push.branchは commit の送り先です。update.pathは、マーカーを探してスキャンするフォルダーを制限します。messageTemplateは、履歴が読みやすくなるように、commit メッセージを制御します。
main に直接 push すると、すべてが完全に自動になります。信頼を築いている間は、代わりに別のブランチに push し(たとえば push.branch: flux-image-updates)、納得したらプルリクエストをマージします。変更は、マージの後にはじめてクラスターに届きます。
動作を確認する
これらのファイルを commit して push し、各段階を確認します。
flux get image repository
flux get image policy
flux get image update
repository はスキャンされたタグの数を、policy は選択したタグを、update automation は最後に push した commit を示します。選択されたタグが YAML のものより新しければ、Git に commit が現れ、Flux は他の変更と同じようにそれを適用します。デバッグするには、各オブジェクトに kubectl describe を使います。間違ったマーカー、何にも一致しないポリシーの範囲、読み取り専用の deploy key が、よくある原因です。
どの方法を選ぶか
1 つのパイプラインがすでにプロモーションを担っており、何をリリースするかを決める場所を 1 つにしたい場合は、CI 主導の commit を使います。クラスターの設定リポジトリに、レジストリを自動的に追従させたい場合、たとえば dev 環境を最新のパッチリリースに保つには、Flux のイメージ自動化を使います。両者は共存できます。
人気のガイド
-
Push と Pull:Flux が Kubernetes にデリバリーする仕組み Git 主導の pull 型デリバリーが、デプロイ、セキュリティ、復旧の方法をどう変えるか。 -
GitRepository と Kustomization で最初のアプリケーションをデプロイする Kustomization リソースを使って Flux を Git のマニフェストに向け、同期の様子を確認します。 -
同期動作を制御する:間隔、prune、ドリフトの修正、ロールバック Flux がいつ変更を適用するか、何を削除するか、どう一時停止するか、失敗したデプロイをどう元に戻すかを決めます。 -
Flux でマルチクラスターを構成する 共有インフラとクラスターごとの違いを持たせて、1 つのリポジトリから複数のクラスターを管理します。 -
Flux CD と Argo CD:GitOps ツールの選び方 アーキテクチャ、UI、Helm、シークレット、テナンシー、イメージの自動化を比較して、適切なツールを選びます。