Gorodenkoff - stock.adobe.com
Kubernetes StatefulSet, Deployment und DaemonSet im Vergleich
Kubernetes bietet mehrere Möglichkeiten zum Bereitstellen von Anwendungen, darunter Deployment, DaemonSets und StatefulSets. Wir erklären die Unterschiede und Anwendungsfälle.
Kubernetes hat sich in den letzten Jahren als Standard für das Containermanagement weitgehend durchgesetzt. Das liegt aber keineswegs an der herausragenden Benutzerfreundlichkeit – im Gegenteil: die Komplexität ist durch die hohe Flexibilität beachtlich. Kubernetes bietet mehrere Optionen zum Bereitstellen und Ausführen von Anwendungen, darunter Deployments, DaemonSets und StatefulSets.
Für das Ausführen einer Anwendung auf Kubernetes werden Sie in der Regel einen dieser Ressourcentypen oder eine Kombination aus allen dreien verwenden. Welche Bereitstellungsoption Sie nutzen sollten, hängt davon ab, was Ihre Anwendung tun muss – zum Beispiel, ob sie einen Status beibehalten soll – und wie Ihre Kubernetes-Cluster funktionieren sollen.
Was ist ein Kubernetes-Deployment?
In Kubernetes ist ein Deployment ein Dateityp, der Kubernetes mitteilt, wie es eine Anwendung bereitstellen soll, indem er Anweisungen zum Ausführen eines bestimmten Satzes von Containern, eines so genannten Pods, enthält. Deployments können auch Konfigurationsdaten angeben, zum Beispiel welche Netzwerkports für Container geöffnet werden sollen.
Das folgende Beispiel aus der Kubernetes-Dokumentation zeigt eine Bereitstellungsdatei, die eine Gruppe von Nginx-Containern ausführt.
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-Deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
Ein Deployment ist für sich genommen nur eine Textdatei. Um die in einem Deployment definierte Anwendung zu starten, verwenden Sie den Befehl apply in der Kubernetes-Kommandozeile kubectl, wie im folgenden Beispiel gezeigt.
kubectl apply -f /pfad/zu/Deployment-datei.yaml
Nach dem Anwenden eines Deployments bestimmt Kubernetes automatisch, welcher Knoten die Container der Anwendung hosten soll. Alternativ können Sie auch eine Option wie das nodeSelector-Feld in der Pod-Spezifikation verwenden, um bestimmte Knoten als Hosts auszuwählen. Kubernetes ist außerdem in der Lage, ausgefallene Container oder Knoten automatisch neu zu starten oder planen.
Vorteile der Kubernetes-Deployments
Deployments bieten mehrere Vorteile gegenüber der manuellen Ausführung und Verwaltung von Containern und Clustern.
Sie erfordern die wenigsten Konfigurationsdaten und den geringsten Einrichtungsaufwand und sind damit die einfachste und unkomplizierteste Möglichkeit, eine Anwendung mit Kubernetes zu betreiben. Beim Verwenden eines Deployments entscheidet Kubernetes, welche Knoten in einem Cluster die Container hosten sollen, und versucht automatisch, die Container weiterlaufen zu lassen, wenn ein bestimmter Knoten ausfällt.
Nachteile der Kubernetes-Deployments
Deployments haben im Vergleich zu StatefulSets und DaemonSets zwei wesentliche Nachteile. Beide stehen im Zusammenhang mit der begrenzten Kontrolle, die Deployments für das Ausführen einer Anwendung bieten:
- Mangel an granularer Kontrolle. Deployments konfigurieren Anwendungen auf eine generische Weise. Mit einem Deployment ist es nicht möglich, einer bestimmten Anwendung einen eindeutigen Bezeichner oder spezifische Ressourcen zuzuweisen oder jede Anwendung individuell zu konfigurieren.
- Mangelnde Skalierbarkeit. Jede Bereitstellung muss manuell erfolgen, was den Prozess mühsam macht, wenn Sie die Anwendung mehrfach laufen lassen möchten. Deployments sind zum Beispiel keine effiziente Methode, um denselben Container auf jedem Knoten in einem Cluster bereitzustellen.
Was ist ein DaemonSet in Kubernetes?
Ein DaemonSet ist ein spezieller Typ einer Anwendungsbereitstellungskonfiguration für das Ausführen eines bestimmten Containers oder einer Reihe von Containern auf mehreren Knoten innerhalb eines Kubernetes-Clusters. Mit einem DaemonSet stellen Sie Anwendungen in einem einzigen Schritt auf mehreren Knoten bereit.
Wie Deployments sind auch DaemonSets Dateien. Das folgende Beispiel aus der Kubernetes-Dokumentation zeigt eine DaemonSet-Konfiguration:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd-elasticsearch
namespace: kube-system
labels:
k8s-app: fluentd-logging
spec:
selector:
matchLabels:
name: fluentd-elasticsearch
template:
metadata:
labels:
name: fluentd-elasticsearch
spec:
tolerations:
# durch diese Tolerations kann Daemonset auf Kontrollebeneknoten laufen
# Entfernen Sie diese, wenn Ihre Kontrollebeneknoten keine Pods ausführen sollen
- key: node-role.kubernetes.io/control-plane
operator: Exists
effect: NoSchedule
- key: node-role.kubernetes.io/master
operator: Exists
effect: NoSchedule
containers:
- name: fluentd-elasticsearch
image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2
resources:
limits:
memory: 200Mi
requests:
cpu: 100m
Wie Deployments, wenden Sie auch DaemonSets mit kubectl an, um sie zu aktivieren.
Vorteile von Kubernetes DaemonSet
DaemonSets verbessert die mangelnde Skalierbarkeit, die wir bei Deployments festgestellt haben. Ein DaemonSet ist eine effiziente Möglichkeit, Container auf mehreren Servern innerhalb eines Kubernetes-Clusters bereitzustellen.
DaemonSets dienen häufig dazu, Hintergrundsoftware, wie zum Beispiel einen Überwachungsagenten auf jedem Knoten in einem Cluster zu betreiben. Sie werden in der Regel nicht für kritische Anwendungen genutzt.
Nachteile von Kubernetes DaemonSets
Es gibt keinen inhärenten Nachteil der DaemonSets, vorausgesetzt, Sie möchten, dass ein bestimmter Container oder eine bestimmte Gruppe von Containern auf mehreren Nodes läuft. DaemonSets sind nicht so konzipiert, dass Sie einen bestimmten Knoten festlegen können, weshalb Deployments die bessere Wahl für Anwendungen sind, bei denen die Wahl des Hosts wichtig ist.
Was ist ein StatefulSet in Kubernetes?
Ein StatefulSet ist eine spezielle Art von Bereitstellungskonfiguration, die jedem auszuführenden Container oder Containersatz einen eindeutigen Namen zuweist.
Im folgenden Beispiel aus der Kubernetes-Dokumentation erstellt die Datei ein StatefulSet mit dem Namen web und verknüpft es mit drei eindeutigen Nginx-Containern:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
selector:
matchLabels:
app: nginx # muss .spec.template.metadata.labels entsprechen
serviceName: "nginx"
replicas: 3 # standardmäßig auf 1 gesetzt
minReadySeconds: 10 # standardmäßig auf 0 gesetzt
template:
metadata:
labels:
app: nginx # muss .spec.selector.matchLabels entsprechen
spec:
terminationGracePeriodSeconds: 10
containers:
- name: nginx
image: registry.k8s.io/nginx-slim:0.8
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "my-storage-class"
resources:
Wie Deployments und DaemonSets müssen Sie auch StatefulSets mit kubectl anwenden.
Vorteile von Kubernetes StatefulSets
StatefulSets sind in erster Linie nützlich, um eine eindeutige, dauerhafte Beziehung zwischen einem Container und einer anderen Kubernetes-Ressource herzustellen.
Anwendungsfälle für StatefulSets sind in der Regel zustandsabhängige Anwendungen, die Zugriff auf dauerhafte Speicherressourcen benötigen. Mit StatefulSets ist ein Container beispielsweise in der Lage, immer auf dasselbe Datenspeichervolumen zuzugreifen, selbst wenn er neu gestartet oder auf einen anderen Knoten verschoben wird.
Mit einem Standard-Deployment wäre dies nicht möglich. Deployments haben keine einfache Möglichkeit, eine eindeutige Assoziation zwischen einem Container und einer anderen Ressource zu definieren, die bei einem Neustart des Containers erhalten bleibt. Stattdessen weisen Kubernetes-Deployments den Containern nach jedem Neustart oder einer Neuplanung automatisch Ressourcen zu, je nachdem, welche Ressourcen zum Zeitpunkt der Zuweisung die höchste Verfügbarkeit aufweisen.
Da DaemonSets etwas grundlegend anderes tun als StatefulSets, ist es unmöglich, die beiden direkt miteinander zu vergleichen.
Nachteile von Kubernetes StatefulSets
Während StatefulSets in den oben beschriebenen Szenarien hilfreich sind, bieten sie in anderen Situationen keinen Nutzen. Standardimplementierungen eignen sich beispielsweise am besten für das Ausführen zustandsloser Anwendungen oder Anwendungen, die allgemeine Ressourcen verwenden, die keine spezifischen, dauerhaften Konfigurationen erfordern.
Um einen bestimmten Container oder eine Reihe von Containern auf mehreren Knoten gleichzeitig auszuführen, verwenden Sie ein DaemonSet. Ebenso sind StatefulSets eine gute Wahl, um Containern eindeutige Ressourcen zuzuweisen und den Anwendungsstatus zu erhalten. In den meisten Fällen sind Deployments jedoch der einfachste Weg, um Anwendungen in Kubernetes auszuführen.