Flux2: различия между версиями
Kaf (обсуждение | вклад) |
Kaf (обсуждение | вклад) Нет описания правки |
||
(не показано 10 промежуточных версий этого же участника) | |||
Строка 129: | Строка 129: | ||
</pre> | </pre> | ||
* Произвоится | * Произвоится git-commit созданного манифеста. | ||
<pre> | <pre> | ||
committed component manifests to "main" | committed component manifests to "main" | ||
Строка 387: | Строка 387: | ||
==== Модификация параметров разворачивания podinfo ==== | ==== Модификация параметров разворачивания 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 === | === Разворачивание 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> |
Текущая версия от 12:47, 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-ключей.
Создание 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
...
- Произвоится git-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 манифеста
Создайте манифест типа 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