Flux2
Установка и настройка 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-ключей.
Создание git-репозитория
В данном примере создадим git-репозиторий alt/fluxtest в git-репозитории gitea.basealt.ru
Загрузка 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
В результате:
- в git-репозитории https://gitea.basealt.ru/alt/fluxtest создастся дерево манифестов:
.
└── 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