Переводим 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
Здесь мы говорим, что:
- Будем синхронизировать компонент раз в минуту
- Все манифесты будут расположены в
./components/prometheus-operator-crds prune: true— удалять компонент из кластера, при удалении его из репозиторияwait: true— считать, что компонент задеплоился только после того, как все манифесты успешно применены и запущены в кластере- Указываем ссылку на 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
В файле есть два манифеста:
HelmRepository— прямой аналог добавленияhelm repo addиз начала раздела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
Вот и всё! Мы молодцы
Коммит с манифестами из данного поста
Видео, где наглядно показан материал данного поста:
Комментировать можно тут - пост в telegram канале