Maak een Daemonset in Kubernetes

Een DaemonSet zorgt ervoor dat alle Knooppunten in de Kubernetes Cluster een kopie van een Pod draaien. Elke node heeft dan een kopie van de pod. Als nodes aan de cluster worden toegevoegd, worden er Pods aan toegevoegd en als nodes uit de cluster worden verwijderd, worden de Pods verwijderd. Als we een DaemonSet verwijderen ruimt hij de Pods op die hij creƫerde.

Een DaemonSet zorgt ervoor dat op alle nodes een kopie van een Pod draait. Normaal wordt de node waarop een Pod draait door de planner gekozen, maar DaemonSet pods worden gemaakt en gepland door de DaemonSet controller.

Daemonset kan gebruikt worden:

  1. Om clusteropslag op elke node te draaien, zoals: glusterd, ceph
  2. Om logs te verzamelen op elke node, zoals: fluentd, logstash
  3. Om node monitoring uit te voeren op elke notitie, zoals: Prometheus Node Exporter, collectd, Datadog agent

Om meer te weten te komen over Daemonset, bezoek kubernetes.io de officiƫle documentatie van Kubernetes.

In dit artikel zullen we een Daemonset maken van “fluentd_elasticsearch”. Dit zal Pods van “fluentd_elasticsearch” aanmaken op elke node in het cluster. Ons Daemonset definitiebestand zal Toleratie voor Taint van de master knooppunten hebben, zodat Pods ook op de master knooppunt ingepland kunnen worden.

Pre-requisites

  1. Kubernetes Cluster met minstens 1 worker node.
    Wil je leren hoe je een Kubernetes Cluster maakt, klik dan hier. Deze gids helpt je een Kubernetes cluster te maken met 1 Master en 2 Nodes op AWS Ubuntu 18.04 EC2 Instances.

Wat zullen we doen?

  1. Maak een daemonset

Maak een Daemonset

Controleer of er een daemonset bestaat op de standaard namespace en op alle namespaces.

kubectl get daemonsets #Get daemonsets from the default namespace
kubectl get daemonsets --all-namespaces #Get daemonsets from all namespace using --all-namespace option

get-system-daemonsets

In de bovenstaande schermafbeelding zie je dat er een paar Daemonset beschikbaar zijn. Al deze Daemonset zijn voor Cluster componenten.

Haal nu pods tevoorschijn die bij de “kube-system” namespace horen.

kubectl  get pods -n kube-system #Get pods from the "kube-system" namespace

get-system-pods

Al deze pods die je in de bovenstaande schermafbeelding ziet horen bij de Daemonset van cluster componenten.

Verkrijg een lijst van proxy pods.

kubectl get pods -n kube-system | grep proxy #Get pods from the "kube-system" namespace and grep for proxy

Ga na wat proxy pods bestuurt.

kubectl describe pod kube-proxy-s5vzp -n kube-system #Describe the pod from the "kube-system" namespace

Verkrijg details van de daemonset die de proxy pods bestuurt.

kubectl describe daemonset kube-proxy -n kube-system #Describe the daemonset from the "kube-system" namespace

controleer-pod-gecontroleerd-door-daemonset

Maak een bestand met de volgende daemonset definitie erin.

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

my-daemonset-definition

In de bovenstaande definitie hebben we een Toleratie naar de Taint van de master node. Hierdoor zal de pod ook op de master node geplaatst kunnen worden.

Maak een daemonset met behulp van het definitiebestand dat in de bovenstaande stap is gemaakt.

kubectl create -f my-daemonset.yml #Create a daemonset 
kubectl get daemonset -n kube-system #Get daemonset from the "kube-system" namespace

create-a-daemonset

Deze deamonset is gemaakt in de “kube-system” naamruimte.

Beschrijf de daemonset die we zojuist gemaakt hebben in de “kube-system” namespace.

kubectl  describe daemonset my-fluentd-elasticsearch-daemonset -n kube-system #Describe the daemonset from the "kube-system" namespace

get-daemonset-details

In de bovenstaande schermafbeelding is te zien dat de Pods op 2 nodes zijn ingezet.

Nu kunnen we details krijgen van de pods die als daemonsets op 2 knooppunten zijn ingezet.

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

get-pod-details-created-under-daemonset

In de bovenstaande schermafbeelding is te zien dat de Pods ingezet werden op worker node “node01” en master node “master”. De reden om de pod op de master node te laten plannen is Toleratie naar de Taint van de master node.

Conclusie

In dit artikel zagen we de stappen om een daemonset te maken en zagen we hoe de pods in daemonset op elke node in het Kubernetes cluster worden ingezet.