Flux Notification Controller: статус коммита, Telegram и Mattermost

Published: 2026-03-01

Flux поставляется с Notification Controller, который превращает события реконсиляции в вебхуки. Примитива два: Provider (куда отправлять) и Alert (что и когда отправлять).


Провайдеры

Статус коммита в GitLab

Ставит статус пайплайна на коммит, запустивший реконсиляцию Flux. Разработчики видят зелёный или красный бейдж прямо в MR на GitLab:

yamlapiVersion: notification.toolkit.fluxcd.io/v1beta3
kind: Provider
metadata:
  name: gitlab-status
  namespace: flux-system
spec:
  type: gitlab
  address: https://gitlab.example.com
  secretRef:
    name: gitlab-token
---
apiVersion: v1
kind: Secret
metadata:
  name: gitlab-token
  namespace: flux-system
stringData:
  token: "${GITLAB_TOKEN}"

Токену нужен scope api на аккаунте, владеющем репозиторием. Храните в Vault и создавайте Secret через ESO.

Telegram через generic-вебхук

У Flux нет нативного провайдера Telegram, но generic отправляет JSON POST на любой URL:

yamlapiVersion: notification.toolkit.fluxcd.io/v1beta3
kind: Provider
metadata:
  name: telegram
  namespace: flux-system
spec:
  type: generic
  address: http://abot.observability.svc.cluster.local:9444/flux

У abot должен быть эндпоинт /flux, который принимает JSON-событие от Flux и форматирует его в HTML для Telegram.

Или используйте тип провайдера telegram с токеном бота напрямую:

yamlspec:
  type: telegram
  address: https://t.me/bot_token
  channel: "-100123456789"
  secretRef:
    name: telegram-bot-token

Mattermost

yamlapiVersion: notification.toolkit.fluxcd.io/v1beta3
kind: Provider
metadata:
  name: mattermost
  namespace: flux-system
spec:
  type: mattermost
  address: https://chat.example.com/hooks/infra-flux-hook

Алерты

Уведомление об ошибках HelmRelease

yamlapiVersion: notification.toolkit.fluxcd.io/v1beta3
kind: Alert
metadata:
  name: helmrelease-failures
  namespace: flux-system
spec:
  summary: "HelmRelease failed in dev"
  providerRef:
    name: telegram
  eventSeverity: error
  eventSources:
    - kind: HelmRelease
      namespace: dev
      name: "*"

name: "*" — все HelmRelease в неймспейсе dev. eventSeverity: error — только неудачные реконсиляции.

Уведомление о применении Kustomization

yamlapiVersion: notification.toolkit.fluxcd.io/v1beta3
kind: Alert
metadata:
  name: kustomization-applied
  namespace: flux-system
spec:
  summary: "Kustomization applied"
  providerRef:
    name: gitlab-status
  eventSeverity: info
  eventSources:
    - kind: Kustomization
      namespace: "*"
      name: "*"

Создаёт статус коммита в GitLab на каждую реконсиляцию Kustomization. Разработчики прямо из MR видят, какой слой кластера применился.

Уведомление об автообновлении образов

yamlapiVersion: notification.toolkit.fluxcd.io/v1beta3
kind: Alert
metadata:
  name: image-update
  namespace: flux-system
spec:
  summary: "Image auto-update"
  providerRef:
    name: telegram
  eventSeverity: info
  eventSources:
    - kind: ImageUpdateAutomation
      namespace: "*"
      name: "*"

Формат event payload

json{
  "involvedObject": {
    "kind": "HelmRelease",
    "name": "elasticsearch",
    "namespace": "dev"
  },
  "severity": "error",
  "reason": "UpgradeFailed",
  "message": "Helm upgrade failed: rendered manifests contain a resource...",
  "timestamp": "2026-03-01T12:34:56Z"
}

Поле message — полная ошибка Flux, тот же текст, что и в flux get helmreleases.


Организация Alert-ов по кластерам

Все Alert-ы живут в spoke/notifications/ и применяются через Kustomization spoke-кластера. У каждого окружения свои Alert-ы для своего неймспейса — ошибка в dev уходит только в dev-канал.


Отладка

bash# Логи notification controller
kubectl logs -n flux-system deploy/notification-controller -f

# Состояние провайдеров
kubectl get provider -n flux-system

# Детали алерта
kubectl describe alert helmrelease-failures -n flux-system

# Принудительный тест — запустить reconcile
flux reconcile helmrelease my-app -n dev

Если уведомления не приходят, проверьте статус Provider, HTTP-ошибки отправки вебхука в логах контроллера и eventSeverity в Alert.