Flux2: различия между версиями

Материал из ALT Linux Wiki
(Новая страница: «== Установка и настройка flux2 == Flux2 — это инструмент для синхронизации кластеров Kubernetes с источниками конфигурации (такими как репозитории Git и артефакты OCI), а также для автоматизации обновлений конфигурации при необходимости развертывания нового кода....»)
 
 
(не показана 41 промежуточная версия этого же участника)
Строка 3: Строка 3:
Flux2 — это инструмент для синхронизации кластеров Kubernetes с источниками конфигурации (такими как репозитории Git и артефакты OCI), а также для автоматизации обновлений конфигурации при необходимости развертывания нового кода.
Flux2 — это инструмент для синхронизации кластеров Kubernetes с источниками конфигурации (такими как репозитории Git и артефакты OCI), а также для автоматизации обновлений конфигурации при необходимости развертывания нового кода.


Flux2 включает в себя следующие компоненты (с версиями на 30.07.2024):
Flux2 для бранча sisyphus включает в себя следующие компоненты (с версиями на 30.07.2024):


* команда flux пакета flux2 (версия 2.3.0);
* команда '''flux''' пакета flux2 (версия 2.3.0);
* образ registry.altlinux.org/flu2/helm-controller:1.0.1;
* образ '''registry.altlinux.org/sisyphus/flux2/source-controller:v1.3.0''';
* образ registry.altlinux.org/flu2/source-controller:1.3.0;
* образ '''registry.altlinux.org/sisyphus/flux2/notification-controller:v1.3.0''';
* образ registry.altlinux.org/flu2/notification-controller:1.3.0;
* образ '''registry.altlinux.org/sisyphus/flux2/kustomize-controller:v1.3.0;'''
* образ registry.altlinux.org/flu2/kustomize-controller:1.3.0
* образ registry.altlinux.org/sisyphus/flux2/helm-controller:v1.0.1;
* образ registry.altlinux.org/flu2/image-automation-controller:0.38.0
* образ registry.altlinux.org/sisyphus/flux2/image-automation-controller:v0.38.0;
* образ registry.altlinux.org/flu2/image-reflector-controller:0.32.0
* образ registry.altlinux.org/sisyphus/flux2/image-reflector-controller:v0.32.0.
 
(Выделенные '''жирным шрифтом''' являются обязательными).
 
=== Разворачивание flux с хранением манифестов в git-репозиториях ===
 
В данном разделе описан способ универсальный способ хранения манифестов в любом git-репозитории,  поддерживающий доступ по [https://fluxcd.io/flux/installation/bootstrap/generic-git-server/ SSH Private Key]. В этом случае необходимо наличие (возможно пустого) репозитория.
Для git-репозиториев различных типов существуют специализированные способы работы с git-репозиториями (см.
[https://fluxcd.io/flux/installation/bootstrap/ Flux bootstrap]).
В этих случаях flux сам создает необходимый указанный git-репозиторий.
 
Команда
<pre>
flux bootstrap git ...
</pre>
развертывает  <code>Flux-контроллеры</code> в кластере Kubernetes и настраивает контроллеры для синхронизации состояния кластера из git-репозитория . Помимо установки контроллеров, команда <code> flux bootstrap</code> отправляет <code>flux-манифесты</code> в <code>git-репозиторий</code> и настраивает <code>flux</code> для обновления из <code>git-репозитория</code>.
 
После запуска команды
<pre>
flux bootstrap git ...
</pre>
в дальнейшем любую операцию в кластере (включая обновления <code>flux</code>) можно выполнить с помощью
<pre>
git push
</pre>
без необходимости подключения к <code>кластеру Kubernetes</code>.
 
==== Создание (если еще не создан) ssh-ключа ====
 
Если ssh-ключ типа <code>ed25519</code> еще не сформирован вызовите клманду:
<pre>
ssh-keygen -t ed25519
</pre>
 
Скопируйте открытый ключ из файла <code>~/.ssh/id_ed25519.pub</code>
и добавьте его на странице добавления SSH-ключей.
[[Файл:AddKey+.png|480px|альт=Добавление открытого ключа в gitea-репозиторий|Добавление открытого ключа в gitea-репозиторий]]
 
==== Создание git-репозитория ====
В данном примере создадим git-репозиторий
[https://gitea.basealt.ru/alt/fluxtest.git alt/fluxtest]
в git-репозитории
[https://gitea.basealt.ru/ gitea.basealt.ru]
[[Файл:GitrepoCreate.png|480px|GitrepoCreate.png]]
 
==== Загрузка flux-манифестов в git-репозиторий и разворачиние flux-манифестов в kubernetes-кластере ====
 
Для загрузки flux-манифестов в git-репозиторий и разворачиние flux-манифестов в kubernetes-кластере создайте скрипт <code>bootstrapRepo.sh<code>:
<pre>
flux bootstrap git \
  --url=ssh://gitea@gitea.basealt.ru/alt/fluxtest \
  --branch=main \
  --private-key-file=$HOME/.ssh/id_ed25519 \
  --password=<passwd> \
  --path=clusters/my-cluster
</pre>
и запустите его:
Параметр
<pre>
--path=clusters/my-cluster
</pre>
указывает подкаталог в репозитории куда будет помещаться все манифесты, изменения которых будет мониторить <code>flux</code>.
Ответьте 'y' на вопрос о доступе к открытому ключу Вашего репозитория:
<pre>
...
✔ public key: ssh-ed25519 AAAAC3NzaC1l...
Please give the key access to your repository: y
► applying source secret "flux-system/flux-system"
✔ reconciled source secret
...
</pre>
Выполняться следующие шаги:
*Клонируется локально git-реозиторий gitea:
<pre>
cloning branch "main" from Git repository "ssh://gitea@gitea.basealt.ru/alt/fluxtest"
</pre>
* Создается подкаталог <code>clusters/my-cluster</code> и в нем  сгенерируются манифесты компонентов в файле <code>/clusters/my-cluster/flux-system/gotk-components.yaml</code>:
<pre>
generating component manifests
</pre>
В этом манифесте разворачиваются все необходимые для flux контейнеры:
<pre>
...
---
kind: Deployment
...
spec:
  template:
    spec:
        image: registry.altlinux.org/flux2/source-controller:v1.3.0
...
---
kind: Deployment
...
spec:
  template:
    spec:
        image: registry.altlinux.org/flux2/kustomize-controller:v1.3.0
...
---
kind: Deployment
...
spec:
  template:
    spec:
        image: registry.altlinux.org/flux2/helm-controller:v1.0.1
...
---
kind: Deployment
...
spec:
  template:
    spec:
        image: registry.altlinux.org/flux2/notification-controller:v1.3.0
...
</pre>
 
* Произвоится got-commit созданного манифеста.
<pre>
committed component manifests to "main"
</pre>
* В namespace <code>namespace</code> kubernetes запускаются перечисленные выше POD'ы.
<pre>
installing components in "flux-system" namespace
</pre>
* Генерируется <code>secret</code> и применяется к POD'ам flux:
<pre>
► generating source secret
► applying source secret "flux-system/flux-system"
✔ reconciled source secret
</pre>
* Создается манифест описания параметров синхронизации в файле <code>/clusters/my-cluster/flux-system/gotk-sync.yaml</code>.
<pre>
generating sync manifests
</pre>
Вид файла:
<pre>
# This manifest was generated by flux. DO NOT EDIT.
---
apiVersion: source.toolkit.fluxcd.io/v1
kind: GitRepository
metadata:
  name: flux-system
  namespace: flux-system
spec:
  interval: 1m0s
  ref:
    branch: main
  secretRef:
    name: flux-system
  url: ssh://gitea@gitea.basealt.ru/alt/fluxtest
---
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
  name: flux-system
  namespace: flux-system
spec:
  interval: 10m0s
  path: ./clusters/my-cluster
  prune: true
  sourceRef:
    kind: GitRepository
    name: flux-system
</pre>
* Commit созданного файла и размещение его в репозитории:
<pre>
► committed sync manifests to "main"
► pushing manifests to "ssh://gitea@gitea.basealt.ru/alt/fluxtest"
</pre>
* Ожидание синхронизации git-манифестов с kubernetes:
<pre>
reconciled sync configuration
waiting for Kustomization "flux-system/flux-system" to be reconciled
</pre>
* Ожидание запуска flux-POD'ов в кластере kubernetes:
<pre>
► confirming components are healthy
✔ helm-controller: deployment ready
✔ kustomize-controller: deployment ready
✔ notification-controller: deployment ready
✔ source-controller: deployment ready
</pre>
 
В результате:
* в git-репозитории https://gitea.basealt.ru/alt/fluxtest создастся дерево манифестов:
<pre>
.
└── clusters
    └── my-cluster
        └── flux-system
            ├── gotk-components.yaml
            ├── gotk-sync.yaml
            └── kustomization.yaml
</code>
* В kubernetes-кластере в namespace flux-system создадутся сдедующие ресурся flux:
<code>
$ kubectl -n flux-system get  all
NAME                                          READY  STATUS    RESTARTS  AGE
pod/helm-controller-59c864cdb7-bs9cz          1/1    Running  0          96m
pod/kustomize-controller-55dcb6d8f9-pxwch      1/1    Running  0          96m
pod/notification-controller-657dcf986f-jpbpx  1/1    Running  0          96m
pod/source-controller-6b78cc859f-rffg4        1/1    Running  0          96m
 
NAME                              TYPE        CLUSTER-IP      EXTERNAL-IP  PORT(S)  AGE
service/notification-controller  ClusterIP  10.99.183.176  <none>        80/TCP    96m
service/source-controller        ClusterIP  10.99.180.252  <none>        80/TCP    96m
service/webhook-receiver          ClusterIP  10.105.3.17    <none>        80/TCP    96m
 
NAME                                      READY  UP-TO-DATE  AVAILABLE  AGE
deployment.apps/helm-controller          1/1    1            1          96m
deployment.apps/kustomize-controller      1/1    1            1          96m
deployment.apps/notification-controller  1/1    1            1          96m
deployment.apps/source-controller        1/1    1            1          96m
 
NAME                                                DESIRED  CURRENT  READY  AGE
replicaset.apps/helm-controller-59c864cdb7          1        1        1      96m
replicaset.apps/kustomize-controller-55dcb6d8f9      1        1        1      96m
replicaset.apps/notification-controller-657dcf986f  1        1        1      96m
replicaset.apps/source-controller-6b78cc859f        1        1        1      96m
</pre>
Склонируйте созданный репозиторий себе на компьютер:
<pre>
$ git clone gitea@gitea.basealt.ru:alt/fluxtest.git
Cloning into 'fluxtest'...
Enter passphrase for key '/root/.ssh/id_ed25519':
remote: Enumerating objects: 13, done.
remote: Counting objects: 100% (13/13), done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 13 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (13/13), 59.29 KiB | 919.00 KiB/s, done.
</pre>
 
В дальнейшем все манифесты разворачивания kubernetes-проектов
можно вести в этом репозитории, передавать (<code>git push</code>)
их в git-репозиторий. Контроллер <code>source-controller</code> обнаружит полученные изменения и обеспечит переразворачивание измененных
kubernetes-проектов в  kubernetes-кластере.
 
=== Разворачивание podinfo deployment ===
 
Рассмотрим разворачивание решения [https://github.com/stefanprodan/podinfo podinfo], используемый в [https://www.cncf.io/projects/ CNCF-проектах] для доступа к информации POD'ов и тестирования.
==== Создание  GitRepository манифеста ====
 
Создайте манифест типа <code>GitRepository</code> для репозитория <code>podinfo</code>:
<pre>
flux create source git podinfo \
  --url=https://github.com/stefanprodan/podinfo \
  --branch=master \
  --interval=1m \
  --export > ./clusters/my-cluster/podinfo-source.yaml
</pre>
 
 
В файле <code>./clusters/my-cluster/podinfo-source.yaml</code> создастся манифест:
<pre>
apiVersion: source.toolkit.fluxcd.io/v1
kind: GitRepository
metadata:
  name: podinfo
  namespace: flux-system
spec:
  interval: 1m
  ref:
    branch: master
  url: https://github.com/stefanprodan/podinfo
</pre>
 
 
==== Создание  Kustomization манифеста ====
 
В общем случае любой git-репозиторий поддерживаемый flux должен содержать каталог с файлом <code>kustomization.yaml</code>, который и обеспечивает генерацию манифестов для конкретного deployments. В репозитории <code>podinfo</code> это каталог <code>kustomize</code>.
Для разворачивания <code>podinfo</code> в kubernetes-кластере черех flux создайте манифест ./clusters/my-cluster/podinfo-kustomization.yaml:
<pre>
flux create kustomization podinfo \
  --target-namespace=default \
  --source=podinfo \
  --path="./kustomize" \
  --prune=true \
  --wait=true \
  --interval=30m \
  --retry-interval=2m \
  --health-check-timeout=3m \
  --export > ./clusters/my-cluster/podinfo-kustomization.yaml
</pre>
 
В файле <code>./clusters/my-cluster/podinfo-kustomization.yaml</code> создастся манифест:
<pre>
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
  name: podinfo
  namespace: flux-system
spec:
  interval: 30m0s
  path: ./kustomize
  prune: true
  retryInterval: 2m0s
  sourceRef:
    kind: GitRepository
    name: podinfo
  targetNamespace: default
  timeout: 3m0s
  wait: true
</pre>
 
==== Помещение манифестов в git-репозиторий ====
 
Сделайте <code>commit</code> для созданных манифестов и передайте их в git-репозиторий:
<pre>
git add \
  ./clusters/my-cluster/podinfo-source.yaml\
  ./clusters/my-cluster/podinfo-kustomization.yaml &&
git commit \
  ./clusters/my-cluster/podinfo-source.yaml\
  ./clusters/my-cluster/podinfo-kustomization.yaml &&
  -m "Add podinfo Source and Kustomization"
git push
</pre>
 
Структура git-репозитория должны быть такой:
<pre>
fluxtest
└── clusters/
    └── my-cluster/
        ├── flux-system/                       
        │  ├── gotk-components.yaml
        │  ├── gotk-sync.yaml
        │  └── kustomization.yaml
        ├── podinfo-kustomization.yaml
        └── podinfo-source.yam
</pre>
 
==== Мониторинг состояния flux и созданных разворачиваний (deployments) ====
 
Контроллеры flux обнаруживают пришедшие изменения и запускают разворачивание deployment podinfo, описанное в файле <code>https://github.com/stefanprodan/podinfo/blob/master/kustomize/kustomization.yaml</code>.
Посмотреть состояние разворачиваний можно командой:
<pre>
# flux get kustomizations --watch
</pre>
Примерный вид вывода команды:
<pre>
NAME            REVISION                SUSPENDED      READY  MESSAGE                             
flux-system    main@sha1:362df092      False          True    Applied revision: main@sha1:362df092
podinfo master@sha1:08238ead    False  True    Applied revision: master@sha1:08238ead
</pre>
 
Podinfo разворачивается в kubernetes-кластере в namespace=default.
Чтобы посмотреть русурсы podinfo в кластере необходимо набрать команду:
<pre>
kubectl get all -n default
</pre>
 
Примерный вывод будет такой:
<pre>
NAME                                    READY  STATUS    RESTARTS  AGE
pod/podinfo-85bfcd48c8-pgwtv            1/1    Running  0          5h42m
pod/podinfo-85bfcd48c8-pkxsg            1/1    Running  0          5h42m
 
NAME                TYPE        CLUSTER-IP      EXTERNAL-IP  PORT(S)            AGE
service/kubernetes  ClusterIP  10.96.0.1      <none>        443/TCP            46h
service/podinfo      ClusterIP  10.103.193.43  <none>        9898/TCP,9999/TCP  6h12m
 
NAME                              READY  UP-TO-DATE  AVAILABLE  AGE
deployment.apps/podinfo            2/2    2            2          5h42m
 
NAME                                          DESIRED  CURRENT  READY  AGE
replicaset.apps/podinfo-85bfcd48c8            2        2        2      5h42m
 
NAME                                          REFERENCE            TARGETS              MINPODS  MAXPODS  REPLICAS  AGE
horizontalpodautoscaler.autoscaling/podinfo  Deployment/podinfo  cpu: <unknown>/99%  2        4        2          6h12m
</pre>
 
==== Модификация параметров разворачивания podinfo ====
 
Изменим namespace разворачивания podinfo c default на podinfo и число реплик с 2-х до 3-х.
Для этого сменим в файле <code>clusters/my-cluster/podinfo-kustomization.yaml</code> в теге <code>spec</code>
параметр:
<pre>
  targetNamespace: default
</pre>
на
<pre>
  targetNamespace: podinfo
</pre>
и добавим описание:
<pre>
  patches:
    - patch: |-
        apiVersion: autoscaling/v2
        kind: HorizontalPodAutoscaler
        metadata:
          name: podinfo
        spec:
          minReplicas: 3           
      target:
        name: podinfo
        kind: HorizontalPodAutoscaler
</pre>
Данное описание необходимо по той причине, что git-репозиторий не принадлежит нам и мы не можем править код в файле <code></code>.
 
После
* coздания namespace <code>podinfo</code>:
<pre>
kubectl create namespace podinfo
</pre>
* комита и обновления репозитория:
<pre>
git commit ./clusters/my-cluster/podinfo-kustomization.yaml -m 'Change namespace to podinfo and replicas to 3'
git push
</pre>
flux обнаруживает через интервал обновления изменение и изменяет параметры разворачивания podinfo:
<pre>
kubectl get all -n podinfo
NAME                          READY  STATUS    RESTARTS  AGE
pod/podinfo-85bfcd48c8-bx95j  1/1    Running  0          18m
pod/podinfo-85bfcd48c8-k48rs  1/1    Running  0          17m
pod/podinfo-85bfcd48c8-q7t4s  1/1    Running  0         10m
 
NAME              TYPE        CLUSTER-IP      EXTERNAL-IP  PORT(S)            AGE
service/podinfo  ClusterIP  10.105.46.146  <none>        9898/TCP,9999/TCP  18m
 
NAME                      READY  UP-TO-DATE  AVAILABLE  AGE
deployment.apps/podinfo  3/3    3            3          18m
 
NAME                                DESIRED  CURRENT  READY  AGE
replicaset.apps/podinfo-85bfcd48c8  3        3        3      18m
 
NAME                                          REFERENCE            TARGETS              MINPODS  MAXPODS  REPLICAS  AGE
horizontalpodautoscaler.autoscaling/podinfo  Deployment/podinfo  cpu: <unknown>/99%  3        4        3          18m
</pre>
 
=== Разворачивание nginx deployment ===
 
==== Создание git-репозитория разворачивания nginx ====
 
Создадим git-репозиторий
[https://gitea.basealt.ru/kaf/nginx-flux kaf/nginx-flux] со следующей структурой:
<pre>
nginx-flux/
├── kustomize
│   ├── deployment.yaml
│   ├── kustomization.yaml
│   └── service.yaml
└── README.md
</pre>
 
Файл <code>nginx-flux/kustomize/deployment.yaml</code>:
<pre>
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2 # tells deployment to run 2 pods matching the template
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
</pre>
 
Файл <code>nginx-flux/kustomize/service.yaml</code>:
<pre>
apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: nginx
</pre>
 
Файл <code>nginx-flux/kustomize/kustomization.yaml</code>:
<pre>
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - deployment.yaml
  - service.yaml
</pre>
 
 
==== Создание flux-манифестов для разворачивания ====
 
Создаем манифест типа <code>GitRepository</code> для репозитория <code>kaf/nginx-flux</code>:
<pre>
flux create source git nginx \
  --url=https://gitea.basealt.ru/kaf/nginx-flux.git \
  --branch=main \
  --interval=1m \
  --export
</pre>
В файле <code>./clusters/my-cluster/nginx-source.yaml<code> создастся манифест:
<pre>
---
apiVersion: source.toolkit.fluxcd.io/v1
kind: GitRepository
metadata:
  name: nginx
  namespace: flux-system
spec:
  interval: 1m0s
  ref:
    branch: main
  url: https://gitea.basealt.ru/kaf/nginx-flux.git
</pre>
 
Создаем манифест типа <code>Kustomization</code>:
<pre>
flux create kustomization nginx \
  --target-namespace=nginx \
  --source=nginx \
  --path="./kustomize" \
  --prune=true \
  --wait=true \
  --interval=30m \
  --retry-interval=2m \
  --health-check-timeout=3m \
  --export  > ./clusters/my-cluster/nginx-kustomization.yaml
</pre>
 
В файле <code>./clusters/my-cluster/nginx-kustomization.yaml<code> создастся манифест:
<pre>
---
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
  name: nginx
  namespace: flux-system
spec:
  interval: 30m0s
  path: ./kustomize
  prune: true
  retryInterval: 2m0s
  sourceRef:
    kind: GitRepository
    name: nginx
  targetNamespace: nginx
  timeout: 3m0s
  wait: true
</pre>
Дерево манифестов репозитория <code>fluxtest</code> будет выглядеть следующим образом:
<pre>
fluxtest/
└── clusters
    └── my-cluster
        ├── flux-system
        │   ├── gotk-components.yaml
        │   ├── gotk-sync.yaml
        │   └── kustomization.yaml
        ├── nginx-kustomization.yaml
        ├── nginx-source.yaml
        ├── podinfo-kustomization.yaml
        └── podinfo-source.yaml
</pre>
 
Создадим namespace, сделаем commit и обновим содержимое репозитория:
<pre>
kubectl create namespace nginx
git commit ./clusters/my-cluster/nginx-* -m "Добавление flux-манифестов для разворачивания nginx"
git push
</pre>
 
 
==== Мониторинг состояния flux и созданных разворачиваний (deployments) ====
 
После обнаружения обновления репозитория <code>fluxtest</code>
контроллеры flux прочитают flux-манифесты разворачивания nginx и результат выполнения команды:
<pre>
flux get kustomizations --watch
</pre>
будет примерно таким:
<pre>
NAME            REVISION                SUSPENDED      READY  MESSAGE                             
flux-system    main@sha1:629d1f57      False          True    Applied revision: main@sha1:629d1f57
nginx          main@sha1:fd86ad9f      False  True    Applied revision: main@sha1:fd86ad9f
podinfo        master@sha1:08238ead    False  True    Applied revision: master@sha1:08238ead
</pre>
 
Namespace nginx в кластере будет выглядеть следующим образом:
<pre>
kubectl get all -n nginx
NAME                                    READY  STATUS    RESTARTS  AGE
pod/nginx-deployment-77d8468669-98rbn  1/1    Running  0          14m
pod/nginx-deployment-77d8468669-lgxs4  1/1    Running  0          14m
 
NAME            TYPE      CLUSTER-IP      EXTERNAL-IP  PORT(S)        AGE
service/nginx  NodePort  10.104.112.248  <none>        80:30945/TCP  14m
 
NAME                              READY  UP-TO-DATE  AVAILABLE  AGE
deployment.apps/nginx-deployment  2/2    2            2          14m
 
NAME                                          DESIRED  CURRENT  READY  AGE
replicaset.apps/nginx-deployment-77d8468669  2        2        2      14m
</pre> 
 
====  Модификация параметров разворачивания nginx ====
 
Так как в отличие от репозиторий <code>podinfo</code> мы имеем права на запись в репозиторий разворачивания
<code>nginx</code>, то изменить коэффициент репликации мы можем не прибегая к модификации файла
<code>clusters/my-cluster/nginx-kustomization.yaml</code> репозитория <code>fluxtest</code> сделав правки
непосредственно в файле <code>kustomize/deployment.yaml</code> репозитория <code>nginx-flux</code>, изменив параметр <code>replicas</code> в <code>spec</code>:
<pre>
  replicas: 3 # increase deployment to run 3 pods
</pre>
 
После комита и передачи изменений в репозиторий <code>nginx-flux</code>:
<pre>
git commit kustomize/deployment.yaml -m 'Increase deployment to run 3 pods'
git push
</pre>
вызовем команду:
<pre>
flux get kustomizations --watch
</pre>
и отследим обнаружение новой ревизии git-репозитория <code>nginx-flux</code>:
<pre>
NAME            REVISION                SUSPENDED      READY  MESSAGE                             
flux-system    main@sha1:629d1f57      False          True    Applied revision: main@sha1:629d1f57
nginx  main@sha1:fd86ad9f      False  True    Applied revision: main@sha1:fd86ad9f
podinfo master@sha1:08238ead    False  True    Applied revision: master@sha1:08238ead
...
nginx  main@sha1:fd86ad9f      False  True    Applied revision: main@sha1:67afa1bc
nginx  main@sha1:67afa1bc      False  True    Applied revision: main@sha1:67afa1bc
</pre>
 
В namespace <code>nginx</code> kubernetes-кластера число реплик разворачивания <code>nginx</code> увеличится до 3-х:
<pre>
kubectl get all -n nginx
NAME                                    READY  STATUS    RESTARTS  AGE
pod/nginx-deployment-77d8468669-696x8  1/1    Running  0          2m54s
pod/nginx-deployment-77d8468669-98rbn  1/1    Running  0         26m
pod/nginx-deployment-77d8468669-lgxs4  1/1    Running  0          26m
 
NAME            TYPE      CLUSTER-IP      EXTERNAL-IP  PORT(S)        AGE
service/nginx  NodePort  10.104.112.248  <none>        80:30945/TCP  26m
 
NAME                              READY  UP-TO-DATE  AVAILABLE  AGE
deployment.apps/nginx-deployment  3/3    3            3          26m
 
NAME                                          DESIRED  CURRENT  READY  AGE
replicaset.apps/nginx-deployment-77d8468669  3        3        3      26m
</pre>
 
== Приостановка мониторинга обновлений ==
 
Если вы вручную измените параметры разворачивания. Например число реплик:
<pre>
kubectl scale -n nginx --replicas=2 deployment.apps/nginx-deploymen
</pre>
то эти изменения через интервал мониторинга обнаружит <code>flux</code> и вернет значения, описанные в git-репозитории:
<pre>
flux get kustomizations --watch
NAME            REVISION                SUSPENDED      READY  MESSAGE                             
flux-system    main@sha1:629d1f57      False          True    Applied revision: main@sha1:629d1f57
nginx  main@sha1:67afa1bc      False  True    Applied revision: main@sha1:67afa1bc
podinfo master@sha1:08238ead    False  True    Applied revision: master@sha1:08238ead
...
nginx  main@sha1:67afa1bc      False  True    Applied revision: main@sha1:67afa1bc
...
podinfo master@sha1:08238ead    False  True    Applied revision: master@sha1:08238ead
</pre>
 
Если необходимо (временно) выключить мониторинг ручных изменения в кластере необходимо использовать подкоманду
<code>suspend</code>:
<pre>
flux suspend kustomization nginx
► suspending kustomization nginx in flux-system namespace
✔ kustomization suspended
</pre>
 
Вернуть мониторинг необходимо подкомандой <code>resume</code>:
<pre>
flux resume kustomization nginx
► resuming kustomization nginx in flux-system namespace
✔ kustomization resumed
◎ waiting for Kustomization reconciliation
✔ Kustomization nginx reconciliation completed
✔ applied revision main@sha1:67afa1bc8b0ea5d0392fd37086ea36ec933386a1
</pre>
 
 
== Удаление мониторинга репозитория ==
 
Полностю выключить мониторинг можно подкомандой  <code>uninstall</code>:
<pre>
flux uninstall
Are you sure you want to delete Flux and its custom resource definitions: y
? Are you sure you want to delete Flux and its custom resource definitions? [y/N] y█
✔ Deployment/flux-system/helm-controller deleted
✔ Deployment/flux-system/kustomize-controller deleted
✔ Deployment/flux-system/notification-controller deleted
✔ Deployment/flux-system/source-controller deleted
✔ Service/flux-system/notification-controller deleted
✔ Service/flux-system/source-controller deleted
✔ Service/flux-system/webhook-receiver deleted
✔ NetworkPolicy/flux-system/allow-egress deleted
✔ NetworkPolicy/flux-system/allow-scraping deleted
✔ NetworkPolicy/flux-system/allow-webhooks deleted
✔ ServiceAccount/flux-system/helm-controller deleted
✔ ServiceAccount/flux-system/kustomize-controller deleted
✔ ServiceAccount/flux-system/notification-controller deleted
✔ ServiceAccount/flux-system/source-controller deleted
✔ ClusterRole/crd-controller-flux-system deleted
✔ ClusterRole/flux-edit-flux-system deleted
✔ ClusterRole/flux-view-flux-system deleted
✔ ClusterRoleBinding/cluster-reconciler-flux-system deleted
✔ ClusterRoleBinding/crd-controller-flux-system deleted
► deleting toolkit.fluxcd.io finalizers in all namespaces
✔ GitRepository/flux-system/flux-system finalizers deleted
✔ GitRepository/flux-system/nginx finalizers deleted
✔ GitRepository/flux-system/podinfo finalizers deleted
✔ Kustomization/flux-system/flux-system finalizers deleted
✔ Kustomization/flux-system/nginx finalizers deleted
✔ Kustomization/flux-system/podinfo finalizers deleted
► deleting toolkit.fluxcd.io custom resource definitions
✔ CustomResourceDefinition/alerts.notification.toolkit.fluxcd.io deleted
✔ CustomResourceDefinition/buckets.source.toolkit.fluxcd.io deleted
✔ CustomResourceDefinition/gitrepositories.source.toolkit.fluxcd.io deleted
✔ CustomResourceDefinition/helmcharts.source.toolkit.fluxcd.io deleted
✔ CustomResourceDefinition/helmreleases.helm.toolkit.fluxcd.io deleted
✔ CustomResourceDefinition/helmrepositories.source.toolkit.fluxcd.io deleted
✔ CustomResourceDefinition/kustomizations.kustomize.toolkit.fluxcd.io deleted
✔ CustomResourceDefinition/ocirepositories.source.toolkit.fluxcd.io deleted
✔ CustomResourceDefinition/providers.notification.toolkit.fluxcd.io deleted
✔ CustomResourceDefinition/receivers.notification.toolkit.fluxcd.io deleted
✔ Namespace/flux-system deleted
✔ uninstall finished
</pre>
 
Вернуть мониторинг можно подкомандой <code>bootstrap</code>:
<pre>
flux bootstrap git \
  --url=ssh://gitea@gitea.basealt.ru/alt/fluxtest \
  --branch=main \
  --private-key-file=$HOME/.ssh/id_ed25519 \
  --path=clusters/my-cluster
</pre>
<pre>
► cloning branch "main" from Git repository "ssh://gitea@gitea.basealt.ru/alt/fluxtest"
✔ cloned repository
► generating component manifests
✔ generated component manifests
✔ component manifests are up to date
► installing components in "flux-system" namespace
✔ installed components
✔ reconciled components
► determining if source secret "flux-system/flux-system" exists
► generating source secret
✔ public key: ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIN2XzVrBm8lTgAa/u/GySxJOrHgkXFIwC53WwAUef6AH
Please give the key access to your repository: y
► applying source secret "flux-system/flux-system"
✔ reconciled source secret
► generating sync manifests
✔ generated sync manifests
✔ sync manifests are up to date
► applying sync manifests
✔ reconciled sync configuration
◎ waiting for GitRepository "flux-system/flux-system" to be reconciled
✔ GitRepository reconciled successfully
◎ waiting for Kustomization "flux-system/flux-system" to be reconciled
✔ Kustomization reconciled successfully
► confirming components are healthy
✔ helm-controller: deployment ready
✔ kustomize-controller: deployment ready
✔ notification-controller: deployment ready
✔ source-controller: deployment ready
✔ all components are healthy
</pre>

Текущая версия от 21:54, 3 августа 2024

Установка и настройка flux2

Flux2 — это инструмент для синхронизации кластеров Kubernetes с источниками конфигурации (такими как репозитории Git и артефакты OCI), а также для автоматизации обновлений конфигурации при необходимости развертывания нового кода.

Flux2 для бранча sisyphus включает в себя следующие компоненты (с версиями на 30.07.2024):

  • команда flux пакета flux2 (версия 2.3.0);
  • образ registry.altlinux.org/sisyphus/flux2/source-controller:v1.3.0;
  • образ registry.altlinux.org/sisyphus/flux2/notification-controller:v1.3.0;
  • образ registry.altlinux.org/sisyphus/flux2/kustomize-controller:v1.3.0;
  • образ registry.altlinux.org/sisyphus/flux2/helm-controller:v1.0.1;
  • образ registry.altlinux.org/sisyphus/flux2/image-automation-controller:v0.38.0;
  • образ registry.altlinux.org/sisyphus/flux2/image-reflector-controller:v0.32.0.

(Выделенные жирным шрифтом являются обязательными).

Разворачивание flux с хранением манифестов в git-репозиториях

В данном разделе описан способ универсальный способ хранения манифестов в любом git-репозитории, поддерживающий доступ по SSH Private Key. В этом случае необходимо наличие (возможно пустого) репозитория. Для git-репозиториев различных типов существуют специализированные способы работы с git-репозиториями (см. Flux bootstrap). В этих случаях flux сам создает необходимый указанный git-репозиторий.

Команда

flux bootstrap git ... 

развертывает Flux-контроллеры в кластере Kubernetes и настраивает контроллеры для синхронизации состояния кластера из git-репозитория . Помимо установки контроллеров, команда flux bootstrap отправляет flux-манифесты в git-репозиторий и настраивает flux для обновления из git-репозитория.

После запуска команды

flux bootstrap git ... 

в дальнейшем любую операцию в кластере (включая обновления flux) можно выполнить с помощью

git push

без необходимости подключения к кластеру Kubernetes.

Создание (если еще не создан) ssh-ключа

Если ssh-ключ типа ed25519 еще не сформирован вызовите клманду:

ssh-keygen -t ed25519

Скопируйте открытый ключ из файла ~/.ssh/id_ed25519.pub и добавьте его на странице добавления SSH-ключей. Добавление открытого ключа в gitea-репозиторий

Создание git-репозитория

В данном примере создадим git-репозиторий alt/fluxtest в git-репозитории gitea.basealt.ru GitrepoCreate.png

Загрузка flux-манифестов в git-репозиторий и разворачиние flux-манифестов в kubernetes-кластере

Для загрузки flux-манифестов в git-репозиторий и разворачиние flux-манифестов в kubernetes-кластере создайте скрипт bootstrapRepo.sh:

flux bootstrap git \
  --url=ssh://gitea@gitea.basealt.ru/alt/fluxtest \
  --branch=main \
  --private-key-file=$HOME/.ssh/id_ed25519 \
  --password=<passwd> \
  --path=clusters/my-cluster

и запустите его: Параметр

--path=clusters/my-cluster

указывает подкаталог в репозитории куда будет помещаться все манифесты, изменения которых будет мониторить flux. Ответьте 'y' на вопрос о доступе к открытому ключу Вашего репозитория:

...
✔ public key: ssh-ed25519 AAAAC3NzaC1l...
Please give the key access to your repository: y
► applying source secret "flux-system/flux-system"
✔ reconciled source secret
...

Выполняться следующие шаги:

  • Клонируется локально git-реозиторий gitea:
cloning branch "main" from Git repository "ssh://gitea@gitea.basealt.ru/alt/fluxtest"
  • Создается подкаталог clusters/my-cluster и в нем сгенерируются манифесты компонентов в файле /clusters/my-cluster/flux-system/gotk-components.yaml:
generating component manifests

В этом манифесте разворачиваются все необходимые для flux контейнеры:

...
---
kind: Deployment
...
spec:
  template:
    spec:
        image: registry.altlinux.org/flux2/source-controller:v1.3.0
...
---
kind: Deployment
...
spec:
  template:
    spec:
        image: registry.altlinux.org/flux2/kustomize-controller:v1.3.0
...
---
kind: Deployment
...
spec:
  template:
    spec:
        image: registry.altlinux.org/flux2/helm-controller:v1.0.1
...
---
kind: Deployment
...
spec:
  template:
    spec:
        image: registry.altlinux.org/flux2/notification-controller:v1.3.0
...
  • Произвоится got-commit созданного манифеста.
committed component manifests to "main"
  • В namespace namespace kubernetes запускаются перечисленные выше POD'ы.
installing components in "flux-system" namespace
  • Генерируется secret и применяется к POD'ам flux:
► generating source secret
► applying source secret "flux-system/flux-system"
✔ reconciled source secret
  • Создается манифест описания параметров синхронизации в файле /clusters/my-cluster/flux-system/gotk-sync.yaml.
generating sync manifests

Вид файла:

# This manifest was generated by flux. DO NOT EDIT.
---
apiVersion: source.toolkit.fluxcd.io/v1
kind: GitRepository
metadata:
  name: flux-system
  namespace: flux-system
spec:
  interval: 1m0s
  ref:
    branch: main
  secretRef:
    name: flux-system
  url: ssh://gitea@gitea.basealt.ru/alt/fluxtest
---
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
  name: flux-system
  namespace: flux-system
spec:
  interval: 10m0s
  path: ./clusters/my-cluster
  prune: true
  sourceRef:
    kind: GitRepository
    name: flux-system
  • Commit созданного файла и размещение его в репозитории:
► committed sync manifests to "main"
► pushing manifests to "ssh://gitea@gitea.basealt.ru/alt/fluxtest"
  • Ожидание синхронизации git-манифестов с kubernetes:
reconciled sync configuration
waiting for Kustomization "flux-system/flux-system" to be reconciled
  • Ожидание запуска flux-POD'ов в кластере kubernetes:
► confirming components are healthy
✔ helm-controller: deployment ready
✔ kustomize-controller: deployment ready
✔ notification-controller: deployment ready
✔ source-controller: deployment ready

В результате:

.
└── clusters
    └── my-cluster
        └── flux-system
            ├── gotk-components.yaml
            ├── gotk-sync.yaml
            └── kustomization.yaml
</code>
* В kubernetes-кластере в namespace flux-system создадутся сдедующие ресурся flux:
<code>
$ kubectl -n flux-system get  all
NAME                                           READY   STATUS    RESTARTS   AGE
pod/helm-controller-59c864cdb7-bs9cz           1/1     Running   0          96m
pod/kustomize-controller-55dcb6d8f9-pxwch      1/1     Running   0          96m
pod/notification-controller-657dcf986f-jpbpx   1/1     Running   0          96m
pod/source-controller-6b78cc859f-rffg4         1/1     Running   0          96m

NAME                              TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service/notification-controller   ClusterIP   10.99.183.176   <none>        80/TCP    96m
service/source-controller         ClusterIP   10.99.180.252   <none>        80/TCP    96m
service/webhook-receiver          ClusterIP   10.105.3.17     <none>        80/TCP    96m

NAME                                      READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/helm-controller           1/1     1            1           96m
deployment.apps/kustomize-controller      1/1     1            1           96m
deployment.apps/notification-controller   1/1     1            1           96m
deployment.apps/source-controller         1/1     1            1           96m

NAME                                                 DESIRED   CURRENT   READY   AGE
replicaset.apps/helm-controller-59c864cdb7           1         1         1       96m
replicaset.apps/kustomize-controller-55dcb6d8f9      1         1         1       96m
replicaset.apps/notification-controller-657dcf986f   1         1         1       96m
replicaset.apps/source-controller-6b78cc859f         1         1         1       96m

Склонируйте созданный репозиторий себе на компьютер:

$ git clone gitea@gitea.basealt.ru:alt/fluxtest.git
Cloning into 'fluxtest'...
Enter passphrase for key '/root/.ssh/id_ed25519': 
remote: Enumerating objects: 13, done.
remote: Counting objects: 100% (13/13), done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 13 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (13/13), 59.29 KiB | 919.00 KiB/s, done.

В дальнейшем все манифесты разворачивания kubernetes-проектов можно вести в этом репозитории, передавать (git push) их в git-репозиторий. Контроллер source-controller обнаружит полученные изменения и обеспечит переразворачивание измененных kubernetes-проектов в kubernetes-кластере.

Разворачивание podinfo deployment

Рассмотрим разворачивание решения podinfo, используемый в CNCF-проектах для доступа к информации POD'ов и тестирования.

Создание GitRepository манифеста

Создайте манифест типа GitRepository для репозитория podinfo:

flux create source git podinfo \
  --url=https://github.com/stefanprodan/podinfo \
  --branch=master \
  --interval=1m \
  --export > ./clusters/my-cluster/podinfo-source.yaml


В файле ./clusters/my-cluster/podinfo-source.yaml создастся манифест:

apiVersion: source.toolkit.fluxcd.io/v1
kind: GitRepository
metadata:
  name: podinfo
  namespace: flux-system
spec:
  interval: 1m
  ref:
    branch: master
  url: https://github.com/stefanprodan/podinfo


Создание Kustomization манифеста

В общем случае любой git-репозиторий поддерживаемый flux должен содержать каталог с файлом kustomization.yaml, который и обеспечивает генерацию манифестов для конкретного deployments. В репозитории podinfo это каталог kustomize. Для разворачивания podinfo в kubernetes-кластере черех flux создайте манифест ./clusters/my-cluster/podinfo-kustomization.yaml:

flux create kustomization podinfo \
  --target-namespace=default \
  --source=podinfo \
  --path="./kustomize" \
  --prune=true \
  --wait=true \
  --interval=30m \
  --retry-interval=2m \
  --health-check-timeout=3m \
  --export > ./clusters/my-cluster/podinfo-kustomization.yaml

В файле ./clusters/my-cluster/podinfo-kustomization.yaml создастся манифест:

apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
  name: podinfo
  namespace: flux-system
spec:
  interval: 30m0s
  path: ./kustomize
  prune: true
  retryInterval: 2m0s
  sourceRef:
    kind: GitRepository
    name: podinfo
  targetNamespace: default
  timeout: 3m0s
  wait: true

Помещение манифестов в git-репозиторий

Сделайте commit для созданных манифестов и передайте их в git-репозиторий:

git add \
  ./clusters/my-cluster/podinfo-source.yaml\
  ./clusters/my-cluster/podinfo-kustomization.yaml && 
git commit \
  ./clusters/my-cluster/podinfo-source.yaml\
  ./clusters/my-cluster/podinfo-kustomization.yaml && 
  -m "Add podinfo Source and Kustomization"
git push

Структура git-репозитория должны быть такой:

fluxtest
└── clusters/
    └── my-cluster/
        ├── flux-system/                        
        │   ├── gotk-components.yaml
        │   ├── gotk-sync.yaml
        │   └── kustomization.yaml
        ├── podinfo-kustomization.yaml
        └── podinfo-source.yam

Мониторинг состояния flux и созданных разворачиваний (deployments)

Контроллеры flux обнаруживают пришедшие изменения и запускают разворачивание deployment podinfo, описанное в файле https://github.com/stefanprodan/podinfo/blob/master/kustomize/kustomization.yaml.

Посмотреть состояние разворачиваний можно командой:

# flux get kustomizations --watch

Примерный вид вывода команды:

NAME            REVISION                SUSPENDED       READY   MESSAGE                              
flux-system     main@sha1:362df092      False           True    Applied revision: main@sha1:362df092
podinfo master@sha1:08238ead    False   True    Applied revision: master@sha1:08238ead

Podinfo разворачивается в kubernetes-кластере в namespace=default. Чтобы посмотреть русурсы podinfo в кластере необходимо набрать команду:

kubectl get all -n default

Примерный вывод будет такой:

NAME                                    READY   STATUS    RESTARTS   AGE
pod/podinfo-85bfcd48c8-pgwtv            1/1     Running   0          5h42m
pod/podinfo-85bfcd48c8-pkxsg            1/1     Running   0          5h42m

NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)             AGE
service/kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP             46h
service/podinfo      ClusterIP   10.103.193.43   <none>        9898/TCP,9999/TCP   6h12m

NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/podinfo            2/2     2            2           5h42m

NAME                                          DESIRED   CURRENT   READY   AGE
replicaset.apps/podinfo-85bfcd48c8            2         2         2       5h42m

NAME                                          REFERENCE            TARGETS              MINPODS   MAXPODS   REPLICAS   AGE
horizontalpodautoscaler.autoscaling/podinfo   Deployment/podinfo   cpu: <unknown>/99%   2         4         2          6h12m

Модификация параметров разворачивания podinfo

Изменим namespace разворачивания podinfo c default на podinfo и число реплик с 2-х до 3-х. Для этого сменим в файле clusters/my-cluster/podinfo-kustomization.yaml в теге spec параметр:

  targetNamespace: default

на

  targetNamespace: podinfo

и добавим описание:

  patches:
    - patch: |-
        apiVersion: autoscaling/v2
        kind: HorizontalPodAutoscaler
        metadata:
          name: podinfo
        spec:
          minReplicas: 3             
      target:
        name: podinfo
        kind: HorizontalPodAutoscaler

Данное описание необходимо по той причине, что git-репозиторий не принадлежит нам и мы не можем править код в файле .

После

  • coздания namespace podinfo:
kubectl create namespace podinfo
  • комита и обновления репозитория:
git commit ./clusters/my-cluster/podinfo-kustomization.yaml -m 'Change namespace to podinfo and replicas to 3'
git push

flux обнаруживает через интервал обновления изменение и изменяет параметры разворачивания podinfo:

kubectl get all -n podinfo
NAME                           READY   STATUS    RESTARTS   AGE
pod/podinfo-85bfcd48c8-bx95j   1/1     Running   0          18m
pod/podinfo-85bfcd48c8-k48rs   1/1     Running   0          17m
pod/podinfo-85bfcd48c8-q7t4s   1/1     Running   0          10m

NAME              TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)             AGE
service/podinfo   ClusterIP   10.105.46.146   <none>        9898/TCP,9999/TCP   18m

NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/podinfo   3/3     3            3           18m

NAME                                 DESIRED   CURRENT   READY   AGE
replicaset.apps/podinfo-85bfcd48c8   3         3         3       18m

NAME                                          REFERENCE            TARGETS              MINPODS   MAXPODS   REPLICAS   AGE
horizontalpodautoscaler.autoscaling/podinfo   Deployment/podinfo   cpu: <unknown>/99%   3         4         3          18m

Разворачивание nginx deployment

Создание git-репозитория разворачивания nginx

Создадим git-репозиторий kaf/nginx-flux со следующей структурой:

nginx-flux/
├── kustomize
│   ├── deployment.yaml
│   ├── kustomization.yaml
│   └── service.yaml
└── README.md

Файл nginx-flux/kustomize/deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2 # tells deployment to run 2 pods matching the template
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

Файл nginx-flux/kustomize/service.yaml:

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: nginx

Файл nginx-flux/kustomize/kustomization.yaml:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - deployment.yaml
  - service.yaml


Создание flux-манифестов для разворачивания

Создаем манифест типа GitRepository для репозитория kaf/nginx-flux:

flux create source git nginx \
  --url=https://gitea.basealt.ru/kaf/nginx-flux.git \
  --branch=main \
  --interval=1m \
  --export

В файле ./clusters/my-cluster/nginx-source.yaml создастся манифест:

---
apiVersion: source.toolkit.fluxcd.io/v1
kind: GitRepository
metadata:
  name: nginx
  namespace: flux-system
spec:
  interval: 1m0s
  ref:
    branch: main
  url: https://gitea.basealt.ru/kaf/nginx-flux.git

Создаем манифест типа Kustomization:

flux create kustomization nginx \
  --target-namespace=nginx \
  --source=nginx \
  --path="./kustomize" \
  --prune=true \
  --wait=true \
  --interval=30m \
  --retry-interval=2m \
  --health-check-timeout=3m \
  --export  > ./clusters/my-cluster/nginx-kustomization.yaml

В файле ./clusters/my-cluster/nginx-kustomization.yaml создастся манифест:

---
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
  name: nginx
  namespace: flux-system
spec:
  interval: 30m0s
  path: ./kustomize
  prune: true
  retryInterval: 2m0s
  sourceRef:
    kind: GitRepository
    name: nginx
  targetNamespace: nginx
  timeout: 3m0s
  wait: true

Дерево манифестов репозитория fluxtest будет выглядеть следующим образом:

fluxtest/
└── clusters
    └── my-cluster
        ├── flux-system
        │   ├── gotk-components.yaml
        │   ├── gotk-sync.yaml
        │   └── kustomization.yaml
        ├── nginx-kustomization.yaml
        ├── nginx-source.yaml
        ├── podinfo-kustomization.yaml
        └── podinfo-source.yaml

Создадим namespace, сделаем commit и обновим содержимое репозитория:

kubectl create namespace nginx
git commit ./clusters/my-cluster/nginx-* -m "Добавление flux-манифестов для разворачивания nginx"
git push


Мониторинг состояния flux и созданных разворачиваний (deployments)

После обнаружения обновления репозитория fluxtest контроллеры flux прочитают flux-манифесты разворачивания nginx и результат выполнения команды:

flux get kustomizations --watch

будет примерно таким:

NAME            REVISION                SUSPENDED       READY   MESSAGE                              
flux-system     main@sha1:629d1f57      False           True    Applied revision: main@sha1:629d1f57
nginx           main@sha1:fd86ad9f      False   True    Applied revision: main@sha1:fd86ad9f
podinfo         master@sha1:08238ead    False   True    Applied revision: master@sha1:08238ead

Namespace nginx в кластере будет выглядеть следующим образом:

kubectl get all -n nginx
NAME                                    READY   STATUS    RESTARTS   AGE
pod/nginx-deployment-77d8468669-98rbn   1/1     Running   0          14m
pod/nginx-deployment-77d8468669-lgxs4   1/1     Running   0          14m

NAME            TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
service/nginx   NodePort   10.104.112.248   <none>        80:30945/TCP   14m

NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-deployment   2/2     2            2           14m

NAME                                          DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-deployment-77d8468669   2         2         2       14m

Модификация параметров разворачивания nginx

Так как в отличие от репозиторий podinfo мы имеем права на запись в репозиторий разворачивания nginx, то изменить коэффициент репликации мы можем не прибегая к модификации файла clusters/my-cluster/nginx-kustomization.yaml репозитория fluxtest сделав правки непосредственно в файле kustomize/deployment.yaml репозитория nginx-flux, изменив параметр replicas в spec:

  replicas: 3 # increase deployment to run 3 pods

После комита и передачи изменений в репозиторий nginx-flux:

git commit kustomize/deployment.yaml -m 'Increase deployment to run 3 pods'
git push

вызовем команду:

flux get kustomizations --watch

и отследим обнаружение новой ревизии git-репозитория nginx-flux:

NAME            REVISION                SUSPENDED       READY   MESSAGE                              
flux-system     main@sha1:629d1f57      False           True    Applied revision: main@sha1:629d1f57
nginx   main@sha1:fd86ad9f      False   True    Applied revision: main@sha1:fd86ad9f
podinfo master@sha1:08238ead    False   True    Applied revision: master@sha1:08238ead
...
nginx   main@sha1:fd86ad9f      False   True    Applied revision: main@sha1:67afa1bc
nginx   main@sha1:67afa1bc      False   True    Applied revision: main@sha1:67afa1bc

В namespace nginx kubernetes-кластера число реплик разворачивания nginx увеличится до 3-х:

kubectl get all -n nginx
NAME                                    READY   STATUS    RESTARTS   AGE
pod/nginx-deployment-77d8468669-696x8   1/1     Running   0          2m54s
pod/nginx-deployment-77d8468669-98rbn   1/1     Running   0          26m
pod/nginx-deployment-77d8468669-lgxs4   1/1     Running   0          26m

NAME            TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
service/nginx   NodePort   10.104.112.248   <none>        80:30945/TCP   26m

NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-deployment   3/3     3            3           26m

NAME                                          DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-deployment-77d8468669   3         3         3       26m

Приостановка мониторинга обновлений

Если вы вручную измените параметры разворачивания. Например число реплик:

kubectl scale -n nginx --replicas=2 deployment.apps/nginx-deploymen

то эти изменения через интервал мониторинга обнаружит flux и вернет значения, описанные в git-репозитории:

flux get kustomizations --watch
NAME            REVISION                SUSPENDED       READY   MESSAGE                              
flux-system     main@sha1:629d1f57      False           True    Applied revision: main@sha1:629d1f57
nginx   main@sha1:67afa1bc      False   True    Applied revision: main@sha1:67afa1bc
podinfo master@sha1:08238ead    False   True    Applied revision: master@sha1:08238ead
...
nginx   main@sha1:67afa1bc      False   True    Applied revision: main@sha1:67afa1bc
...
podinfo master@sha1:08238ead    False   True    Applied revision: master@sha1:08238ead

Если необходимо (временно) выключить мониторинг ручных изменения в кластере необходимо использовать подкоманду suspend:

flux suspend kustomization nginx
► suspending kustomization nginx in flux-system namespace
✔ kustomization suspended

Вернуть мониторинг необходимо подкомандой resume:

flux resume kustomization nginx
► resuming kustomization nginx in flux-system namespace
✔ kustomization resumed
◎ waiting for Kustomization reconciliation
✔ Kustomization nginx reconciliation completed
✔ applied revision main@sha1:67afa1bc8b0ea5d0392fd37086ea36ec933386a1


Удаление мониторинга репозитория

Полностю выключить мониторинг можно подкомандой uninstall:

flux uninstall
Are you sure you want to delete Flux and its custom resource definitions: y
? Are you sure you want to delete Flux and its custom resource definitions? [y/N] y█
✔ Deployment/flux-system/helm-controller deleted 
✔ Deployment/flux-system/kustomize-controller deleted 
✔ Deployment/flux-system/notification-controller deleted 
✔ Deployment/flux-system/source-controller deleted 
✔ Service/flux-system/notification-controller deleted 
✔ Service/flux-system/source-controller deleted 
✔ Service/flux-system/webhook-receiver deleted 
✔ NetworkPolicy/flux-system/allow-egress deleted 
✔ NetworkPolicy/flux-system/allow-scraping deleted 
✔ NetworkPolicy/flux-system/allow-webhooks deleted 
✔ ServiceAccount/flux-system/helm-controller deleted 
✔ ServiceAccount/flux-system/kustomize-controller deleted 
✔ ServiceAccount/flux-system/notification-controller deleted 
✔ ServiceAccount/flux-system/source-controller deleted 
✔ ClusterRole/crd-controller-flux-system deleted 
✔ ClusterRole/flux-edit-flux-system deleted 
✔ ClusterRole/flux-view-flux-system deleted 
✔ ClusterRoleBinding/cluster-reconciler-flux-system deleted 
✔ ClusterRoleBinding/crd-controller-flux-system deleted 
► deleting toolkit.fluxcd.io finalizers in all namespaces
✔ GitRepository/flux-system/flux-system finalizers deleted 
✔ GitRepository/flux-system/nginx finalizers deleted 
✔ GitRepository/flux-system/podinfo finalizers deleted 
✔ Kustomization/flux-system/flux-system finalizers deleted 
✔ Kustomization/flux-system/nginx finalizers deleted 
✔ Kustomization/flux-system/podinfo finalizers deleted 
► deleting toolkit.fluxcd.io custom resource definitions
✔ CustomResourceDefinition/alerts.notification.toolkit.fluxcd.io deleted 
✔ CustomResourceDefinition/buckets.source.toolkit.fluxcd.io deleted 
✔ CustomResourceDefinition/gitrepositories.source.toolkit.fluxcd.io deleted 
✔ CustomResourceDefinition/helmcharts.source.toolkit.fluxcd.io deleted 
✔ CustomResourceDefinition/helmreleases.helm.toolkit.fluxcd.io deleted 
✔ CustomResourceDefinition/helmrepositories.source.toolkit.fluxcd.io deleted 
✔ CustomResourceDefinition/kustomizations.kustomize.toolkit.fluxcd.io deleted 
✔ CustomResourceDefinition/ocirepositories.source.toolkit.fluxcd.io deleted 
✔ CustomResourceDefinition/providers.notification.toolkit.fluxcd.io deleted 
✔ CustomResourceDefinition/receivers.notification.toolkit.fluxcd.io deleted 
✔ Namespace/flux-system deleted 
✔ uninstall finished

Вернуть мониторинг можно подкомандой bootstrap:

flux bootstrap git \
  --url=ssh://gitea@gitea.basealt.ru/alt/fluxtest \
  --branch=main \
  --private-key-file=$HOME/.ssh/id_ed25519 \
  --path=clusters/my-cluster
► cloning branch "main" from Git repository "ssh://gitea@gitea.basealt.ru/alt/fluxtest"
✔ cloned repository
► generating component manifests
✔ generated component manifests
✔ component manifests are up to date
► installing components in "flux-system" namespace
✔ installed components
✔ reconciled components
► determining if source secret "flux-system/flux-system" exists
► generating source secret
✔ public key: ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIN2XzVrBm8lTgAa/u/GySxJOrHgkXFIwC53WwAUef6AH
Please give the key access to your repository: y
► applying source secret "flux-system/flux-system"
✔ reconciled source secret
► generating sync manifests
✔ generated sync manifests
✔ sync manifests are up to date
► applying sync manifests
✔ reconciled sync configuration
◎ waiting for GitRepository "flux-system/flux-system" to be reconciled
✔ GitRepository reconciled successfully
◎ waiting for Kustomization "flux-system/flux-system" to be reconciled
✔ Kustomization reconciled successfully
► confirming components are healthy
✔ helm-controller: deployment ready
✔ kustomize-controller: deployment ready
✔ notification-controller: deployment ready
✔ source-controller: deployment ready
✔ all components are healthy