Erstellen eines Daemonsets in Kubernetes
Ein DaemonSet sorgt dafür, dass auf allen Knoten im Kubernetes-Cluster eine Kopie eines Pods läuft. Jeder Knoten verfügt über eine Kopie des Pods. Wenn dem Cluster Knoten hinzugefügt werden, werden ihnen Pods hinzugefügt, und wenn Knoten aus dem Cluster entfernt werden, werden die Pods entfernt. Wenn wir ein DaemonSet löschen, werden die von ihm erstellten Pods bereinigt.
Ein DaemonSet stellt sicher, dass alle Knoten eine Kopie eines Pods ausführen. Normalerweise wird der Knoten, auf dem ein Pod läuft, vom Planer ausgewählt, aber DaemonSet-Pods werden vom DaemonSet-Controller erstellt und geplant.
Daemonset kann verwendet werden:
- Um Cluster-Speicher auf jedem Knoten auszuführen, wie z.B.: glusterd, ceph
- So führen Sie die Logsammlung auf jedem Knoten aus, z. B.: fluentd, logstash
- So führen Sie die Knotenüberwachung bei jeder Notiz aus, z. B: Prometheus-Knotenexporteur, gesammelt, Datadog-Agent
Um mehr über Daemonset zu erfahren, besuchen Sie kubernetes.io, die offizielle Dokumentation von Kubernetes.
In diesem Artikel werden wir ein Daemonset der „fluentd_elasticsearch“ erstellen. Dadurch werden Pods von „fluentd_elasticsearch“ auf jedem Knoten im Cluster erstellt. Unsere Daemonset-Definitionsdatei wird die Toleration for Taint der Master-Knoten enthalten, damit Pod auch auf dem Master-Knoten geplant werden kann.
Vorraussetzungen
- Kubernetes Cluster mit mindestens 1 Worker-Knoten.
Wenn Sie lernen möchten, wie man einen Kubernetes Cluster erstellt, klicken Sie hier. Dieses Handbuch hilft Ihnen, einen Kubernetes-Cluster mit 1 Master- und 2 Worker-Knoten auf AWS Ubuntu 18.04 EC2-Instanzen zu erstellen.
Was werden wir tun?
- Erstellen eines Daemonsets
Ein Daemonset erstellen
Prüfen Sie, ob ein Dämonset im Standard-Namensraum und in allen Namensräumen vorhanden ist.
kubectl get daemonsets #Get daemonsets from the default namespace
kubectl get daemonsets --all-namespaces #Get daemonsets from all namespace using --all-namespace option
Im obigen Screenshot sehen Sie, dass einige wenige Daemonsets verfügbar sind. Alle diese Daemonsets sind für Cluster-Komponenten.
Besorgen Sie sich jetzt Pods, die zum Namensraum „kube-system“ gehören.
kubectl get pods -n kube-system #Get pods from the "kube-system" namespace
Alle diese Pods, die im obigen Screenshot zu sehen sind, gehören zum Daemonset der Cluster-Komponenten.
Besorgen Sie eine Liste von Proxy-Pods.
kubectl get pods -n kube-system | grep proxy #Get pods from the "kube-system" namespace and grep for proxy
Prüfen Sie, was Proxy-Pods steuert.
kubectl describe pod kube-proxy-s5vzp -n kube-system #Describe the pod from the "kube-system" namespace
Erhalten Sie Details des Daemonsets, das die Proxy-Pods steuert.
kubectl describe daemonset kube-proxy -n kube-system #Describe the daemonset from the "kube-system" namespace
Erstellen Sie eine Datei mit der folgenden Daemonset-Definition darin.
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
In der obigen Definition haben wir eine Toleration to the Taint des Master-Knotens. Dadurch wird der Pod auch auf dem Master-Knoten platziert.
Erstellen Sie ein Daemonset unter Verwendung der im obigen Schritt erstellten Definitionsdatei.
kubectl create -f my-daemonset.yml #Create a daemonset
kubectl get daemonset -n kube-system #Get daemonset from the "kube-system" namespace
Dieses Dämon-Set wurde im Namensraum „kube-system“ erstellt.
Beschreiben Sie das Dämonset, das wir gerade im Namensraum „kube-system“ erstellt haben.
kubectl describe daemonset my-fluentd-elasticsearch-daemonset -n kube-system #Describe the daemonset from the "kube-system" namespace
Auf dem obigen Screenshot ist zu sehen, dass die Pods auf 2 Knoten bereitgestellt wurden.
Jetzt können wir Einzelheiten zu den Pods erhalten, die als Daemonsets auf 2 Knoten bereitgestellt wurden.
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
In der obigen Abbildung ist zu sehen, dass die Pods auf dem Worker-Knoten „node01“ und auf dem Master-Knoten „master“ eingesetzt wurden. Der Grund dafür, dass die Pods auf dem Master-Knoten eingesetzt wurden, ist die Toleranz gegenüber der Belastung des Master-Knotens.
Schlussfolgerung
In diesem Artikel sahen wir die Schritte zur Erstellung eines Daemonsets und sahen, wie die Pods im Daemonset auf jedem Knoten im Kubernetes-Cluster bereitgestellt werden.