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.