Kwatch un petit outil d'alerting pour Kubernetes
Publié le :
kwatch ↗ est un projet open source récent, qui permet de surveiller tous les événements dans votre cluster Kubernetes (K8s) comme les plantages de vos pods en cours d’exécution et à envoyer en temps réel des notifications sur vos canaux préférés (Slack, Discord, Teams, etc. ). Ça peut être utile dans le cas où vous n’avez pas mis en place Prometheus qui intègre un alertmanager, par exemple sur des clusters de recette.
Installation de Kwatch
Pour le moment je n’ai pas trouvé trace de chart Helm permettant d’installer kwatch. Ce serait un bon exemple pour notre billet sur le développement d’un chart Helm non ? Donc on va faire l’installation à la main.
Dans un premier temps récupérons la config de l’application :
curl -L https://raw.githubusercontent.com/abahmed/kwatch/v0.3.0/deploy/config.yaml -o config.yamlkubectl apply -f config.yaml
Un petit tour pour voir quels sont les paramètres dont nous disposons :
apiVersion: v1kind: Namespacemetadata: name: kwatch---apiVersion: v1kind: ConfigMapmetadata: name: kwatch namespace: kwatchdata: config.yaml: | maxRecentLogLines: <optional_number_of_lines> alert: slack: webhook: <webhook_url> pagerduty: integrationKey: <integration_key> discord: webhook: <webhook_url> telegram: token: <token_key> chatId: <chat_id> teams: webhook: <webhook_url> rocketchat: webhook: <webhook_url> namespaces: - <optional_namespace>
On voit qu’il est possible de définir deux paramètres généraux :
maxRecentLogLines : nombre de lignes des logs qui sont intégrés dans les messages. Si ce paramètre n’est pas défini alors toutes les lignes de logs seront récupérées
namespaces : Liste des namespace à surveiller. Si ce paramètre n’est pas défini alors tous les namespaces seront surveillés.
Ensuite dans la partie alert
ne laissez que votre outil de communication
collaboratif de votre choix. Je prendrais ici teams.
Avant d’appliquer la config de kWatch il faut donc créer le WebHook sur Teams ↗.
Pour tester votre WebHook :
curl -H 'Content-Type: application/json' -d '{"@context": "http://schema.org/extensions","@type": "MessageCard", "text": "Hello World"}' <webhook_url>
Voici la config que je vais utiliser pour envoyer les erreurs sur Teams (changer l’url avec celle de votre webhook) :
apiVersion: v1kind: Namespacemetadata: name: kwatch---apiVersion: v1kind: ConfigMapmetadata: name: kwatch namespace: kwatchdata: config.yaml: | maxRecentLogLines: 20 alert: teams: webhook: <webhook_url>
Allez on applique :
kubectl apply -f config.yamlnamespace/kwatch createdconfigmap/kwatch created
Maintenant installons l’application :
curl -L https://raw.githubusercontent.com/abahmed/kwatch/v0.3.0/deploy/deploy.yaml -o deploy.yamlkubectl apply -f deploy.yamlnamespace/kwatch unchangedclusterrole.rbac.authorization.k8s.io/kwatch createdserviceaccount/kwatch createdclusterrolebinding.rbac.authorization.k8s.io/kwatch createddeployment.apps/kwatch created
Test de kWatch
Nous allons faire un simple deployment
qui tombera en erreur car son
LivenessProbe
sera faux :
apiVersion: apps/v1kind: Deploymentmetadata: creationTimestamp: null labels: app: kuard name: kuardspec: replicas: 1 selector: matchLabels: app: kuard template: metadata: creationTimestamp: null labels: app: kuard spec: containers: - name: kuard-amd64 image: gcr.io/kuar-demo/kuard-amd64:blue ports: - containerPort: 8080 livenessProbe: failureThreshold: 5 httpGet: path: /healthy1 port: 8080 initialDelaySeconds: 3 periodSeconds: 3
Vérifions que cela fonctionne :
kubectl get podNAME READY STATUS RESTARTS AGEkuard-7fd98ddfbd-g779r 1/1 Running 2 (15s ago) 51s
Oui il restart !!!
Et quelques secondes plus tard ping !
Si vous voulez corriger l’erreur du LivenessProbe
, il faut corriger le path
en enlevant le 1. Ce qui donne :
kubectl edit deployments.apps kuard
livenessProbe: failureThreshold: 5 httpGet: path: /healthy port: 8080 initialDelaySeconds: 3 periodSeconds: 3
Plutôt prometteur. Donc à surveiller. Je l’ai ajouté dans ma liste de project github à surveiller.