От Flux CLI к Flux Operator и Status Page

от автора

Flux CD — это набор инструментов для GitOps в Kubernetes. Он следит за Git-репозиторием и автоматически приводит состояние кластера в соответствие с описанными в нём манифестами и Helm-чартами. Flux работает как контроллер внутри кластера: подтягивает изменения из Git, применяет их через Kubernetes API и отслеживает статус каждого ресурса. Проект является graduated-проектом CNCF.

Когда вы впервые поднимаете GitOps в Kubernetes, Flux CD кажется достаточным: flux bootstrap, манифесты в Git, контроллеры тянут состояние кластера.

Но лучше перейти на Flux Operator:

  • Декларативный дистрибутив — версия, реестр образов и состав контроллеров в FluxInstance вместо ручного сопровождения манифестов gotk-components.

  • Единая синхронизация с Git — FluxInstance.spec.sync вместо разрозненной ручной сборки нескольких объектов.

  • Обновления и откат через Git — с тем же аудитом и ревью, что и для приложений.

  • Наблюдаемость — отчёты, метрики и Status Page, не только flux get в CLI.

  • Привычный GitOps — GitRepositoryKustomizationHelmRelease остаются; меняется способ установки и жизненного цикла самого Flux.

Здесь зафиксирован путь от классического bootstrap к Flux Operator (FluxInstance) и FluxCD Status Page.

Часть 1. Классический Flux: bootstrap и приложения

Предварительные условия

  • Чистый кластер Kubernetes.

  • Flux CLI — Installing the Flux CLI. Проверка: flux version --client.

  • Доступ к Git-репозиторию для flux bootstrap; при необходимости — PAT (см. ниже).

GitHub Personal Access Token для bootstrap

Для flux bootstrap github токен передаётся через GITHUB_TOKEN или вводится в интерактиве.

Создание PAT (Fine-grained token)

Создание PAT (Fine-grained token)
  1. GitHub → Fine-grained tokens.

  2. Repository access — только нужный репозиторий (например fluxcd-operator-and-status-page).

  3. Permissions: Contents — Read and write; Metadata — Read-only; Administration — Read-only.

С флагом --token-auth Flux сохраняет PAT в Secret в кластере; для PAT достаточно Administration → Read-only.

Команда bootstrap

Запустите bootstrap из любой машины с установленным Flux CLI и доступом к кластеру. Команда создаст в репозитории директорию base/flux-system/ с манифестами контроллеров (gotk-components.yaml) и синхронизации (gotk-sync.yaml), а также закоммитит их в ветку main.

flux bootstrap github \  --token-auth \  --owner=patsevanton \  --repository=fluxcd-operator-and-status-page \  --branch=main \  --path=base

Фрагмент типичного вывода:

Please enter your GitHub personal access token (PAT):► connecting to github.com► cloning branch "main" from Git repository "https://github.com/patsevanton/fluxcd-operator-and-status-page.git"✔ cloned repository...✔ all components are healthy

После bootstrap обновите локальную копию репозитория, чтобы подтянуть созданные файлы:

git pull

Проверка после bootstrap

Flux уже синхронизирует ваши приложения. Показать состояние всех ресурсов FluxCD:

flux get all -A

Команда ниже фильтрует вывод, оставляя только ресурсы с проблемами. Видно, что broken-demo сломан — он нужен для тестирования алертов FluxCD:

flux get all -A | grep -v "succeeded" | grep -v Applied | grep -v pulled | grep -v "stored artifact" | grep -v ReadyNAMESPACE  NAME                     REVISION          SUSPENDEDREADYMESSAGE                                           NAMESPACE  NAME                               REVISION       SUSPENDEDREADYMESSAGE                                     NAMESPACE  NAME                                          REVISIONSUSPENDEDREADYMESSAGE                                                         NAMESPACE  NAME                                REVISIONSUSPENDEDREADYMESSAGE                                                                                                               NAMESPACE  NAME                          REVISION          SUSPENDEDREADYMESSAGE                                                                                                                                                                                                                                                                                                                                                                                                                 flux-systemkustomization/broken-demo                       False    FalseHelmRelease/broken-demo/broken-demo dry-run failed (Invalid): HelmRelease.helm.toolkit.fluxcd.io "broken-demo" is invalid: [spec.chart.spec.sourceRef.kind: Unsupported value: "OCIRepository": supported values: "HelmRepository", "GitRepository", "Bucket", <nil>: Invalid value: "null": some validation rules were not checked because the object was invalid; correct the existing errors to complete validation]                                                                        Namespace/broken-demo created                      

Проверить HelmReleases отдельно:

flux get helmreleases -n flux-systemNAME                    REVISIONSUSPENDEDREADYMESSAGE                                                                                                               prometheus-operator-crds28.0.1  False    True Helm install succeeded for release flux-system/prometheus-operator-crds.v1 with chart prometheus-operator-crds@28.0.1vmks                    0.74.1  False    True Helm upgrade succeeded for release vmks/vmks.v2 with chart victoria-metrics-k8s-stack@0.74.1  

Проверить Kustomization’ы:

flux get kustomizations -ANAMESPACE  NAME            REVISION          SUSPENDEDREADYMESSAGE                                                                                                                                       flux-systembroken-demo                       False    FalseHelmRelease/broken-demo/broken-demo dry-run failed (Invalid): HelmRelease.helm.toolkit.fluxcd.io "broken-demo" is invalid: [spec.chart.spec.sourceRef.kind: Unsupported value: "OCIRepository": supported values: "HelmRepository", "GitRepository", "Bucket", <nil>: Invalid value: "null": some validation rules were not checked because the object was invalid; correct the existing errors to complete validation]                                                                           flux-systemflux-system     main@sha1:05119ed0False    True Applied revision: main@sha1:05119ed0                                                                                                               flux-systemprometheus-crds main@sha1:05119ed0False    True Applied revision: main@sha1:05119ed0                                                                                                               flux-systemvictoria-metricsmain@sha1:05119ed0False    True Applied revision: main@sha1:05119ed0    

Часть 2. Переход на Flux Operator

Установка Flux Operator

Для установки Flux Operator выполните шаги ниже вручную из корня репозитория.

Создайте директорию для манифестов оператора:

mkdir -p apps/flux-operator

Добавьте Kustomization для flux-operator в конец файла base/apps.yaml (существующие записи victoria-metricsbroken-demoprometheus-crds останутся на месте):

cat <<'EOF' >> base/apps.yaml---apiVersion: kustomize.toolkit.fluxcd.io/v1kind: Kustomizationmetadata:  name: flux-operator  namespace: flux-systemspec:  interval: 10m  sourceRef:    kind: GitRepository    name: flux-system  serviceAccountName: kustomize-controller  path: ./apps/flux-operator  prune: true  wait: true  timeout: 10mEOF

Создайте HelmRepository для OCI-чарта ControlPlane:

cat <<'EOF' > apps/flux-operator/sources.yamlapiVersion: source.toolkit.fluxcd.io/v1kind: HelmRepositorymetadata:  name: cp-flux-operator  namespace: flux-systemspec:  interval: 24h  type: oci  url: oci://ghcr.io/controlplaneio-fluxcd/chartsEOF

Создайте HelmRelease оператора. Обратите внимание на секцию web — она включает Status Page и настраивает Ingress:

cat <<'EOF' > apps/flux-operator/helmrelease.yamlapiVersion: helm.toolkit.fluxcd.io/v2kind: HelmReleasemetadata:  name: flux-operator  namespace: flux-systemspec:  interval: 30m  timeout: 10m  chart:    spec:      chart: flux-operator      version: "0.47.0"      sourceRef:        kind: HelmRepository        name: cp-flux-operator        namespace: flux-system      interval: 30m  releaseName: flux-operator  values:    web:      enabled: true      config:        baseURL: http://flux.apatsev.org.ru/      ingress:        enabled: true        className: nginx        hosts:          - host: flux.apatsev.org.ru            paths:              - path: /                pathType: PrefixEOF

Закоммитьте изменения и отправьте в удалённый репозиторий:

git add .git commit -m "Add flux-operator manifests"git push

Дождитесь, пока Flux синхронизирует новую Kustomization и установит оператор:

flux get kustomizations -n flux-system | grep flux-operatorflux-operator   main@sha1:e23386eaFalse    True Applied revision: main@sha1:e23386ea

Проверить, что HelmRelease оператора установлен:

flux get helmreleases -n flux-system | grep flux-operatorflux-operator           0.47.0  False    True Helm install succeeded for release flux-system/flux-operator.v1 with chart flux-operator@0.47.0                 

Создание FluxInstance

После установки Flux Operator файл base/flux-system/kustomization.yaml (созданный flux bootstrap) продолжает ссылаться на gotk-components.yaml и gotk-sync.yaml, поэтому Flux всё ещё управляется классическим bootstrap.

Чтобы перейти на управление через оператор, создайте FluxInstance. Этот ресурс описывает оператору, какую версию Flux развернуть, какие контроллеры включить и с какого Git-репозитория синхронизировать манифесты.

Важно понимать порядок переключения: сначала создаётся FluxInstance, оператор берёт управление Flux на себя, и только затем удаляются старые файлы bootstrap. Попытка удалить gotk-* до создания FluxInstance приведёт к потере управления кластером.

Создайте файл FluxInstance:

mkdir -p base/flux-systemcat <<'EOF' > base/flux-system/flux-instance.yamlapiVersion: fluxcd.controlplane.io/v1kind: FluxInstancemetadata:  name: flux  namespace: flux-systemspec:  distribution:    version: "2.8.x"    registry: "ghcr.io/fluxcd"  components:    - source-controller    - kustomize-controller    - helm-controller    - notification-controller  sync:    kind: GitRepository    url: "https://github.com/patsevanton/fluxcd-operator-and-status-page.git"    ref: "refs/heads/main"    path: "./base"EOF

Примените FluxInstance напрямую через kubectl, чтобы оператор сразу начал управлять Flux:

kubectl apply -f base/flux-system/flux-instance.yaml

После применения FluxInstance оператор начинает управлять жизненным циклом Flux: создаёт контроллеры, настраивает синхронизацию и выпускает FluxReport.

Проверка миграции

Проверить статус FluxInstance:

kubectl -n flux-system get fluxinstance fluxNAME   AGE     READY   STATUS                           REVISIONflux   2m21s   True    Reconciliation finished in 19s   v2.8.5@sha256:df269637e1cbd79f25263d77f754ec782afb780ad197f4732771f661ceb73f3f

Убедиться, что контроллеры запущены (включая оператор):

kubectl -n flux-system get podsNAME                                       READY   STATUS    RESTARTS   AGEflux-operator-64bbc44d7c-v87fj             1/1     Running   0          40mhelm-controller-65ff4c7c98-fvjg9           1/1     Running   0          2m20skustomize-controller-59fc467858-mhsbz      1/1     Running   0          2m20snotification-controller-6d66bb7797-7wp5r   1/1     Running   0          2m20ssource-controller-7846484bbc-6rfg5         1/1     Running   0          2m19s

Очистка репозитория после миграции

Полный переход на Flux Operator фиксируется удалением файлов классического bootstrap и обновлением base/flux-system/kustomization.yaml так, чтобы он ссылался только на flux-instance.yaml.

Подробнее: Flux Bootstrap Migration.

Удалите артефакты классического bootstrap:

rm base/flux-system/gotk-components.yamlrm base/flux-system/gotk-sync.yaml

Пересоздайте base/flux-system/kustomization.yaml, чтобы он включал только flux-instance.yaml:

cat <<'EOF' > base/flux-system/kustomization.yamlapiVersion: kustomize.config.k8s.io/v1beta1kind: Kustomizationresources:- flux-instance.yamlEOF

Добавьте все изменения в индекс:

git add .

Закоммитьте и отправьте в удалённый репозиторий:

git commit -m "Moved Flux resources"git push

Часть 3. FluxCD Status Page

После установки Flux Operator в игру входят FluxReport, события по FluxInstance и метрики Prometheus.

Демо-интерфейс: http://flux.apatsev.org.ru/.

Скриншоты

Главная страница — верхний блок (overview)

Сводка состояния Flux компонентов на главной странице.

FluxCD Status Page — главная страница (overview)

FluxCD Status Page — главная страница (overview)

Главная страница — блок Flux Reconcilers

Статусы контроллеров и reconciler-ов Flux.

FluxCD Status Page — главная страница (Flux Reconcilers)

FluxCD Status Page — главная страница (Flux Reconcilers)

Resources — failed state

Пример экрана с ошибками в ресурсах.

FluxCD Status Page — resources (failed)

FluxCD Status Page — resources (failed)

Events — список событий Flux

Экран с лентой событий Flux и фильтрами по namespace, kind и severity.

FluxCD Status Page — events

FluxCD Status Page — events

FluxReport

Ресурс FluxReport flux в flux-system (обновление по умолчанию раз в 5 минут):

kubectl -n flux-system get fluxreport flux -o yaml

Пример вывода (фрагмент):

apiVersion: fluxcd.controlplane.io/v1kind: FluxReportmetadata:  annotations:    reconcile.fluxcd.io/requestedAt: "1777814067"  creationTimestamp: "2026-05-03T12:18:48Z"  generation: 7  name: flux  namespace: flux-system  resourceVersion: "46482"  uid: fe113d16-e144-433b-a666-53a94a042b5cspec:  cluster:    nodes: 3    platform: linux/amd64    serverVersion: v1.32.1  components:  - image: ghcr.io/fluxcd/helm-controller:v1.5.3@sha256:b150af0cd7a501dafe2374b1d22c39abf0572465df4fa1fb99b37927b0d95d75    name: helm-controller    ready: true

Flux Report API.

События

Посмотреть события, связанные с FluxInstance:

kubectl -n flux-system get events --for fluxinstance/fluxLAST SEEN   TYPE     REASON                    OBJECT              MESSAGE43m         Normal   ReconciliationSucceeded   FluxInstance/flux   Reconciliation finished in 2s

Уведомления (Slack, Teams и др.) можно настроить через notification-controller и CRD Provider/Alert. Подробнее: Provider/Alert.

Уведомления Flux в Alertmanager

Создайте директорию для ресурсов Flux:

mkdir -p apps/flux-resources

Создайте файл с Provider и Alert для пересылки событий Flux в Alertmanager:

cat <<'EOF' > apps/flux-resources/flux-notifications.yaml# Flux notification-controller → Prometheus Alertmanager (VMAlertmanager из victoria-metrics-k8s-stack).# События с severity error попадают в Alertmanager; Grafana их видит через datasource Alertmanager.---apiVersion: notification.toolkit.fluxcd.io/v1beta3kind: Providermetadata:  name: alertmanager  namespace: flux-systemspec:  type: alertmanager  # VMAlertmanager CR: vmks-victoria-metrics-k8s-stack (release vmks, chart victoria-metrics-k8s-stack), ns vmks  address: http://vmalertmanager-vmks-victoria-metrics-k8s-stack.vmks.svc.cluster.local:9093/api/v2/alerts---apiVersion: notification.toolkit.fluxcd.io/v1beta3kind: Alertmetadata:  name: flux-to-alertmanager  namespace: flux-systemspec:  providerRef:    name: alertmanager  eventSeverity: error  eventSources:    - kind: GitRepository      name: "*"    - kind: OCIRepository      name: "*"    - kind: HelmRepository      name: "*"    - kind: HelmChart      name: "*"    - kind: HelmRelease      name: "*"    - kind: Kustomization      name: "*"EOF

Добавьте Kustomization для flux-resources в base/apps.yaml:

cat <<'EOF' >> base/apps.yaml---apiVersion: kustomize.toolkit.fluxcd.io/v1kind: Kustomizationmetadata:  name: flux-resources  namespace: flux-systemspec:  interval: 10m  sourceRef:    kind: GitRepository    name: flux-system  serviceAccountName: kustomize-controller  path: ./apps/flux-resources  prune: true  wait: true  timeout: 5mEOF

Создайте kustomization.yaml для явного перечисления ресурсов в директории:

cat <<'EOF' > apps/flux-resources/kustomization.yamlapiVersion: kustomize.config.k8s.io/v1beta1kind: Kustomizationresources:- flux-notifications.yamlEOF

Закоммитьте изменения и отправьте в удалённый репозиторий:

git add .git commit -m "Add Flux Alertmanager notifications"git push

Манифест создаёт в flux-system:

  • Provider alertmanager — тип alertmanager, адрес HTTP API VMAlertmanager из VictoriaMetrics K8s Stack (в манифесте задан сервис релиза vmks-victoria-metrics-k8s-stack в namespace vmks).

  • Alert flux-to-alertmanager — события с severity error от перечисленных источников (GitRepositoryOCIRepositoryHelmRepositoryHelmChartHelmReleaseKustomization) отправляются в этот провайдер.

Нужны работающие notification-controller (в FluxInstance он в spec.components) и VMAlertmanager по адресу из Provider.spec.address, иначе доставка алертов не состоится.

Проверка, что манифест применился

Убедитесь, что корневая синхронизация подтянула ревизию с этим файлом:

flux get kustomizations -n flux-system flux-system

Проверить, что объект Provider создан:

kubectl get providers.notification.toolkit.fluxcd.io -n flux-systemNAME           AGEalertmanager   23s

Проверить, что объект Alert создан:

kubectl get alerts.notification.toolkit.fluxcd.io -n flux-systemNAME                   AGEflux-to-alertmanager   29s

Детали и статус объекта Provider:

kubectl -n flux-system get provider alertmanager -o yamlapiVersion: notification.toolkit.fluxcd.io/v1beta3kind: Providermetadata:  creationTimestamp: "2026-05-03T14:09:46Z"  finalizers:  - finalizers.fluxcd.io  generation: 1  labels:    kustomize.toolkit.fluxcd.io/name: flux-resources    kustomize.toolkit.fluxcd.io/namespace: flux-system  name: alertmanager  namespace: flux-system  resourceVersion: "52687"  uid: 311becb0-ea11-454f-859b-0f76585bbbc0spec:  address: http://vmalertmanager-vmks-victoria-metrics-k8s-stack.vmks.svc.cluster.local:9093/api/v2/alerts  type: alertmanager

Детали и статус объекта Alert:

kubectl -n flux-system get alert flux-to-alertmanager -o yamlapiVersion: notification.toolkit.fluxcd.io/v1beta3kind: Alertmetadata:  creationTimestamp: "2026-05-03T14:09:46Z"  generation: 1  labels:    kustomize.toolkit.fluxcd.io/name: flux-resources    kustomize.toolkit.fluxcd.io/namespace: flux-system  name: flux-to-alertmanager  namespace: flux-system  resourceVersion: "52685"  uid: c49e6233-63f0-499e-8293-db2be1838c5fspec:  eventSeverity: error  eventSources:  - kind: GitRepository    name: '*'  - kind: OCIRepository    name: '*'  - kind: HelmRepository    name: '*'  - kind: HelmChart    name: '*'  - kind: HelmRelease    name: '*'  - kind: Kustomization    name: '*'  providerRef:    name: alertmanager

Локально проверить, что объекты попадают в сборку kustomize:

kubectl kustomize apps/flux-resources | grep -E 'kind: (Provider|Alert)|name: (alertmanager|flux-to-alertmanager)'kind: Alert  name: flux-to-alertmanager    name: alertmanagerkind: Provider  name: alertmanager

Метрики

Контроллеры Flux экспонируют Prometheus-совместимые метрики на порту http-prom — счётчики и гистограммы реконсиляций, задержек обработки артефактов, очередей и ошибок. Без сбора этих метрик невозможно:

  • визуализировать здоровье контроллеров и длину очередей реконсиляции в Grafana,

  • строить алерты на рост длительности реконсиляции или частоту ошибок (см. Alertmanager выше),

  • отслеживать тренды использования ресурсов и планировать масштабирование.

PodMonitor — ресурс Prometheus Operator (CRD monitoring.coreos.com/v1), который говорит vmagent / Prometheus, какие поды скрейпить и на каком порту. В отличие от ServiceMonitor, PodMonitor выбирает поды напрямую по лейблам — удобно, когда у контроллеров нет отдельного Service с нужными портами.

Создайте PodMonitor для сбора метрик со всех Flux-контроллеров:

cat <<'EOF' > apps/flux-resources/podmonitor.yamlapiVersion: monitoring.coreos.com/v1kind: PodMonitormetadata:  name: flux-system  namespace: flux-system  labels:    app.kubernetes.io/part-of: flux    app.kubernetes.io/component: monitoringspec:  namespaceSelector:    matchNames:      - flux-system  selector:    matchExpressions:      - key: app        operator: In        values:          - helm-controller          - source-controller          - kustomize-controller          - notification-controller          - image-automation-controller          - image-reflector-controller  podMetricsEndpoints:    - port: http-promEOF

Обновите apps/flux-resources/kustomization.yaml, чтобы подключить оба ресурса:

cat <<'EOF' > apps/flux-resources/kustomization.yamlapiVersion: kustomize.config.k8s.io/v1beta1kind: Kustomizationresources:- flux-notifications.yaml- podmonitor.yamlEOF

Закоммитьте изменения и отправьте в удалённый репозиторий:

git add .git commit -m "Added PodMonitor for Flux"git push

Проверка PodMonitor и метрик

Убедитесь, что Kustomization flux-resources подтянула ревизию с podmonitor.yaml:

flux get kustomizations -n flux-system flux-resourcesNAME          REVISION                     SUSPENDEDREADYMESSAGE                                         flux-resourcesrefs/heads/main@sha1:429293c9False    True Applied revision: refs/heads/main@sha1:429293c9

Посмотреть события Kustomization (в стандартном flux нет подкоманды describe):

kubectl get events -n flux-system --field-selector involvedObject.name=flux-resources --sort-by='.lastTimestamp'LAST SEEN   TYPE     REASON                    OBJECT                         MESSAGE5m46s       Normal   Progressing               kustomization/flux-resources   Alert/flux-system/flux-to-alertmanager created...5m46s       Normal   Progressing               kustomization/flux-resources   Health check passed in 32.876003ms5m46s       Normal   ReconciliationSucceeded   kustomization/flux-resources   Reconciliation finished in 204.558291ms, next run in 10m0s101s        Normal   ReconciliationSucceeded   kustomization/flux-resources   Reconciliation finished in 241.056785ms, next run in 10m0s38s         Normal   Progressing               kustomization/flux-resources   PodMonitor/flux-system/flux-system created38s         Normal   Progressing               kustomization/flux-resources   Health check passed in 100.046212ms37s         Normal   ReconciliationSucceeded   kustomization/flux-resources   Reconciliation finished in 334.747203ms, next run in 10m0s

Проверить объект PodMonitor в кластере. Ресурс должен быть в namespace flux-system — без metadata.namespace Flux при применении выдаст ошибку PodMonitor/... namespace not specified:

kubectl get podmonitor -n flux-systemNAME          AGEflux-system   84s

Детали объекта:

kubectl describe podmonitor flux-system -n flux-systemName:         flux-systemNamespace:    flux-systemLabels:       app.kubernetes.io/component=monitoring              app.kubernetes.io/part-of=flux              kustomize.toolkit.fluxcd.io/name=flux-resources              kustomize.toolkit.fluxcd.io/namespace=flux-systemAnnotations:  <none>API Version:  monitoring.coreos.com/v1Kind:         PodMonitorMetadata:  Creation Timestamp:  2026-05-03T14:14:54Z  Generation:          1  Resource Version:    54801  UID:                 601a63ec-4b61-4349-9096-ffc38fdc7b33Spec:  Namespace Selector:    Match Names:      flux-system  Pod Metrics Endpoints:    Port:  http-prom  Selector:    Match Expressions:      Key:       app      Operator:  In      Values:        helm-controller        source-controller        kustomize-controller        notification-controller        image-automation-controller        image-reflector-controllerEvents:  <none>

Локально проверить, что PodMonitor попадает в сборку kustomize:

kubectl kustomize apps/flux-resources | grep -E 'kind: PodMonitor|name: flux-system|namespace: flux-system|http-prom'kind: PodMonitor  name: flux-system  namespace: flux-system  - port: http-prom  namespace: flux-system  namespace: flux-system

Поды Flux в flux-system и порт метрик http-prom:

kubectl get pods -n flux-system -l 'app in (helm-controller,source-controller,kustomize-controller,notification-controller,image-automation-controller,image-reflector-controller)' -o wideNAME                                       READY   STATUS    RESTARTS   AGE    IP              NODE                        NOMINATED NODE   READINESS GATEShelm-controller-65ff4c7c98-sgtg7           1/1     Running   0          118m   10.112.130.12   cl1lo7src0ijsb1bv4i6-ehuw   <none>           <none>kustomize-controller-59fc467858-c8phv      1/1     Running   0          118m   10.112.129.11   cl1lo7src0ijsb1bv4i6-oban   <none>           <none>notification-controller-6d66bb7797-2rm5f   1/1     Running   0          118m   10.112.130.13   cl1lo7src0ijsb1bv4i6-ehuw   <none>           <none>source-controller-7846484bbc-j88ww         1/1     Running   0          118m   10.112.129.12   cl1lo7src0ijsb1bv4i6-oban   <none>           <none>

Проверить, что контроллеры экспонируют порт http-prom:

kubectl get pods -n flux-system -l app=source-controller -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{range .spec.containers[*].ports[*]}{.name}{" "}{end}{"\n"}{end}'source-controller-7846484bbc-j88wwhttp http-prom healthz 

Если в кластере VictoriaMetrics K8s Stack или другой сборщик с UI, проверьте активные таргеты и наличие метрик от подов flux-system (например в Grafana Explore).

Для Prometheus Operator: serviceMonitor.create=true в values. Подробнее: Flux Monitoring and Reporting.

Устранение неполадок

Симптом

Что проверить

GitRepository / Kustomization не Ready

flux get sources git -Akubectl describe gitrepository -n flux-system, сеть и права PAT / deploy key

HelmRelease завис

flux get helmreleases -A, логи helm-controller, значения в HelmRelease

После миграции не применяется base/

В FluxInstance.spec.sync.path должно быть ./base, если манифесты лежат под base/

Нет метрик Flux-контроллеров

Проверьте, что поды экспонируют порт http-prom; PodMonitor должен быть в flux-system и указывать на этот порт

Status Page не открывается

Проверьте Ingress и web.enabled: true / web.config.baseURL в values HelmRelease оператора

Метрики и Grafana

VictoriaMetrics K8s Stack поднимает Grafana вместе с vmagent, VMSingle и правилами алертинга.

Веб-доступ: в этом репозитории для Grafana включён Ingress — http://grafana.apatsev.org.ru (см. apps/victoria-metrics/helmrelease.yaml).

Получить пароль администратора Grafana:

kubectl get secret vmks-grafana -n vmks -o jsonpath='{.data.admin-password}' | base64 --decode; echo

Установка FluxCD dashboard в Grafana

Исходные дашборды взяты из официального репозитория flux2-monitoring-example и Grafana Dashboard ID 16714 (Flux2), адаптированы и переработаны для корректной работы с Flux 2.8+ и текущим стеком наблюдаемости.

Если метрики Flux уже собираются (через PodMonitor), дашборды начнут показывать данные сразу после импорта.

Дашборд

Описание

JSON

Flux2

Основной дашборд для мониторинга ресурсов FluxCD (Kustomization, HelmRelease, GitRepository и др.). Адаптирован для Flux 2.8+: заменён deprecated gotk_reconcile_condition на gotk_resource_info из kube-state-metrics.

dashboard/flux2.json

Flux Cluster Stats

Кластерная статистика Flux: распределение ресурсов по namespace, типам и статусам.

dashboard/cluster.json

Flux Control Plane

Метрики control plane Flux: реконсиляции контроллеров, длительность операций, очереди и ошибки.

dashboard/control-plane.json

Скриншоты Grafana

Flux2 Dashboard

JSON: dashboard/flux2.json

Grafana — Flux2 Dashboard (section 1)

Grafana — Flux2 Dashboard (section 1)
Grafana — Flux2 Dashboard (section 2)

Grafana — Flux2 Dashboard (section 2)

Flux Cluster Stats Dashboard

JSON: dashboard/cluster.json

Grafana — Flux Cluster Stats (section 1)

Grafana — Flux Cluster Stats (section 1)
Grafana — Flux Cluster Stats (section 2)

Grafana — Flux Cluster Stats (section 2)

Flux Control Plane Dashboard

JSON: dashboard/control-plane.json

Grafana — Flux Control Plane (section 1)

Grafana — Flux Control Plane (section 1)
Grafana — Flux Control Plane (section 2)

Grafana — Flux Control Plane (section 2)
Grafana — Flux Control Plane (section 3)

Grafana — Flux Control Plane (section 3)
Grafana — Flux Control Plane (section 4)

Grafana — Flux Control Plane (section 4)

Alertmanager Dashboard

Grafana — Alertmanager

Grafana — Alertmanager

Каждый новый коммит, который приходит в Flux через GitRepository, запускает реконсиляцию привязанных Kustomization и HelmRelease. Если реконсиляция завершается ошибкой (ReconciliationFailed), notification-controller отправляет алерт в Alertmanager. Таким образом, в Alertmanager и Grafana вы сразу видите, какой ресурс привёл к сбою.

ссылка на оригинал статьи https://habr.com/ru/articles/1030980/