Flux Image Update Automation: автоматическое обновление тегов образов в git
Published: 2026-04-12
Flux Image Update Automation отслеживает появление новых тегов образов в container registry, сопоставляет их с политикой (semver, regex) и коммитит обновлённый тег обратно в git. Дальше кластер применяет изменение автоматически — без ручного обновления тегов.
Три объекта
| Объект | Назначение |
|---|---|
ImageRepository |
Где искать образы (registry) |
ImagePolicy |
Какой тег выбирать (semver-диапазон, алфавитный, regex) |
ImageUpdateAutomation |
Когда коммитить обновления и в какую ветку |
ImageRepository
yamlapiVersion: image.toolkit.fluxcd.io/v1beta2
kind: ImageRepository
metadata:
name: abot
namespace: flux-system
spec:
image: registry.example.com/docker/iac/prometheus/abot2
interval: 5m
secretRef:
name: registry-credentials
Flux сканирует registry каждые 5 минут. registry-credentials — Secret с ключом .dockerconfigjson:
bashkubectl create secret docker-registry registry-credentials \
--docker-server=registry.example.com \
--docker-username=ci-reader \
--docker-password=xxx \
-n flux-system
ImagePolicy
Semver-диапазон (самый распространённый вариант):
yamlapiVersion: image.toolkit.fluxcd.io/v1beta2
kind: ImagePolicy
metadata:
name: abot
namespace: flux-system
spec:
imageRepositoryRef:
name: abot
policy:
semver:
range: ">=0.70.0 <1.0.0"
Выбирается старший тег в диапазоне: сегодня это v0.78, после публикации v0.79 выбор переключится на него.
Алфавитный порядок (для реестров без semver):
yamlpolicy:
alphabetical:
order: desc # последний в алфавитном порядке
Regex с извлечением timestamp (CI-образы типа main-1234567890-abc1234):
yamlpolicy:
numerical:
order: asc
filterTags:
pattern: "^main-(?P<ts>[0-9]+)-[a-f0-9]{7}$"
extract: "$ts"
ImageUpdateAutomation
yamlapiVersion: image.toolkit.fluxcd.io/v1beta1
kind: ImageUpdateAutomation
metadata:
name: flux-system
namespace: flux-system
spec:
interval: 10m
sourceRef:
kind: GitRepository
name: flux-system
git:
checkout:
ref:
branch: master
commit:
author:
email: fluxbot@example.com
name: FluxBot
messageTemplate: |
chore: update image {{range .Updated.Images}}{{.}} {{end}}
push:
branch: master
update:
strategy: Setters
path: ./fluxcd
Flux нужен write-доступ к репозиторию. SSH-ключ flux-system GitRepository должен иметь права на push. Добавить публичный ключ как deploy key с правом записи в GitLab/GitHub.
Получить публичный ключ Flux:
bashkubectl get secret flux-system -n flux-system -o jsonpath='{.data.identity\.pub}' | base64 -d
Маркер в HelmRelease
Чтобы Flux знал, какое поле обновлять, тег образа в values HelmRelease нужно пометить маркером:
yamlspec:
values:
image:
repository: registry.example.com/docker/iac/prometheus/abot2
tag: v0.78 # {"$imagepolicy": "flux-system:abot:tag"}
Комментарий {"$imagepolicy": "flux-system:abot:tag"} — маркер. Когда Flux найдёт более новый подходящий тег, заменит v0.78 на новое значение, не трогая остальную часть файла.
Полная ссылка на образ (репозиторий + тег):
yamlimage: registry.example.com/docker/iac/prometheus/abot2:v0.78 # {"$imagepolicy": "flux-system:abot"}
Проверка автоматизации
bash# Статус сканирования и время последнего скана
flux get imagerepositories -A
# Какой тег выбирается каждой политикой
flux get imagepolicies -A
# Последний автоматический коммит
flux get imageupdateautomations -A
Успешная автоматизация отображается как Applied revision: master/abc1234 — SHA коммита Flux в репозитории.
Принудительное сканирование:
bashflux reconcile imagerepository abot -n flux-system
Триггер пайплайна GitLab
Если GitLab CI запускается на push в master, автоматические коммиты будут запускать новый пайплайн. Обычно это желательно — пайплайн валидирует и деплоит новый образ. Если нет, добавить [skip ci] в шаблон сообщения коммита:
yamlmessageTemplate: |
chore: update image {{range .Updated.Images}}{{.}} {{end}} [skip ci]
Меры предосторожности
- Semver-диапазон вместо
:latest— исключить случайные мажорные обновления - Защита ветки
master+ список исключений для deploy key FluxBot - Автоматические коммиты появляются в git log с
chore: update imageи откатываются стандартным способом - Использовать
ImagePolicyсfilterTags.patternдля отслеживания только образов из нужной ветки (например,main-*, но неfeature-*)