DaemonSet
DaemonSet
Un DaemonSet est un type de ressource Kubernetes qui garantit qu'un pod s'exécute sur chaque nœud (node) du cluster. Cela signifie qu'il crée automatiquement un pod sur chaque nœud, et si de nouveaux nœuds sont ajoutés au cluster, il crée également des pods sur ces nœuds. Les DaemonSets sont couramment utilisés pour des tâches système ou réseau qui doivent s'exécuter sur chaque nœud, tels que des agents de surveillance ou des proxies réseau.
Sschéma pour illustrer les composants clés :

Exemple de DaemonSet node info:
Créer un DaemonSet qui va créer un répertoire nommé /node-info sur chaque nœud, avec un fichier contenant le nom du nœud (par exemple, node-name.txt) à l’intérieur de ce répertoire. Ce fichier sera créé grâce à un script Bash qui s'exécutera lorsque le pod du DaemonSet sera lancé sur chaque nœud.
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: node-info
namespace: default
spec:
selector:
matchLabels:
app: node-info
template:
metadata:
labels:
app: node-info
spec:
containers:
- name: node-info
image: busybox
command: ["/bin/sh", "-c"]
args:
- "mkdir -p /node-info && echo $(NODE_NAME) > /node-info/node-name.txt && sleep 3600"
env:
- name: NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
volumeMounts:
- name: node-info
mountPath: /node-info
volumes:
- name: node-info
hostPath:
path: /node-info
type: DirectoryOrCreate
restartPolicy: Always
Explications des Sections du Manifeste YAML
-
Image : Utilise busybox, une image légère, qui permet d'exécuter des commandes simples en shell.
-
Commande et Arguments :
- La commande mkdir -p /node-info && echo $(NODE_NAME) > /node-info/node-name.txt && sleep 3600 :
- mkdir -p /node-info : Crée le répertoire /node-info sur chaque nœud.
- echo $(NODE_NAME) > /node-info/node-name.txt : Écrit le nom du nœud dans le fichier node-name.txt.
- sleep 3600 : Garde le pod en cours d’exécution pendant une heure, permettant au DaemonSet de rester actif.
- La commande mkdir -p /node-info && echo $(NODE_NAME) > /node-info/node-name.txt && sleep 3600 :
-
Variable d’Environnement :
- NODE_NAME : Définit la variable avec le nom du nœud actuel en utilisant spec.nodeName.
-
Volumes :
- hostPath : Monte le répertoire /node-info sur le nœud hôte. DirectoryOrCreate crée le répertoire s’il n'existe pas.
-
RestartPolicy : Always assure le redémarrage du pod si le processus s’arrête.
Déploiement
Pour appliquer le DaemonSet, enregistrez le manifeste YAML dans un fichier (par exemple, node-info-daemonset.yaml) et exécutez :
kubectl apply -f node-info-daemonset.yaml

Vérification
Pour vérifier que le fichier a bien été créé sur chaque nœud, vous pouvez accéder aux nœuds et vérifier le contenu du répertoire /node-info :
kubectl get pods -o wide # Récupère les noms des pods et les nœuds sur lesquels ils tournent
Ensuite, vous pouvez utiliser SSH pour vous connecter aux nœuds et vérifier :
# Sur chaque nœud
cat /node-info/node-name.txt

Exemple de DaemonSet node exporter:
Déployer Node Exporter de Prometheus sur chaque nœud de votre cluster Kubernetes. Node Exporter est un outil de monitoring qui collecte les métriques système (CPU, mémoire, disque, réseau) des nœuds et les expose pour qu'ils soient scrappés par Prometheus. Un service de type ClusterIP pour rendre les métriques accessibles.
apiVersion: v1
kind: Namespace
metadata:
name: monitoring
---
apiVersion: v1
kind: Service
metadata:
name: node-exporter
namespace: monitoring
labels:
app: node-exporter
spec:
ports:
- port: 9100
name: metrics
selector:
app: node-exporter
clusterIP: None # Utilisé pour un service de type "headless"
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: node-exporter
namespace: monitoring
labels:
app: node-exporter
spec:
selector:
matchLabels:
app: node-exporter
template:
metadata:
labels:
app: node-exporter
spec:
containers:
- name: node-exporter
image: prom/node-exporter:latest
args:
- "--path.rootfs=/host"
ports:
- containerPort: 9100
name: metrics
volumeMounts:
- name: root
mountPath: /host
readOnly: true
hostNetwork: true
hostPID: true
securityContext:
runAsUser: 65534 # nobody user
terminationGracePeriodSeconds: 30
volumes:
- name: root
hostPath:
path: /
Explication du Manifeste YAML
-
Namespace : Le DaemonSet est déployé dans le namespace monitoring. Assurez-vous que ce namespace existe, ou remplacez-le par default si nécessaire.
-
VolumeMounts :
- root: Monté depuis / sur l'hôte, permettant à Node Exporter de collecter des métriques système en lisant directement depuis le système de fichiers de l'hôte.
-
hostNetwork et hostPID :
- hostNetwork : Permet à Node Exporter d’utiliser le réseau de l’hôte, ce qui le rend accessible sur l’IP de chaque nœud.
- hostPID : Permet d’accéder à tous les processus de l’hôte pour une collecte de métriques plus approfondie.
-
ContainerPort : Le port 9100 est ouvert pour exposer les métriques Node Exporter.
-
SecurityContext :
- runAsUser: 65534 : Exécute le container avec l'utilisateur "nobody" pour des raisons de sécurité.
-
Volumes :
- hostPath: Utilisé pour monter le système de fichiers de l’hôte afin de lire les informations directement depuis celui-ci.
- Le service permet à Prometheus de découvrir tous les pods Node Exporter sans load balancing, car chaque pod expose directement les métriques de son nœud via un endpoint unique
Appliquer le ficher node-exporter:
kubectl apply -f node-exporter-daemonset.yaml

Un port-forward pour voir les metrics des nodes:
kubectl -n monitoring port-forward svc/node-exporter 9100:9100
Acceder dans le navigateur pour voir la version du node-export : http://127.0.0.1:9100/

Pour voir les metrics: http://127.0.0.1:9100/metrics

Commentaires
Aucun commentaire pour le moment.