Créer un Daemonset dans Kubernetes
Un DaemonSet s’assure que tous les nœuds du cluster Kubernetes exécutent une copie d’un Pod. Chaque nœud aura une copie du pod. Lorsque des nœuds sont ajoutés au cluster, des pods leur sont ajoutés et lorsque des nœuds sont retirés du cluster, les pods sont supprimés. Si on supprime un DaemonSet, il nettoiera les Pods qu’il a créés.
Un DaemonSet garantit que tous les nœuds exécutent une copie d’un Pod. Normalement, le nœud sur lequel un Pod s’exécute est sélectionné par le planificateur mais les pods DaemonSet sont créés et planifiés par le contrôleur DaemonSet.
Daemonset peut être utilisé :
- Pour exécuter un stockage en cluster sur chaque nœud, comme : glusterd, ceph
- Pour exécuter la collecte de logs sur chaque nœud, par exemple : fluentd, logstash
- Pour exécuter la surveillance des nœuds sur chaque note, comme : Prometheus Node Exporter, collectd, Datadog agent
Pour en savoir plus sur Daemonset, visitekubernetes.io la documentation officielle de Kubernetes.
Dans cet article, nous allons créer un Daemonset de « fluentd_elasticsearch ». Cela permettra de créer des Pods de « fluentd_elasticsearch » sur chaque nœud du cluster. Notre fichier de définition Daemonset aura une tolérance pour Taint des nœuds maîtres pour permettre aux Pods d’être planifiés sur le nœud maître également.
Pré-requis
- Cluster Kubernetes avec au moins 1 nœud de travail.
Si tu veux apprendre à créer un cluster Kubernetes, cliqueici. Ce guide t’aidera à créer un cluster Kubernetes avec 1 maître et 2 nœuds sur des instances EC2 AWS Ubuntu 18.04.
Qu’est-ce que nous allons faire ?
- Créer un Daemonset
Créer un Daemonset
Vérifie s’il existe un daemonset sur l’espace de noms par défaut et sur tous les espaces de noms.
kubectl get daemonsets #Get daemonsets from the default namespace
kubectl get daemonsets --all-namespaces #Get daemonsets from all namespace using --all-namespace option
Dans la capture d’écran ci-dessus, tu peux voir qu’il y a quelques Daemonset disponibles. Tous ces Daemonset sont pour les composants du Cluster.
Maintenant, récupère les pods qui appartiennent à l’espace de noms « kube-system ».
kubectl get pods -n kube-system #Get pods from the "kube-system" namespace
Tous ces pods vus dans la capture d’écran ci-dessus appartiennent au Daemonset des composants de cluster.
Obtiens une liste des pods proxy.
kubectl get pods -n kube-system | grep proxy #Get pods from the "kube-system" namespace and grep for proxy
Vérifie ce qui contrôle les pods proxy.
kubectl describe pod kube-proxy-s5vzp -n kube-system #Describe the pod from the "kube-system" namespace
Obtiens les détails du daemonset qui contrôle les pods de proxy.
kubectl describe daemonset kube-proxy -n kube-system #Describe the daemonset from the "kube-system" namespace
Crée un fichier contenant la définition de daemonset suivante.
vim my-daemonset.yml
apiVersion: apps/v1 kind: DaemonSet metadata: name: my-fluentd-elasticsearch-daemonset namespace: kube-system labels: k8s-app: fluentd-logging spec: selector: matchLabels: name: fluentd-elasticsearch template: metadata: labels: name: fluentd-elasticsearch spec: tolerations: - key: node-role.kubernetes.io/master effect: NoSchedule containers: - name: fluentd-elasticsearch image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2 resources: limits: memory: 200Mi requests: cpu: 100m memory: 200Mi volumeMounts: - name: varlog mountPath: /var/log - name: varlibdockercontainers mountPath: /var/lib/docker/containers readOnly: true terminationGracePeriodSeconds: 30 volumes: - name: varlog hostPath: path: /var/log - name: varlibdockercontainers hostPath: path: /var/lib/docker/containers
Dans la définition ci-dessus, nous avons une Tolérance à la souillure du nœud maître. Cela permettra au pod d’être placé sur le nœud maître également.
Crée un daemonset en utilisant le fichier de définition créé à l’étape précédente.
kubectl create -f my-daemonset.yml #Create a daemonset
kubectl get daemonset -n kube-system #Get daemonset from the "kube-system" namespace
Ce daemonset a été créé dans l’espace de noms « kube-system ».
Décris le daemonset que nous venons de créer dans l’espace de noms « kube-system ».
kubectl describe daemonset my-fluentd-elasticsearch-daemonset -n kube-system #Describe the daemonset from the "kube-system" namespace
Dans la capture d’écran ci-dessus, on peut voir que les Pods ont été déployés sur 2 nœuds.
Maintenant, nous pouvons obtenir les détails des pods qui sont déployés comme daemonsets sur 2 nœuds.
kubectl get pods -n kube-system | grep my-fluentd-elasticsearch-daemonset #Get pods from the "kube-system" namespace and grep
kubectl describe pod my-fluentd-elasticsearch-daemonset-4t9vs -n kube-system | grep Node #Describe the pods from the "kube-system" namespace and grep
kubectl describe pod my-fluentd-elasticsearch-daemonset-kxfjj -n kube-system | grep Node #Describe the pod from the "kube-system" namespace and grep
Dans la capture d’écran ci-dessus, on peut voir que les pods ont été déployés sur le nœud de travail « node01 » et le nœud maître « master ». La raison pour laquelle le pod a été programmé sur le nœud maître est la tolérance à la souillure du nœud maître.
Conclusion
Dans cet article, nous avons vu les étapes pour créer un daemonset et vu comment les pods du daemonset sont déployés sur chaque nœud du cluster Kubernetes.