Отладка Flux reconciliation: полевой справочник

Published: 2026-05-17

Flux декларативен и eventually consistent. Когда реконсиляция не проходит, ошибка всегда видна — нужно просто знать, где смотреть. В этом посте — типичные сценарии отказов и способы быстро их диагностировать.


Быстрый обзор

bash# Посмотреть всё, чем управляет Flux, во всех namespace
flux get all -A

# То же самое, только сбои
flux get all -A | grep -v "True\|Unknown"

Столбец READY показывает True, False или Unknown. False — активная ошибка. Unknown — Flux ожидает (например, зависимость).


Kustomization не готова

bashflux get kustomizations -A
# dev   dev-apps   False   kustomize build failed: ...

Получить полную ошибку:

bashkubectl describe kustomization dev-apps -n dev | tail -30

Ошибка load-restrictor

Файл Kustomize ссылается на что-то за пределами своей директории:

Error: accumulating resources: accumulation err='merging resources from
'../../../base/app': must build at directory

Решение: не использовать пути ../ в resources:. Ссылаться только на директории, содержащие собственный kustomization.yaml.

Отсутствующий CRD

no matches for kind "HelmRelease" in version "helm.toolkit.fluxcd.io/v2"

Решение: добавить dependsOn, чтобы Kustomization ждала чарт, который устанавливает CRD.

Ошибка валидации YAML

error: error validating data: ValidationError(Deployment.spec.template...)

Решение: запустить kubectl kustomize fluxcd/projects/dev/kustomization/hub/ локально, воспроизвести ошибку и исправить манифест.


HelmRelease не готов

bashflux get helmreleases -A
# dev   elasticsearch   False   Helm upgrade failed: ...

Полная ошибка Helm:

bashkubectl describe helmrelease elasticsearch -n dev
# Смотреть Status.Conditions → поле Message

Remediation застряла

Если предыдущий апгрейд упал и Helm оставил релиз в состоянии failed, последующие повторные попытки тоже падают:

bashflux suspend helmrelease elasticsearch -n dev
helm rollback elasticsearch -n dev   # или helm uninstall если rollback невозможен
flux resume helmrelease elasticsearch -n dev

Ошибка рендеринга values

Секрет valuesFrom не существует или содержит неверный ключ:

unable to get values: secret "apm-es-credentials" not found

Решение: проверить статус ExternalSecret и убедиться, что секрет существует в namespace.

Версия чарта не найдена

chart version ">=1.0.0 <2.0.0" not found

Решение:

bashflux reconcile source helm prometheus-community -n flux-system
flux get source helm -A

Source не синхронизируется

bashflux get source git -A
# flux-system   flux-system   False   failed to checkout and determine revision
bashkubectl describe gitrepository flux-system -n flux-system

Типичные причины:

  • SSH-ключ ротирован в GitLab, но не обновлён в секрете flux-system
  • Сетевая проблема: под Flux не может достучаться до GitLab
  • Изменилось имя ветки

Исправление после ротации SSH-ключа:

bashkubectl create secret generic flux-system \
  --from-file=identity=~/.ssh/flux_ed25519 \
  --from-file=identity.pub=~/.ssh/flux_ed25519.pub \
  --from-literal=known_hosts="$(ssh-keyscan github.com)" \
  -n flux-system --dry-run=client -o yaml | kubectl apply -f -

Принудительный reconcile

bash# Форсировать reconcile Kustomization (сначала обновит source)
flux reconcile kustomization dev-apps -n dev --with-source --timeout=5m

# Форсировать reconcile HelmRelease
flux reconcile helmrelease elasticsearch -n dev --timeout=10m

# Форсировать повторное скачивание git source
flux reconcile source git flux-system -n flux-system

--with-source сначала запускает реконсиляцию GitRepository (скачивает из git), затем Kustomization. Без этого флага Flux использует кэшированный source.


Suspend и resume

Нужны, когда требуется вручную изменить что-то, что Flux немедленно перезапишет:

bash# Приостановить реконсиляцию
flux suspend kustomization dev-apps -n dev
flux suspend helmrelease elasticsearch -n dev

# Сделать ручные изменения...
kubectl edit deployment elasticsearch-master -n dev

# Возобновить
flux resume kustomization dev-apps -n dev
flux resume helmrelease elasticsearch -n dev

Без suspend Flux откатит ручные изменения на следующей итерации реконсиляции.


Поток событий

bash# Смотреть события Flux в реальном времени
flux events --watch -A

# Только ошибки реконсиляции через kubectl
kubectl get events -n dev --watch --field-selector reason=ReconciliationFailed

Kustomization flux-system

Это корневая Kustomization, которая бутстрапит всё остальное. Если она падает — реконсиляция останавливается во всех кластерах. Она применяет fluxcd/kustomization.yaml, регистрирующий все environment Kustomizations.

Если добавить файл с синтаксической ошибкой в fluxcd/kustomization.yaml — упадёт вся корневая Kustomization. Всегда тестируйте локально:

bashkubectl kustomize fluxcd/ --dry-run=client

Полезные однострочники

bash# Все HelmRelease, которые не готовы
flux get helmreleases -A | grep -v "True"

# Сводка условий по всем Kustomization
kubectl get kustomization -A -o custom-columns='NAMESPACE:.metadata.namespace,NAME:.metadata.name,READY:.status.conditions[0].status,MSG:.status.conditions[0].message'

# HelmRelease в управлении Kustomization
kubectl get helmrelease -n dev -o yaml | grep "kustomize.toolkit.fluxcd.io/name"