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
_sharedInternalduwebserver.jsondu 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>-slimdans 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 |
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.enabledest la seule exception : root avecNET_RAWetDAC_OVERRIDEuniquement. - Le ServiceAccount peut lire et rien d’autre — il ne peut pas modifier le cluster.
rbac.scope=namespacele limite a un namespace. La sante des noeuds n’est alors pas disponible.- Protegez l’API de la sonde avec
service.loadBalancerSourceRangesou 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.