Dans cet exercice, vous allez créer un DaemonSet.

Dans le fichier log-ds.yaml, créez une spécification de DaemonSet avec les caractéristiques suivantes:

  • le DaemonSet à le nom log
  • chaque Pod a un seul container basé sur l’image alpine
  • chaque container a accès au répertoire /var/log/ sur le système de fichier du node sur lequel il tourne, ce répertoire étant monté à l’emplacement /var/log/node dans le système de fichier du container
  • chaque container écrit le contenu des fichiers *.log (situés dans /var/log/node) dans sa sortie standard

Créez le DaemonSet défini dans cette spécification et regardez les logs des Pods créés.

Vous pourrez utiliser la documentation suivante pour vous aider: https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/.

Supprimez ensuite le DaemonSet.


Solution
  • La spécification suivante définit le DaemonSet log dont chaque Pod a un seul container basé sur l’image alpine:
log-ds.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: log
spec:
  selector:
    matchLabels:
      app: log
  template:
    metadata:
      labels:
        app: log
    spec:
      containers:
      - name: log
        image: alpine
  • Nous ajoutons la définition d’un volume hostPath permettant d’accéder au répertoire /var/log de la machine hôte et nous mettons son contenu à disposition dans le répertoire /var/log/node du container:
log-ds.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: log
spec:
  selector:
    matchLabels:
      app: log
  template:
    metadata:
      labels:
        app: log
    spec:
      containers:
      - name: log
        image: alpine
        volumeMounts:
        - name: varlog
          mountPath: /var/log/node
      volumes:
      - name: varlog
        hostPath:
          path: /var/log
  • Nous ajoutons une commande pour faire en sorte que le container écrive le contenu des fichiers *.log, présents dans le répertoire /var/log/nodes, dans sa sortie standard:
log-ds.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: log
spec:
  selector:
    matchLabels:
      app: log
  template:
    metadata:
      labels:
        app: log
    spec:
      containers:
      - name: log
        image: alpine
        command: ["/bin/sh", "-c"]
        args: ["tail -f /var/log/node/*.log"]
        volumeMounts:
        - name: varlog
          mountPath: /var/log/node
      volumes:
      - name: varlog
        hostPath:
          path: /var/log

Une fois sauvegardée dans le fichier log-ds.yaml nous pouvons créer ce DaemonSet:

kubectl apply -f log-ds.yaml

Nous listons les Pods associés:

kubectl get pods -l app=log

Nous pouvons alors voir les logs de l’un des Pods associés au DaemonSet:

kubectl logs ds/log

Dans un contexte de production, un DaemonSet pourrait être utilisé pour déployer des Pods qui vont lire les logs de chacun des nodes et les envoyer sur une solution de gestion de logs centralisée (telle que ElasticSearch, Splunk, …)

Vous pouvez ensuite supprimer ce DaemonSet:

kubectl delete ds log