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-*)