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 манифеста

Создайте манифест типа 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

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


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

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