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

Материал из ALT Linux Wiki
Строка 121: Строка 121:
cloning branch "main" from Git repository "ssh://gitea@gitea.basealt.ru/alt/fluxtest"
cloning branch "main" from Git repository "ssh://gitea@gitea.basealt.ru/alt/fluxtest"
</pre>
</pre>
* Созадстся подкаталог <code>clusters/my-cluster</code> и в нем  сгенерируются манифесты компонентов в файле <code>gotk-components.yaml</code>:
* Созаеттся подкаталог <code>clusters/my-cluster</code> и в нем  сгенерируются манифесты компонентов в файле <code>/clusters/my-cluster/flux-system/gotk-components.yaml</code>:
<pre>
<pre>
generating component manifests
generating component manifests
Строка 162: Строка 162:
</pre>
</pre>


*  
* Произвоится got-commit созданного манифеста.
<pre>
<pre>
committed component manifests to "main"
committed component manifests to "main"
</pre>
</pre>
*  
* В namespace <code>namespace</code> kubernetes запускаются перечисленные выше POD'ы.
<pre>
<pre>
installing components in "flux-system" namespace
installing components in "flux-system" namespace
</pre>
</pre>
*  
* Генерируется <code>secret</code> и применяется к POD'ам flux:
<pre>
reconciled components
</pre>
*
<pre>
generating source secret
</pre>
*
<pre>
<pre>
► generating source secret
► applying source secret "flux-system/flux-system"
► applying source secret "flux-system/flux-system"
✔ reconciled source secret
✔ reconciled source secret
</pre>
</pre>
*  
* Создается манифест описания параметров синхронизации в файле <code>/clusters/my-cluster/flux-system/gotk-sync.yaml</code>.
<pre>
<pre>
generating sync manifests
generating sync manifests
</pre>
</pre>
*
Вид файла:
<pre>
<pre>
committed sync manifests to "main"
# 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>
</pre>
*  
* Commit созаддного файла и размещение его в репозитории:
<pre>
<pre>
pushing manifests to "ssh://gitea@gitea.basealt.ru/alt/fluxtest"
► committed sync manifests to "main"
pushing manifests to "ssh://gitea@gitea.basealt.ru/alt/fluxtest"
</pre>
</pre>
*  
* Ожидп=ание синхронизации git-манифестов с kubernetes:
<pre>
<pre>
reconciled sync configuration
reconciled sync configuration
</pre>
*
<pre>
waiting for Kustomization "flux-system/flux-system" to be reconciled
waiting for Kustomization "flux-system/flux-system" to be reconciled
</pre>
</pre>
*  
* Ожидание запуска flux-POD'ов в кластере kubernetes:
<pre>
<pre>
► confirming components are healthy
► confirming components are healthy
Строка 211: Строка 228:
✔ source-controller: deployment ready
✔ source-controller: deployment ready
</pre>
</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
</code>


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

Версия от 10:59, 31 июля 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/alt_fluxtest \
  --branch=main \
  --private-key-file=$HOME/.ssh/id_ed25519 \
  --password=<password> \
  --path=clusters/my-cluster

и запустите его:

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' на вопрос о доступе к открытому ключу Вашего репозитория:

► cloning branch "main" from Git repository "ssh://gitea@gitea.basealt.ru/alt/fluxtest"
✔ cloned repository
► generating component manifests
✔ generated component manifests
✔ committed component manifests to "main" ("a5b764515ef2dc06931e215ba56a3ec10487af96")
► pushing component manifests to "ssh://gitea@gitea.basealt.ru/alt/fluxtest"
► 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 AAAAC3NzaC1l...
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
✔ committed sync manifests to "main" ("42da02d6087f1ec3f16c2664a22781907514aaab")
► pushing sync manifests to "ssh://gitea@gitea.basealt.ru/alt/fluxtest"
► 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

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

  • Клонируется локально 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

* В kubernetes-кластере в namespace flux-system создадутся сдедующие ресурся flux:

$ 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


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

Рассмотрим разворачивание решения podinfo, используемый в CNCF-проектах для доступа к информации POD'ов и тестирования. В общем случае любой git-репозиторий поддерживаемый flux должен содержать каталог с файлом kustomization.yaml, который и обеспечивает генерацию манифестов для конкретного deployments.

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