Flux2

Материал из ALT Linux Wiki

Установка и настройка 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 для репозитория 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

В общем случае любой 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

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