Installer une sonde sur Kubernetes

Une sonde a l’interieur du cluster surveille ses workloads via l’apiserver avec son propre ServiceAccount — aucun jeton a creer, aucun kubeconfig a copier — et execute les controles URL, API, TCP et base de donnees depuis le reseau du cluster lui-meme. Le chart Helm l’installe sous forme de StatefulSet a une replique qui s’enregistre aupres de votre Webserver des son premier demarrage.

Ce que la sonde execute dans le cluster

L’image est la sonde slim : sans navigateur.

Execute N’execute pas
Hotes de conteneurs (ce cluster, d’autres clusters, hotes Docker), URL, API, TCP, UDP, DNS, base de donnees, WebSocket, SNMP Parcours navigateur EUM / Web UI
Ping, une fois icmp.enabled=true Ping sans icmp.enabled — l’ICMP exige la capacite NET_RAW

Gardez une sonde VM ou Windows pour les parcours navigateur.

Avant de commencer

  • Kubernetes 1.24 ou plus recent, et Helm 3.
  • Une adresse d’API du Webserver joignable depuis le pod, sous la forme <hote>:<port> — un nom DNS convient.
  • La valeur _sharedInternal du webserver.json du Webserver. Tous les composants doivent porter la meme.
  • Le chart, dans l’archive de la sonde : deploy/helm/mugnsoft-probe.
  • L’image mugnsoft/monitor:<version>-slim dans un registre accessible au cluster. Pour la construire vous-meme, depuis les sources de la sonde :
docker build -f deploy/docker/Dockerfile --build-arg VERSION=4.2.0 -t registry.example.com/mugnsoft/monitor:4.2.0-slim .
docker push registry.example.com/mugnsoft/monitor:4.2.0-slim

Choisir comment le Webserver joint la sonde

Le Webserver appelle toujours la sonde sur son port d’API, en HTTPS. L’emplacement du Webserver decide du type de Service :

Le Webserver tourne service.type Le Webserver appelle Vous renseignez
Dans le meme cluster ClusterIP (par defaut) <release>-mugnsoft-probe.<namespace>.svc.cluster.local:8051 rien
A l’exterieur, noeuds joignables NodePort une adresse de noeud et le node port advertise.address, service.nodePort
A l’exterieur, via un load balancer LoadBalancer le nom DNS ou l’IP du load balancer advertise.address, une fois le load balancer cree
L’adresse est figee a l’enregistrement. La sonde indique au Webserver comment la joindre lors de son premier enregistrement. Si l’adresse change ensuite, corrigez l’IP et le port du composant sur la page Components du Webserver — une reinstallation ne reenregistre pas une sonde qui a conserve son volume.

Installer

Un Webserver dans le cluster :

helm install probe-k8s ./mugnsoft-probe \
  --namespace mugnsoft --create-namespace \
  --set probe.webserver=webserver.mugnsoft.svc.cluster.local:8050 \
  --set probe.sharedInternal='<la valeur _sharedInternal>' \
  --set probe.location=eu-west-1

Un Webserver a l’exterieur, via un load balancer restreint a l’adresse du Webserver :

helm install probe-k8s ./mugnsoft-probe \
  --namespace mugnsoft --create-namespace \
  --set probe.webserver=mugnsoft.example.com:8050 \
  --set probe.sharedInternal='<la valeur _sharedInternal>' \
  --set service.type=LoadBalancer \
  --set 'service.loadBalancerSourceRanges={203.0.113.10/32}' \
  --set advertise.address=probe-k8s.example.com

En NodePort, ajoutez --set service.type=NodePort --set service.nodePort=30851 --set advertise.address=<une adresse de noeud>.

Conservez vos reglages dans un fichier de valeurs plutot qu’en ligne de commande pour les mises a jour : helm upgrade probe-k8s ./mugnsoft-probe -n mugnsoft -f probe-values.yaml.

Approuver la sonde

La sonde s’enregistre des que le Webserver repond, et reessaie de toutes les 15 secondes a toutes les 5 minutes tant qu’il ne repond pas. Pour suivre l’operation :

kubectl -n mugnsoft logs statefulset/probe-k8s-mugnsoft-probe | grep autoRegister
autoRegister - registered probe-k8s-mugnsoft-probe with webserver.mugnsoft.svc.cluster.local:8050; approve it on the Webserver's Components page

Activez-la ensuite sur la page Components du Webserver, comme toute autre sonde. D’ici la, elle tourne et elle est saine, mais inactive.

Superviser ce cluster depuis la sonde

Ajoutez un hote de conteneurs sur le Webserver :

Champ Valeur
Runtime Kubernetes
Push to Probes la sonde que vous venez d’approuver
Endpoint laisser vide
Auth mode inCluster
Namespace vide — ou le namespace de la release avec rbac.scope=namespace

La sonde utilise le jeton du ServiceAccount que Kubernetes monte dans le pod et que le kubelet renouvelle ; il est relu a chaque controle. Voir Supervision des conteneurs pour la decouverte, l’evaluation et les limites.

Valeurs

Cle Par defaut Description
probe.webserver obligatoire L’API du Webserver sous la forme <hote>:<port>
probe.name le nom complet de la release Nom du composant sur le Webserver ; les underscores deviennent des tirets
probe.sharedInternal "" Le secret partage du compte machine ; doit correspondre a celui du Webserver
probe.existingSecret "" Un Secret avec une cle monitor.json, utilise au lieu d’en generer un
probe.location, probe.description "", Kubernetes in-cluster probe Affiches sur le Webserver
probe.port 8051 Le port d’ecoute de la sonde
probe.autoRegister true S’enregistrer au premier demarrage d’un volume vide
probe.settings {} Reglages monitor.json supplementaires, comme dataRetention
advertise.address le nom DNS du Service Ce que le Webserver appelle ; obligatoire en NodePort et LoadBalancer
advertise.port service.nodePort, sinon service.port Le port que le Webserver appelle
service.type ClusterIP ClusterIP, NodePort ou LoadBalancer
service.port, service.nodePort 8051, "" Ports du Service
service.loadBalancerSourceRanges [] Qui peut joindre la sonde via un load balancer
service.annotations {} Options du load balancer du cloud, comme un load balancer interne
rbac.scope cluster cluster pour tous les namespaces et les noeuds, namespace pour le seul namespace de la release
persistence.enabled, persistence.size true, 2Gi Le volume des cles, du certificat et des bases
persistence.storageClass "" La classe par defaut du cluster si vide
icmp.enabled false Executer en root avec NET_RAW pour que les moniteurs ping fonctionnent
image.repository, image.tag mugnsoft/monitor, <appVersion>-slim L’image de la sonde
resources 100m CPU, 128Mi demandes ; limite 512Mi Ressources du conteneur
extraEnv [] Variables d’environnement supplementaires

Ce que le chart cree

Objet Role
StatefulSet (1 replique) La sonde. Une replique est un composant enregistre ; une seconde serait une seconde identite sous le meme nom
PersistentVolumeClaim Cles, certificat et bases, pour qu’un pod redemarre conserve son identite et son historique
Service et Service headless L’adresse que le Webserver appelle, et le DNS stable du pod du StatefulSet
Secret monitor.json, secret partage compris
ServiceAccount, ClusterRole (ou Role) et liaison Acces en lecture seule : get et list sur pods, events, noeuds, namespaces, deployments, statefulsets, daemonsets, cronjobs, jobs et metriques des pods et des noeuds

Securite

  • Le conteneur tourne sous un utilisateur non root (UID 10001) avec un systeme de fichiers racine en lecture seule, sans elevation de privileges, toutes capacites retirees et le profil seccomp RuntimeDefault. icmp.enabled est la seule exception : root avec NET_RAW et DAC_OVERRIDE uniquement.
  • Le ServiceAccount peut lire et rien d’autre — il ne peut pas modifier le cluster.
  • rbac.scope=namespace le limite a un namespace. La sante des noeuds n’est alors pas disponible.
  • Protegez l’API de la sonde avec service.loadBalancerSourceRanges ou une network policy lorsqu’elle est exposee hors du cluster.

Depannage

Symptome Cause et correction
Le journal repete could not register ... retrying Le pod ne joint pas probe.webserver : nom DNS, port, ou network policy en sortie
the Webserver refused ...: a server is already defined with this name Un composant de ce nom existe deja — une installation precedente, ou un volume supprime. Supprimez l’ancien composant sur le Webserver, ou renseignez probe.name, puis redemarrez le pod
Enregistree et approuvee, mais le Webserver ne la joint pas L’adresse annoncee n’est pas joignable depuis le Webserver : verifiez service.type et advertise.address, puis corrigez l’IP et le port du composant sur le Webserver
Les moniteurs ping echouent avec operation not permitted Renseignez icmp.enabled=true
Le pod a redemarre et demande a s’enregistrer de nouveau La persistance est desactivee. Activez-la ; un volume vide est une nouvelle identite

Limites

  • Pas de parcours navigateur EUM dans l’image slim.
  • Une replique par release. Pour la redondance, installez une seconde release sous un autre nom et poussez les memes moniteurs vers les deux sondes.
  • Changer l’adresse annoncee apres l’enregistrement se fait a la main, sur le Webserver.
  • L’API de la sonde est servie en HTTPS avec un certificat auto-signe.

Traductions