Пост

Переводим FluxCD под управление FluxCD

Переводим FluxCD под управление FluxCD

Intro

Перед тем, как перейти к установке FluxCD через FluxCD — мы должны сделать кое-что ещё.

Нам необходимо установить Prometheus Operator CRDs и Victoria Metrics Operator CRDs.

CRDs (Custom Resource Definition) — это механизм Kubernetes, который позволяет расширять его API пользовательскими (кастомными) типами ресурсов так же, как будто это встроенные ресурсы (Deployment, Service, ConfigMap и т. д.). Они используются такими программами, как Kubernetes Operator. Операторы выполняют определенную логику на основании CRDs, в нашем случае настраивают систему мониторинга для сбора метрик приложений.

Во многих helm chart, которые мы будем устанавливать в дальнейшем — есть возможность включить Service Monitor. Он объясняет системе мониторинга — каким образом она должна собирать метрики с приложения.

Но системы мониторинга в кластере ещё нет. Однако мы бы хотели уже включать service monitor. Поэтому в самом начале мы установим CRDs, будем включать мониторинг для софта, который будет установлен в кластер, а саму систему мониторинга установим гораздо позже. Если CRDs не установить — при попытке задеплоить service monitor — будет выдана ошибка и развертывание кластера прервется.

Мы будем использовать Victoria Metrics для системы мониторинга. Victoria Metrics Operator автоматически конвертирует Service Monitor от Prometheus в свои CRDs. Нам нужны CRDs от того и от другого, так как не всегда есть встроенные Service Monitor, некоторые правила будем писать сами.

Сокращаем интервал синхронизации репозитория с кластером до 1 минуты

Пока кластер находится в разработке — давайте уменьшим интервал синхронизации нашего GitOps репо с кластером.

Находим файл gotk-sync.yaml в каталоге cluster/flux-system.

Видим там два манифеста. Один с kind: GitRepository, второй с kind: Kustomization. Нас интересует второй.

Меняем поле spec.interval с 10m0s на 1m0s, коммитим изменения и пушим в GitOps репозиторий.

Устанавливаем Prometheus Operator CRDs

Обратимся к prometheus community чартам. Смотрим инструкцию по установке, добавляем репо:

1
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts

Ищем там нужные нам CRDs:

1
helm search repo crds

Видим там такую табличку:

1
2
NAME                                            CHART VERSION   APP VERSION     DESCRIPTION                                       
prometheus-community/prometheus-operator-crds   25.0.0          v0.87.0         A Helm chart that collects custom resource defi...

Нас интересуют поля NAME и CHART VERSION

В нашем GitOps репозитории, в каталоге cluster, создаем kustomization.yaml следующего содержания:

1
2
3
4
5
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - 00-prometheus-operator-crds.yaml
  - ./flux-system

Здесь мы будем описывать компоненты, которые будут устанавливаться в кластер.

В том же каталоге создаем 00-prometheus-operator-crds.yaml:

1
2
3
4
5
6
7
8
9
10
11
12
13
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
  name: prometheus-operator-crds
  namespace: flux-system
spec:
  interval: 1m0s
  path: ./components/prometheus-operator-crds
  prune: true
  wait: true
  sourceRef:
    kind: GitRepository
    name: flux-system

Здесь мы говорим, что:

  1. Будем синхронизировать компонент раз в минуту
  2. Все манифесты будут расположены в ./components/prometheus-operator-crds
  3. prune: true — удалять компонент из кластера, при удалении его из репозитория
  4. wait: true — считать, что компонент задеплоился только после того, как все манифесты успешно применены и запущены в кластере
  5. Указываем ссылку на GitOps репо, из которого мы все настраиваем

Осталось создать каталог components/prometheus-operator-crds и поместить туда hr-prometheus-operator-crds.yaml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
apiVersion: source.toolkit.fluxcd.io/v1
kind: HelmRepository
metadata:
  name: prometheus-community
  namespace: flux-system
spec:
  interval: 1m0s
  url: https://prometheus-community.github.io/helm-charts
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
  name: prometheus-operator-crds
  namespace: flux-system
spec:
  interval: 1m0s
  chart:
    spec:
      chart: prometheus-operator-crds
      sourceRef:
        kind: HelmRepository
        name: prometheus-community
      version: 25.0.0

В файле есть два манифеста:

  1. HelmRepository — прямой аналог добавления helm repo add из начала раздела
  2. HelmRelease — описание установки чарта. Обратите внимание на следующие поля:

    spec.chart.spec.chart — имя чарта, которое берется из поля NAME. Мы видели его после выполнения команды helm search repo crds. Берем вторую часть, после /, т.е. prometheus-operator-crds.

    spec.chart.spec.sourceRef — ссылка на helm repo, оно описывается в первом манифесте.

    spec.chart.spec.version — версия, которую мы хотим установить.

Это всё, что необходимо для установки prometheus operator crds. Коммитим, пушим.

Проверяем состояние установки в кластер командой flux get all -A

Если все прошло хорошо — видим примерно следующую картину:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
NAMESPACE       NAME                            REVISION                        SUSPENDED       READY   MESSAGE                                                      
flux-system     gitrepository/flux-system       refs/heads/main@sha1:19094314   False           True    stored artifact for revision 'refs/heads/main@sha1:19094314'

NAMESPACE       NAME                                    REVISION        SUSPENDED       READY   MESSAGE                                     
flux-system     helmrepository/prometheus-community     sha256:347ee90f False           True    stored artifact: revision 'sha256:347ee90f'

NAMESPACE       NAME                                            REVISION        SUSPENDED       READY   MESSAGE                                                            
flux-system     helmchart/flux-system-prometheus-operator-crds  25.0.0          False           True    pulled 'prometheus-operator-crds' chart with version '25.0.0'     

NAMESPACE       NAME                                    REVISION                SUSPENDED       READY   MESSAGE                                                                                                                 
flux-system     helmrelease/prometheus-operator-crds    25.0.0                  False           True    Helm install succeeded for release flux-system/prometheus-operator-crds.v1 with chart prometheus-operator-crds@25.0.0  

NAMESPACE       NAME                                    REVISION                        SUSPENDED       READY   MESSAGE                                         
flux-system     kustomization/flux-system               refs/heads/main@sha1:19094314   False           True    Applied revision: refs/heads/main@sha1:19094314
flux-system     kustomization/prometheus-operator-crds  refs/heads/main@sha1:19094314   False           True    Applied revision: refs/heads/main@sha1:19094314

Проверяем, что CRD успешно создались

1
kubectl get crd | grep prometheus

Если все прошло успешно, увидим:

1
2
3
prometheusagents.monitoring.coreos.com               2025-11-30T13:21:38Z
prometheuses.monitoring.coreos.com                   2025-11-30T13:21:38Z
prometheusrules.monitoring.coreos.com                2025-11-30T13:21:38Z

Устанавливаем VictoriaMetrics Operator CRDs

Документация по установке

Здесь уже подробно объяснять не буду, приведу манифесты, которые будем добавлять.

01-victoria-metrics-crds.yaml:

1
2
3
4
5
6
7
8
9
10
11
12
13
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
  name: victoria-metrics-crds
  namespace: flux-system
spec:
  interval: 1m0s
  path: ./components/victoria-metrics-crds
  prune: true
  wait: true
  sourceRef:
    kind: GitRepository
    name: flux-system

Добавляем его в kustomization.yaml:

1
2
3
4
5
6
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - 00-prometheus-operator-crds.yaml
  - 01-victoria-metrics-crds.yaml
  - ./flux-system

components/victoria-metrics-crds/hr-victoria-metrics-crds.yaml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
apiVersion: source.toolkit.fluxcd.io/v1
kind: HelmRepository
metadata:
  name: vm
  namespace: flux-system
spec:
  interval: 1m0s
  url: https://victoriametrics.github.io/helm-charts/
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
  name: victoria-metrics-crds
  namespace: flux-system
spec:
  interval: 1m0s
  chart:
    spec:
      chart: victoria-metrics-operator-crds
      sourceRef:
        kind: HelmRepository
        name: vm
      version: 0.6.0

Коммитим, пушим, проверяем, что CRDs создались — kubectl get crd | grep victoria

Устанавливаем Flux Operator

Теперь нам нужно установить оператор, который будет заниматься установкой и обновлением FluxCD в кластере.

Читаем документацию по установке.

Способ установки через helm отличается, здесь используется OCI Repository.

Читаем документацию по flux и видим, что он так умеет.

Дальше все почти также:

Добавляем 02-flux-operator.yaml:

1
2
3
4
5
6
7
8
9
10
11
12
13
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
  name: flux-operator
  namespace: flux-system
spec:
  interval: 1m0s
  path: ./components/flux-operator
  wait: true
  prune: true
  sourceRef:
    kind: GitRepository
    name: flux-system

Обновляем kustomization.yaml:

1
2
3
4
5
6
7
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - 00-prometheus-operator-crds.yaml
  - 01-victoria-metrics-crds.yaml
  - 02-flux-operator.yaml
  - ./flux-system

Добавляем /components/flux-operator/hr-flux-operator.yaml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
apiVersion: source.toolkit.fluxcd.io/v1
kind: OCIRepository
metadata:
  name: flux-operator
  namespace: flux-system
spec:
  interval: 1m
  url: oci://ghcr.io/controlplaneio-fluxcd/charts/flux-operator
  ref:
    semver: '0.35.0'
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
  name: flux-operator
  namespace: flux-system
spec:
  interval: 1m
  releaseName: flux-operator
  chartRef:
    kind: OCIRepository
    name: flux-operator
  values:
    serviceMonitor:
      create: true

Обратите внимание на то, что версия указывается в OCIRepository, а не в HelmRelease.

Также вы можете в разделе values увидеть, что мы включаем serviceMonitor. Именно за этим мы и ставили Prometheus CRDs.

Коммитим, пушим, проверяем, что все установилось — kubectl get po -n flux-system.

Должен появиться под flux-operator

Устанавливаем Flux через Flux

Пришла пора установить flux через flux. А именно возложить управление и обновление FluxCD на него же самого.

Читаем раздел документации Flux Operator, который посвящен CRD FluxInstance.

Добавляем 03-flux-instance.yaml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
  name: flux-instance
  namespace: flux-system
spec:
  interval: 1m0s
  dependsOn:
    - name: flux-operator
  wait: true
  path: ./components/flux-instance
  prune: true
  sourceRef:
    kind: GitRepository
    name: flux-system

Обратите внимание, тут появляется раздел dependsOn. Мы указываем зависимость — устанавливаем манифесты компонента FluxInstance только после того, как будет задеплоен Flux Operator, который и управляет разворачиванием flux и знает что делать с CRD FluxInstance.

Обновляем kustomization.yaml:

1
2
3
4
5
6
7
8
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - 00-prometheus-operator-crds.yaml
  - 01-victoria-metrics-crds.yaml
  - 02-flux-operator.yaml
  - 03-flux-instance.yaml
  - ./flux-system

Добавляем components/flux-instance/flux-instance.yaml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
apiVersion: fluxcd.controlplane.io/v1
kind: FluxInstance
metadata:
  name: flux
  namespace: flux-system
  annotations:
    fluxcd.controlplane.io/reconcileEvery: "1h"
    fluxcd.controlplane.io/reconcileTimeout: "5m"
spec:
  distribution:
    version: "2.7.x"
    registry: "ghcr.io/fluxcd"
    artifact: "oci://ghcr.io/controlplaneio-fluxcd/flux-operator-manifests"
  components:
    - source-controller
    - kustomize-controller
    - helm-controller
    - notification-controller
    - image-reflector-controller
    - image-automation-controller
  cluster:
    type: kubernetes
    multitenant: false
    networkPolicy: true
    domain: "cluster.local"
  sync:
    kind: GitRepository
    url: "https://gitlab.example.com/user/talos.git"
    ref: "refs/heads/main"
    path: "cluster"
    pullSecret: "flux-system"

Мы указываем версию flux, которую хотим, чтобы flux operator нам установил — 2.7.x. Это означает, что мажорную и минорную версию оператор обновлять не будет, но будет обновлять патч версию, в которой обычно содержатся багфиксы.

Указываем container registry откуда будут качаться образы flux — ghcr.io/fluxcd.

Далее идет набор компонентов, которые оператор установит. Подробнее про них можно почитать в документации.

Следом идут настройки кластера: тип, мультитенантность, нужно ли создавать сетевую политику, домен кластера — по умолчанию cluster.local

Ну и наконец раздел sync — ссылка на наш GitOps репо, из которого мы кластер и разворачиваем. Указывается ссылка на репозиторий, ветка, с которой будем синхронизироваться, путь, где смотрим манифесты для применения и секрет с логином и паролем для гитлаба.

Коммитим, пушим, через какое-то время проверяем, что flux развернулся kubectl -n flux-system get fluxinstance

При успехе видим примерно такую картину:

1
2
NAME   AGE     READY   STATUS                          REVISION
flux   3h32m   True    Reconciliation finished in 8s   v2.7.5@sha256:657d00ec93de7339d4b5d46724f9b25a57a21ce493c00c00f225fcfe7d834d9d

Вот и всё! Мы молодцы

Коммит с манифестами из данного поста

Видео, где наглядно показан материал данного поста:

YouTube

ВКВидео

Комментировать можно тут - пост в telegram канале

P.S. Небольшое дополнение. Мы забыли удалить манифесты, которые были созданы при flux bootstrap, согласно разделу Cleanup the repository официальной доки по миграции на flux operator.

Авторский пост защищен лицензией CC BY 4.0 .

© Pavel Ivanov. Некоторые права защищены.