Supercharge your Kubernetes deployments with Flux v2 and GitHub
Делаю:
06.11.2021
https://www.youtube.com/watch?v=N6UCKF7JD7k&list=PLG9qZAczREKmCq6on_LG8D0uiHMx1h3yn&index=1
У нас есть 2 репо и мы создаем спец.репо flux-infra, которое работает с k8s.
Форкаем себе подготовленное репо 1:
https://github.com/gbaeke/realtimeapp
Кликнуть - Разрешить работать с Actions https://github.com/${GITHUB_USER}/realtimeapp/actions
Это само приложение, которое деплоится на сервер.
По хорошему, нужно настроить, чтобы собиралось и отправлялось в личный registry.
Форкаем себе подготовленное репо с конфигами, которые используются для деплоя:
https://github.com/gbaeke/realtimeapp-infra
3-е репо служебное flux-infra. В нем описано за изменениями в каких репо следует следить.
По идее:
- в случае релиза realtimeapp. Создаются новые образы и закидываются в личный registry
- обновляется версия image в репо с конфигами realtimeapp-infra
- обновляется версия приложения в кластере.
01-Supercharge your Kubernetes deployments with Flux v2 and GitHub - Introduction
Используется беслпатное облако Google
- Инсталляция MiniKube
Испольновалась версия KUBERNETES_VERSION=v1.22.2
-
Инсталляция Kubectl
-
Инсталляция fluxcd
// Инсталляция fluxcd
$ curl -s https://fluxcd.io/install.sh | sudo bash
$ flux --version
flux version 0.21.1
$ flux install
$ flux check
► checking prerequisites
✔ Kubernetes 1.22.2 >=1.19.0-0
► checking controllers
✔ helm-controller: deployment ready
► ghcr.io/fluxcd/helm-controller:v0.12.1
✔ kustomize-controller: deployment ready
► ghcr.io/fluxcd/kustomize-controller:v0.16.0
✔ notification-controller: deployment ready
► ghcr.io/fluxcd/notification-controller:v0.18.1
✔ source-controller: deployment ready
► ghcr.io/fluxcd/source-controller:v0.17.2
✔ all checks passed
- Инсталляция kustomize
$ curl -s "https://raw.githubusercontent.com/\
kubernetes-sigs/kustomize/master/hack/install_kustomize.sh" | bash && chmod +x kustomize && sudo mv kustomize /usr/local/bin/
$ kustomize version
Version:kustomize/v4.4.0
$ export INGRESS_HOST=$(minikube --profile ${PROFILE} ip)
$ echo ${INGRESS_HOST}
$ export GITHUB_USER=<YOUR_GITHUB_USERNAME>
$ export GITHUB_TOKEN=<YOUR_GITHUB_TOKEN>
$ cd ~
// Будет создано приватное репо flux-infra
$ flux bootstrap github \
--owner=${GITHUB_USER} \
--repository=flux-infra \
--branch=master \
--path=app-cluster \
--personal
02-Kubernetes deployments with Flux v2 introduction to kustomize (Пропустить! Материал просто для знакомства с kustomize)
$ mkdir -p ~/tmp && cd ~/tmp
$ git clone https://github.com/gbaeke/realtimeapp-infra
$ cd realtimeapp-infra/deploy/overlays/dev
$ kustomize build
// Сразу еще и применить
// $ kustomize build | kubeclt apply -f -
03-Kubernetes deployments with Flux v2 Deploying Manifests
Автор сначала рассказывает до 12 минуты, потом показывает как делать!
$ git clone [email protected]:${GITHUB_USER}/flux-infra.git
$ git checkout master
$ cd flux-infra
$ flux create source git realtimeapp-infra \
--url https://github.com/${GITHUB_USER}/realtimeapp-infra \
--branch master \
--interval 30s \
--export > ./app-cluster/realtimeapp-source.yaml
$ flux create kustomization realtimeapp-dev \
--source realtimeapp-infra \
--path "./deploy/overlays/dev" \
--prune true \
--interval 1m \
--health-check="Deployment/realtime-dev.realtime-dev" \
--health-check="Deployment/redis-dev.realtime-dev" \
--health-check-timeout=2m \
--export > ./app-cluster/realtimeapp-dev.yaml
$ flux create kustomization realtimeapp-prd \
--source realtimeapp-infra \
--path "./deploy/overlays/prd" \
--prune true \
--interval 1m \
--health-check="Deployment/realtime-prd.realtime-prd" \
--health-check="Deployment/redis-prd.realtime-prd" \
--health-check-timeout=2m \
--export > ./app-cluster/realtimeapp-prd.yaml
$ cat ./app-cluster/realtimeapp-source.yaml
---
apiVersion: source.toolkit.fluxcd.io/v1beta1
kind: GitRepository
metadata:
name: realtimeapp-infra
namespace: flux-system
spec:
interval: 30s
ref:
branch: master
url: https://github.com/wildmakaka/realtimeapp-infra
$ cat ./app-cluster/realtimeapp-dev.yaml
---
apiVersion: kustomize.toolkit.fluxcd.io/v1beta2
kind: Kustomization
metadata:
name: realtimeapp-dev
namespace: flux-system
spec:
healthChecks:
- kind: Deployment
name: realtime-dev
namespace: realtime-dev
- kind: Deployment
name: redis-dev
namespace: realtime-dev
interval: 1m0s
path: ./deploy/overlays/dev
prune: true
sourceRef:
kind: GitRepository
name: realtimeapp-infra
timeout: 2m0s
$ cat ./app-cluster/realtimeapp-prd.yaml
---
apiVersion: kustomize.toolkit.fluxcd.io/v1beta2
kind: Kustomization
metadata:
name: realtimeapp-prd
namespace: flux-system
spec:
healthChecks:
- kind: Deployment
name: realtime-prd
namespace: realtime-prd
- kind: Deployment
name: redis-prd
namespace: realtime-prd
interval: 1m0s
path: ./deploy/overlays/prd
prune: true
sourceRef:
kind: GitRepository
name: realtimeapp-infra
timeout: 2m0s
$ kubectl get ns
NAME STATUS AGE
default Active 28m
flux-system Active 16m
ingress-nginx Active 28m
kube-node-lease Active 28m
kube-public Active 28m
kube-system Active 28m
$ git add --all
$ git commit -m "Added source and kustomization"
$ git push --set-upstream origin master
$ flux get kustomizations
NAME READY MESSAGE REVISION SUSPENDED
flux-system True Applied revision: master/4d351c32ab089c8644671bc7627f9574fd412727 master/4d351c32ab089c8644671bc7627f9574fd412727 False
realtimeapp-dev True Applied revision: master/401ddd880d59f2dc0a65402bedfa6e1b4099666e master/401ddd880d59f2dc0a65402bedfa6e1b4099666e False
realtimeapp-prd True Applied revision: master/401ddd880d59f2dc0a65402bedfa6e1b4099666e master/401ddd880d59f2dc0a65402bedfa6e1b4099666e False
Нужно дождаться, чтобы появились realtimeapp-dev и realtimeapp-prd с состоянием READY - True
$ kubectl get ns
NAME STATUS AGE
default Active 6d9h
flux-system Active 18m
kube-node-lease Active 6d9h
kube-public Active 6d9h
kube-system Active 6d9h
realtime-dev Active 82s
realtime-prd Active 83s
$ kubectl get pods -n realtime-dev
NAME READY STATUS RESTARTS AGE
realtime-dev-5d86fb7b78-df672 1/1 Running 1 (47s ago) 61s
redis-dev-589977c5c6-m5ft5 1/1 Running 0 61s
$ kubectl get pods -n realtime-prd
NAME READY STATUS RESTARTS AGE
realtime-prd-576b496476-2sf6m 1/1 Running 0 34s
realtime-prd-576b496476-8cxcg 1/1 Running 0 34s
realtime-prd-576b496476-dd4f5 1/1 Running 0 34s
redis-prd-589977c5c6-65ch8 1/1 Running 0 34s
// Дать пинка, чтобы обновилось
$ flux reconcile kustomization realtimeapp-dev
Создание нового релиза
$ kubectl -n realtime-prd describe pod realtime-prd-576b496476-2sf6m | grep Image:
Image: gbaeke/flux-rt:1.0.2
По идее:
https://github.com/${GITHUB_USER}/realtimeapp/
New Release
1.0.3
Publish
В Actions должен пойти билд.
Должен сработать kustomize edit который поменяет версию.
https://github.com/wildmakaka/realtimeapp-infra/blob/master/deploy/overlays/prd/kustomization.yaml
Но я поменяю ее руками. На 1.0.1 т.к. 1.0.3 просто нет в репо автора.
$ kubectl -n realtime-prd describe pod realtime-prd-566d96bc7f-4xg8n | grep Image:
Image: gbaeke/flux-rt:1.0.1
04-Kubernetes deployments with Flux v2 Monitoring and Alerting
(Пропустил этот шаг)
$ cd ~/project/dev/flux-infra
$ flux create source git monitoring \
--url https://github.com/fluxcd/flux2 \
--branch master \
--interval 30m \
--export > ./app-cluster/monitor-source.yaml
$ flux create kustomization monitoring \
--source monitoring \
--path "./manifests/monitoring" \
--prune true \
--interval 1h \
--health-check="Deployment/prometheus.flux-system" \
--health-check="Deployment/grafana.flux-system" \
--export > ./app-cluster/monitor-kustomization.yaml
commit, push
$ watch flux get kustomizations
$ kubectl -n flux-system port-forward svc/grafana 3000:3000
Далее Alerting, какие-то teams и т.д. Наверное, имеет смысл пересмотреть.
$ flux get alert-providers
05-Kubernetes Deployments with Flux v2 Helm Basics
В этом уроке используются HELM репозитории. Bitnami для redis и автора для его проекта (кстати он им не поделился или я не нашел!).
$ helm repo add bitnami https://charts.bitnami.com/bitnami
$ helm install redis --set cluster.enabled=false,usePassword=false bitnami/redis
// Нет репо
$ helm install realtimeapp --wait .
$ helm uninstall realtimeapp
$ helm uninstall redis
Повторяем с использованием flux
$ flux create source helm bitnami \
--url https://charts.bitnami.com/bitnami \
--interval 1m0s \
--export > ./app-cluster/helmrepo-bitnami.yaml
$ flux get sources helm
$ flux create helmrelease redis \
--source=HelmRepository/bitnami \
--chart redis \
--release-name redis \
--target-namespace default \
--interval 5m0s \
--export > ./app-cluster/helmrelease-redis.yaml
$ flux get sources helm
$ export HELM_EXPERIMENTAL_OCI=1
$ helm chart save . realtimeapp:1.0.2
// Отправляем в helm registry
$ helm chart save . gebareg.azurecr.io/realtimeapp:1.0.2
$ helm registry login gebareg.azurecr.io
$ helm chart push gebareg.azurecr.io/realtimeapp:1.0.2
// Защищенный паролем репо
$ kubectl create secret generic acr --from-literal username=gebareg --from-literal "password=THEPASSWORD" -n flux-system
$ flux create source helm realtimeapp \
--url https://gebareg.auzrecr.io/helm/v1/repo/ \
--interval 1m0s \
--secret-ref acr \
--export > ./app-cluster/helmrepo-realtimeapp.yaml
$ flux create helmrelease realtimeapp \
--source=HelmRepository/realtimeapp \
--chart realtimeapp \
--release-name realtimeapp \
--target-namespace default \
--interval 5m0s \
--export > ./app-cluster/helmrelease-realtimeapp.yaml
Добавили некоторые изменения в конфиги редиса и realtimeapp.