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.
Abbildung 1: Es ist zu erwarten, dass Container in den nächsten Jahren zur häufigsten Bereitstellungsart für Anwendungen werden.
Abbildung 1: Es ist zu erwarten, dass Container in den nächsten Jahren zur häufigsten Bereitstellungsart für Anwendungen werden.

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.

Erfahren Sie mehr über Containervirtualisierung