Aller au contenu principal

Kwatch un petit outil d'alerting pour Kubernetes

· 3 minutes de lecture
Stéphane ROBERT
Consultant DevOps

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.yaml
kubectl apply -f config.yaml

Un petit tour pour voir quels sont les paramètres dont nous disposons :

apiVersion: v1
kind: Namespace
metadata:
  name: kwatch
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: kwatch
  namespace: kwatch
data:
  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: v1
kind: Namespace
metadata:
  name: kwatch
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: kwatch
  namespace: kwatch
data:
  config.yaml: |
    maxRecentLogLines: 20
    alert:
      teams:
          webhook: <webhook_url>

Allez on applique :

kubectl apply -f config.yaml
namespace/kwatch created
configmap/kwatch created

Maintenant installons l'application :

curl  -L https://raw.githubusercontent.com/abahmed/kwatch/v0.3.0/deploy/deploy.yaml -o deploy.yaml
kubectl apply -f deploy.yaml
namespace/kwatch unchanged
clusterrole.rbac.authorization.k8s.io/kwatch created
serviceaccount/kwatch created
clusterrolebinding.rbac.authorization.k8s.io/kwatch created
deployment.apps/kwatch created

Test de kWatch

Nous allons faire un simple deployment qui tombera en erreur car son LivenessProbe sera faux :

apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: kuard
  name: kuard
spec:
  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 pod
NAME                       READY   STATUS    RESTARTS      AGE
kuard-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.

Source