Durante la guía se realizarán las configuraciones necesarias para habilitar las notificaciones de Flux y se explorarán distintas formas de utilizarlas para brindar visibilidad durante los despliegues del estado del cluster.
Flux permite enviar alertas a las siguientes plataformas y servicios: Google Chat, Microsoft Teams, Discord, Slack, Rocket, Webhook genérico, Webex, Sentry, Azure Event Hub.
Los pasos que se seguirán durante la guía son los siguientes:
-
Desplegar el servicio gitops-webhook.
Servicio que permitirá observar las alertas en caso de no disponer de alguno de los proveedores descritos arriba.
-
Configurar un proveedor de notificaciones.
-
Configurar las alertas que se desean recibir.
-
Desplegar la aplicación echobot.
-
Comprobar el funcionamiento de las alertas.
-
Mostrar alertas de error al intentar actualizar la aplicación echobot.
Vídeo de la explicación y la demo completa en este vídeo.
- Acceso para administrar un cluster de Kubernetes >=v1.19
- Tener instalado cliente Flux >=0.16.0 - instrucciones
export GITHUB_TOKEN=<your-token>
export GITHUB_USER=<your-username>
Utilice el comando bootstrap
para instalar los componentes de flux en el cluster y crear el repositorio en GitHub:
flux bootstrap github \
--owner=$GITHUB_USER \
--repository=gitops-flux-series-demo \
--branch=main \
--private=false \
--path=./clusters/demo
Resultado
► connecting to github.com
► cloning branch "main" from Git repository "https://github.com/sngular/gitops-flux-series-demo.git"
✔ cloned repository
► generating component manifests
✔ generated component manifests
✔ component manifests are up to date
► installing toolkit.fluxcd.io CRDs
◎ waiting for CRDs to be reconciled
✔ CRDs reconciled successfully
► 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-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDSTrIKbYAWLUjcG7ec6lWJ2KACfF5YB5KqpQcN+LmxkSYmJbFPBmlzZdtIUEvZcAORJYeMKvk+iAcZC6rPn0OCBKp3ypOiMC5HnF5Lnn4XPt1+Nwx30mC72RzkheFm+K3Q0kTySAi8QdKy94aWqBVpTdZzkJ0woNHJg/aL3gQnofXueiczwkMvB2B6x4vgdbBgLOrRl7YhtGz0B6e9a7U4EEBoPdzjti/w7OAQnOpCZ80TwYcuFCioPE0q2i3BgKLvt0x9rBikzuOSgqKFfoAy3zPETgWZ0kPSbHby3lv+NfwWaLVULVpkpNQTwxBbMJVDcwKuyTUacSGeZcUzS2mB
✔ configured deploy key "flux-system-main-flux-system-./cluster/namespaces" for "https://github.com/sngular/gitops-flux-series-demo"
► 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 Kustomization "flux-system/flux-system" to be reconciled
✔ Kustomization reconciled successfully
► confirming components are healthy
✔ source-controller: deployment ready
✔ kustomize-controller: deployment ready
✔ helm-controller: deployment ready
✔ notification-controller: deployment ready
✔ all components are healthy
Comprobar que el despliegue se ha realizado correctamente.
kubectl get pods --namespace flux-system
Resultado
NAME READY STATUS RESTARTS AGE
helm-controller-85bfd4959d-bfvnf 1/1 Running 0 3m13s
kustomize-controller-6977b8cdd4-xncbj 1/1 Running 0 3m13s
source-controller-85fb864746-xhrvb 1/1 Running 0 3m12s
notification-controller-5c4d48f476-28g7q 1/1 Running 0 3m13s
Clonar el repositorio que Flux está sincronizando con el cluster.
{
git clone [email protected]:$GITHUB_USER/gitops-flux-series-demo.git
cd gitops-flux-series-demo
}
Se va a desplegar el servicio gitops-webhook que actuará como webhook genérico y recibirá las alertas enviadas por Flux.
Crear carpeta para almacenar las fuentes:
mkdir ./clusters/demo/sources/
Crear definición de HelmRepository para los charts de Sngular:
flux create source helm sngular \
--url=https://sngular.github.io/gitops-helmrepository/ \
--interval=5m \
--namespace=flux-system \
--export > clusters/demo/sources/sngular-helmrepository.yaml
Crear carpeta para el sistema de notificaciones:
mkdir ./clusters/demo/notification-system/
Crear el namespace para las notificaciones:
cat <<EOF > ./clusters/demo/notification-system/namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: notification-system
EOF
Crear fichero HelmRelease para desplegar el servicio de notificaciones:
flux create helmrelease generic \
--interval=1m \
--source=HelmRepository/sngular.flux-system \
--chart=webhook \
--chart-version="0.1.1" \
--namespace=notification-system \
--export > clusters/demo/notification-system/generic-helmrelease.yaml
tree
.
└── clusters
└── demo
├── flux-system
│ ├── gotk-components.yaml
│ ├── gotk-sync.yaml
│ └── kustomization.yaml
├── notification-system
│ ├── generic-helmrelease.yaml
│ └── namespace.yaml
└── sources
└── sngular-helmrepository.yaml
Agregar cambios al repositorio:
{
git add .
git commit -m 'Deploy notification system'
git push origin main
}
Utilice el siguiente comando para conocer cómo van sucediendo los cambios:
watch -n1 "flux get source chart --all-namespaces && echo \
&& flux get helmrelease --all-namespaces && echo \
&& kubectl get pods --namespace notification-system"
Acelerar el ciclo de reconciliación:
flux reconcile kustomization flux-system --with-source
Para comprobar que el servicio está funcionando correctamente se utilizara el siguiente comando:
kubectl port-forward \
--namespace notification-system \
svc/generic-webhook 8080:80 > /dev/null 2>&1 &
Ahora podrá consultar al siguiente enlace:
curl http://localhost:8080/all
Resultado
Total notifications: 0
Crear carpeta y namespace gitops-series
:
mkdir -p ./clusters/demo/gitops-series
cat <<EOF > ./clusters/demo/gitops-series/namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: gitops-series
EOF
El primer proveedor de notificaciones a crear enviará los mensajes al sistema desplegado en el namespace notification-system
.
flux create alert-provider generic \
--namespace gitops-series \
--type generic \
--address "http://generic-webhook.notification-system/webhook" \
--export > ./clusters/demo/gitops-series/generic-provider.yaml
Resultado
---
apiVersion: notification.toolkit.fluxcd.io/v1beta1
kind: Provider
metadata:
name: generic
namespace: gitops-series
spec:
address: http://generic-webhook.notification-system/webhook
type: generic
Adicionar los cambios al repositorio:
{
git add .
git commit -m 'Add generic provider'
git push origin main
}
flux get alert-providers --all-namespaces
Resultado
NAMESPACE NAME READY MESSAGE
gitops-series generic True Initialized
Crear una alerta que permita permita conocer cuando un objeto de flux se modifica:
flux create alert generic \
--namespace gitops-series \
--provider-ref generic \
--event-severity info \
--event-source "HelmRepository/*,HelmRelease/*" \
--export > ./clusters/demo/gitops-series/generic-alerts.yaml
Resultado
apiVersion: notification.toolkit.fluxcd.io/v1beta1
kind: Alert
metadata:
name: generic
namespace: gitops-series
spec:
eventSeverity: info
eventSources:
- kind: HelmRepository
name: '*'
- kind: HelmRelease
name: '*'
providerRef:
name: generic
{
git add .
git commit -m 'Add alert crd'
git push origin main
}
flux get alerts --all-namespaces
Resultado
NAMESPACE NAME READY MESSAGE SUSPENDED
gitops-series generic True Initialized False
Crear el fichero HelmRelease asociado al servicio echobot:
flux create helmrelease echobot \
--interval=1m \
--source=HelmRepository/sngular.flux-system \
--chart=echobot \
--chart-version="0.3.5" \
--namespace=gitops-series \
--export > clusters/demo/gitops-series/echobot-helmrelease.yaml
Añadir los cambios en el repositorio:
{
git add .
git commit -m 'Deploy echobot service'
git push origin main
}
Sincronizar la información sin esperar a al ciclo de reconciliación:
flux reconcile kustomization flux-system --with-source
Comprobar que han llegado las alertas al canal de Discord y al servicio gitops-webhook
:
curl http://localhost:8080/all
Listar los pods del servicio desplegado:
kubectl get pods --namespace gitops-series
Si se desea eliminar las alertas utilizar el comando curl http://localhost:8080/clear
.
kubectl delete hr -n gitops-series echobot
Sincronizar la información sin esperar a al ciclo de reconciliación:
flux reconcile kustomization flux-system --with-source
Comprobar que han llegado las alertas al canal de Discord y al servicio gitops-webhook
:
curl http://localhost:8080/all
Si se desea eliminar las alertas utilizar el comando curl http://localhost:8080/clear
.
Crear un secreto con el campo address
para almacenar la url del webhook:
kubectl create secret generic discord-webhook-url \
--namespace gitops-series \
--from-literal="address=https://discord.com/api/webhooks/843196129700610088/XAgX4wPsIlyW8X4BVqkWcKotiI4gU12cgDw9ufjuNV_wXeLKATlXVilLKZXch6Jhubf6"
Crear el provider de Discord:
flux create alert-provider discord \
--namespace gitops-series \
--type discord \
--channel flux-notificaciones \
--username "Flux [demo-cluster]" \
--secret-ref discord-webhook-url \
--export > ./clusters/demo/gitops-series/discord-provider.yaml
Resultado
---
apiVersion: notification.toolkit.fluxcd.io/v1beta1
kind: Provider
metadata:
name: discord
namespace: gitops-series
spec:
type: discord
channel: flux-notificaciones
secretRef:
name: discord-webhook-url
username: Flux [demo-cluster]
EOF
Configurar las alertas que serán enviadas a Discord
flux create alert discord \
--namespace gitops-series \
--provider-ref discord \
--event-severity info \
--event-source "HelmRelease/*" \
--export > ./clusters/demo/gitops-series/discord-alerts.yaml
Resultado
---
apiVersion: notification.toolkit.fluxcd.io/v1beta1
kind: Alert
metadata:
name: discord
namespace: gitops-series
spec:
eventSeverity: info
eventSources:
- kind: HelmRelease
name: '*'
providerRef:
name: discord
Añadir los cambios en el repositorio:
{
git add .
git commit -m 'Add provider and alerts for discord'
git push origin main
}
Sincronice el estado de las alertas y providers adicionados
{
flux reconcile alert-provider discord --namespace gitops-series
flux reconcile alert discord --namespace gitops-series
}
Resultado
► annotating Provider discord in gitops-series namespace
✔ Provider annotated
◎ waiting for reconciliation
✔ Provider reconciliation completed
► annotating Alert discord in gitops-series namespace
✔ Alert annotated
✔ Alert reconciliation completed
Si quieres desinstalar Flux puedes utilizar este comando:
flux uninstall --silent
Compruebe que el repositorio en GitHub no ha sido eliminado.
Resultado
► deleting components in flux-system namespace
✔ 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
✔ 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
✔ Kustomization/flux-system/flux-system 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/providers.notification.toolkit.fluxcd.io deleted
✔ CustomResourceDefinition/receivers.notification.toolkit.fluxcd.io deleted
✔ Namespace/flux-system deleted
✔ uninstall finished
- Discord
Configuración
---
apiVersion: notification.toolkit.fluxcd.io/v1beta1
kind: Provider
metadata:
name: discord
namespace: gitops-series
spec:
channel: flux-notificaciones
secretRef:
name: discord-webhook-url
type: discord
username: Flux [demo-cluster]
- Teams
Configuración
---
apiVersion: notification.toolkit.fluxcd.io/v1beta1
kind: Provider
metadata:
name: msteams
namespace: gitops-series
spec:
type: msteams
channel: flux-notificaciones
address: https://ORGANIZATION.webhook.office.com/WEBHOOK
- Slack
Configuración
---
apiVersion: notification.toolkit.fluxcd.io/v1beta1
kind: Provider
metadata:
name: slack
namespace: gitops-series
spec:
type: slack
channel: flux-notificaciones
address: https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK