Пост

Переводим 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 канале

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

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