Wie arbeiten k8s-Komponenten nach dem Erstellen einer Statefulset-Ressource zusammen?

Dieser Artikel wurde von der Huawei Cloud Community geteilt: „ Was passiert mit k8s nach der Erstellung eines StatefulSets?“ ", Autor: Du kannst einen Freund finden.

1. Einführung in StatefulSet

StatefulSet ist ein Workload-Objekt, das zur Verwaltung zustandsbehafteter Anwendungen verwendet wird. StatefulSet verwaltet eine Gruppe von Pods basierend auf derselben Containerspezifikation und verwendet persistente Identifikatoren, um persistenten Speicher für Workload-Pods bereitzustellen. Ähnlich wie Deployment gehört es auch zum Replikat-Controller, aber im Gegensatz zu Deployment verwaltet StatefulSet eine Sticky-ID für jeden seiner Pods. Unabhängig davon, wie sich der Lebenszyklus dieses Pod-Typs ändert, ändert sich die Kennungs-ID jedes Pods nicht. Es unterstützt außerdem die ordnungsgemäße Bereitstellung und Skalierung von Dienstinstanzen und stellt ordnungsgemäße Start- und Beendigungsrichtlinien bereit, die für zustandsbehaftete Anwendungen erforderlich sind.

Der Headless Service wird zwischen StatefulSet-Workloads verwendet, um Pod-Netzwerkkennungen zu definieren und auflösbare DNS-Domänennamendatensätze für die Kommunikation zwischen Pods derselben StatefulSet-Workload zu generieren.

2. StatefulSet-Workload-Zugriffsmethode

Die externe Zugriffsmethode ähnelt der anderer Workloads (z. B. Bereitstellung), es gibt jedoch Unterschiede. Bereitstellungs-Workloads nutzen Dienste (Dienste mit IP-Adressen), um externen Dienstzugriff bereitzustellen. In einigen speziellen Szenarien erfordert der Clientzugriff jedoch nicht die vom Dienst in Kubernetes implementierte Lastausgleichsfunktion. Stattdessen erkennt/wählt der Client den Dienst direkt aus Um auf die Backend-Instanz des Clients zuzugreifen, ist ein spezieller Dienst „Headless Service“ erforderlich. Hierbei handelt es sich um einen Dienst ohne Zugangseingang (d. h. der Dienst verfügt über keine IP-Adresse). kube-proxy erstellt keine iptables/ipvs-Weiterleitungsregeln für diesen Diensttyp (Headless-Dienst).

APIVersion: v1
Art: Service
Metadaten:
  Name: Nginx
  Etiketten:
    App: Nginx
Spezifikation:
  Häfen:
  - Hafen: 80
    Name: Web
  ClusterIP: Keine
  Wähler:
    App: Nginx
---
apiVersion: apps/v1
Art: StatefulSet
Metadaten:
  Name: Web
Spezifikation:
  Wähler:
    matchLabels:
      app: nginx #Muss mit .spec.template.metadata.labels übereinstimmen
  Dienstname: „nginx“
  Replikate: 3 # Der Standardwert ist 1
  minReadySeconds: 10 # Der Standardwert ist 0
  Vorlage:
    Metadaten:
      Etiketten:
        app: nginx #Muss mit .spec.selector.matchLabels übereinstimmen
    Spezifikation:
      BeendigungGracePeriodSekunden: 10
      Behälter:
      - Name: Nginx
        Bild: Registry.k8s.io/nginx-slim:0.8
        Häfen:
        - ContainerPort: 80
          Name: Web
        volumeMounts:
        - Name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  -Metadaten:
      Name: www
    Spezifikation:
      accessModes: [ „ReadWriteOnce“ ]
      storageClassName: „meine-Speicherklasse“
      Ressourcen:
        Anfragen:
          Speicher: 1Gi

Die Beziehung zwischen den mit StatefulSet und pvc und pv verknüpften Pods ist wie folgt:

3. StatefulSet-Workload-Erstellungsprozess

  1. Der Benutzer initiiert eine Anfrage zum Erstellen eines StatefulSet-Ressourcenobjekts über den kubectl-Client an den API-Server.

  2. Der API-Server führt Benutzerauthentifizierungs- und Zugangskontrollvorgänge für die Anfrage durch und schreibt dann das Anfrageereignis in den etcd-Speicher.

  3. In Anbetracht der Tatsache, dass der StatefulSet-Controller einen nicht blockierenden Überwachungsmechanismus für lange Verbindungen verwendet, um Informationen zu StatefulSet-Ressourcenobjekten in Echtzeit abzurufen, werden die relevanten StatefulSet-Ressourcenobjekte in etcd angezeigt, sobald im Cluster StatefulSet-Änderungen (einschließlich Erstellung, Aktualisierung und Löschung) vorgenommen werden werden über den API-Server bezogen.

  4. Der API-Server gibt die StatefulSet-Ressource an die lange Verbindung der Überwachungsschnittstelle des StatefulSet-Controllers zurück.

  5. Der StatefulSet-Controller verwaltet den Lebenszyklusstatus von StatefulSet, bestimmt die Anzahl der Kopien anhand der Vorlage von StatefulSet und erstellt Pod-Kopien in der Reihenfolge (0, 1 ... N-1) entsprechend der Anzahl der Kopien.

  6. Nach Erhalt des StatefulSet-Controller-Erstellungsergebnisses aktualisiert der API-Server die StatefulSet-Statusinformationen und das Pod-Erstellungsereignis im etcd-Speicher.

4. Funktionsprinzip des StatefulSet-Controllers

In StatefulSet sind Informer und Event Handler zwei wichtige Komponenten

  • Informer: ist ein Kubernetes-API-Client, mit dem Änderungen an Ressourcenobjekten in der Kubernetes-API überwacht und im lokalen Cache aktualisiert werden. Wenn sich der Status des Ressourcenobjekts ändert, löst der Informer den Event-Handler aus.
  • Event-Handler: Es handelt sich um eine Rückruffunktion, die zum Verarbeiten von von Informer ausgegebenen Ereignissen verwendet wird. Der Event-Handler führt entsprechende Vorgänge entsprechend der Art des Ereignisses aus.
  • Revision verwalten: Wird verwendet, um jede aktualisierte Version des StatefulSets zu identifizieren. Über „Revision verwalten“ können Sie den Aktualisierungsverlauf des StatefulSets anzeigen, sodass Sie bei Bedarf ein Rollback zur vorherigen Version durchführen können.
  • Pods in der richtigen Reihenfolge verwalten:  Verwalten Sie die Startreihenfolge der Pods in StatefulSet.
  • In der richtigen Reihenfolge aktualisieren:  Pods in geordneter Weise aktualisieren. Überprüfen Sie, ob der erwartete Status des Pods den Anforderungen entspricht. Wenn nicht, löschen Sie ihn und erstellen Sie ihn neu.
  • Update-Status: Verwaltet den Update-Status von StatefulSet-Objekten.
  • Replikat-Array : speichert den Ordnungswert der verfügbaren Pods (ID-Kennung im Pod-Namen), (0 <= ord < Spec.replicas)
  • Verurteiltes Array : speichert den Ord-Wert (ID-Kennung im Pod-Namen) des Pods, der gelöscht werden muss (ord >= Spec.replicas)
  • Erstellen Sie eine StatefulSet-Workload-Pod-Instanz

Bestimmen Sie die Verwaltungsstrategie von StatefulSet:

  1. Wenn es sich bei der Instanzverwaltungsstrategie um eine parallele Strategie handelt , wird das Replikat-Array durchlaufen und alle Pods werden gleichzeitig erstellt, unabhängig von der Reihenfolge, in der sie gestartet werden.
  2. Wenn es sich bei der Instanzverwaltungsstrategie um eine geordnete Strategie handelt , durchqueren Sie das Replikat-Array und erstellen Sie Pods in der Reihenfolge (0, 1 ... N-1). Es muss sichergestellt werden, dass sich der vorherige Pod im Replikat-Array im Status „Laufend“ oder „Bereit“ befindet. bevor Sie den nächsten Pod erstellen.
  3. Überprüfen Sie abschließend, ob die Informationen des Pods mit dem StatefulSet übereinstimmen, und aktualisieren Sie den Status des Pods, wenn er nicht übereinstimmt. Wenn das aktuelle StatefulSet einem Pod zugeordnet ist, die Pod-Bezeichnungen jedoch nicht übereinstimmen, geben Sie den Pod frei und erstellen Sie eine neue Pod-Kopierzuordnung.

4.1 Aktualisieren Sie die StatefulSet-Workload-Pod-Instanz

  1. Bestimmen Sie die Aktualisierungsstrategie von Statefulset:

  2. Wenn die Aktualisierungsrichtlinie OnDelete lautet , wird das Aktualisierungsverhalten nicht automatisch ausgelöst. Der Pod muss manuell gelöscht werden und das System erstellt und aktualisiert ihn neu.

  3. Wenn die Update-Richtlinie RollingUpdate lautet , ist die Instanzverwaltungsrichtlinie nicht mehr betroffen. Sie werden alle der Reihe nach verarbeitet und warten darauf, dass der aktuelle Pod erfolgreich gelöscht wurde, bevor sie mit einem Pod fortfahren, dessen Sequenznummer kleiner als die des vorherigen Pods ist.

  4. Überprüfen Sie abschließend, ob die Informationen des Pods mit dem StatefulSet übereinstimmen, und aktualisieren Sie den Status des Pods, wenn er nicht übereinstimmt. Wenn das aktuelle StatefulSet einem Pod zugeordnet ist, die Pod-Bezeichnungen jedoch nicht übereinstimmen, geben Sie den Pod frei und erstellen Sie eine neue Pod-Kopierzuordnung.

4.2 Erweitern und Verkleinern von StatefulSet-Workload-Pod-Instanzen

Erweiterungsvorgang :

  1. Aktualisieren Sie die Statusinformationen von Statefulset und schreiben Sie die neuen Pod-Informationen in die Replikatwarteschlange und die Verurteilungswarteschlange.

  2. Durchlaufen Sie das Replikat-Array und stellen Sie sicher, dass sich der Pod im Replikat-Array im Status „Laufend“ oder „Bereit“ befindet. Pods im fehlerhaften Zustand werden gelöscht und neu erstellt, und nicht erstellte Pods werden direkt erstellt.

  3. Überprüfen Sie abschließend, ob die Informationen des Pods mit dem StatefulSet übereinstimmen, und aktualisieren Sie den Status des Pods, wenn er nicht übereinstimmt. Wenn das aktuelle StatefulSet einem Pod zugeordnet ist, die Pod-Bezeichnungen jedoch nicht übereinstimmen, geben Sie den Pod frei und erstellen Sie eine neue Pod-Kopierzuordnung.

Schrumpfvorgang:

  1. Aktualisieren Sie die Statusinformationen von Statefulset.

  2. Durchlaufen Sie das verurteilte Array, um sicherzustellen, dass sich der Pod im Replikat-Array im Status „Laufend“ oder „Bereit“ befindet. Pods im fehlerhaften Zustand werden gelöscht und neu erstellt, und nicht erstellte Pods werden direkt erstellt. Löschen Sie dann mehrere Pods im verurteilten Array in umgekehrter Reihenfolge vom größten zum kleinsten Pod-Namensbezeichner.

  3. Überprüfen Sie abschließend, ob die Informationen des Pods mit dem StatefulSet übereinstimmen, und aktualisieren Sie den Status des Pods, wenn er nicht übereinstimmt. Wenn das aktuelle StatefulSet einem Pod zugeordnet ist, die Pod-Bezeichnungen jedoch nicht übereinstimmen, geben Sie den Pod frei und erstellen Sie eine neue Pod-Kopierzuordnung.

4.3 StatefulSet-Workload-Pod-Instanz löschen

Die folgende Funktion „processCondemned“ führt hauptsächlich das Löschen des StatefulSet-Workload-Pods ein
func (ssc *defaultStatefulSetControl) ProcessCondemned(ctx context.Context, set *apps.StatefulSet, firstUnhealthyPod *v1.Pod, monotonic bool, verurteilt []*v1.Pod, i int) (bool, error) {
	Logger := klog.FromContext(ctx)
	if isTerminating(condemned[i]) {
		wenn monoton {
			logger.V(4).Info("StatefulSet wartet auf die Beendigung des Pods, bevor es herunterskaliert wird",
				„statefulSet“, klog.KObj(set), „pod“, klog.KObj(condemned[i]))
			Rückgabe wahr, Null
		}
		Rückgabe falsch, null
	}
	if !isRunningAndReady(condemned[i]) && monotonic && condemned[i] != firstUnhealthyPod {
		logger.V(4).Info("StatefulSet wartet darauf, dass der Pod läuft und bereit ist, bevor er herunterskaliert wird",
			„statefulSet“, klog.KObj(set), „pod“, klog.KObj(firstUnhealthyPod))
		Rückgabe wahr, Null
	}
	if !isRunningAndAvailable(condemned[i], set.Spec.MinReadySeconds) && monotonic && verurteilt[i] != firstUnhealthyPod {
		logger.V(4).Info("StatefulSet wartet darauf, dass der Pod verfügbar ist, bevor er herunterskaliert wird",
			„statefulSet“, klog.KObj(set), „pod“, klog.KObj(firstUnhealthyPod))
		Rückgabe wahr, Null
	}

	logger.V(2).Info("Pod von StatefulSet wird wegen Verkleinerung beendet",
		„statefulSet“, klog.KObj(set), „pod“, klog.KObj(condemned[i]))
	return true, ssc.podControl.DeleteStatefulPod(set, verurteilt[i])
}
  1. Diese Funktion ermittelt zunächst, ob der zu löschende Pod beendet wird. Wenn ja, führt sie eine unterschiedliche Verarbeitung durch , je nachdem, ob es sich um eine Pod-Verwaltungsrichtlinie handelt. Wenn es sich um eine geordnete Strategie handelt, verschwindet der blockierte Pod, der auf die Beendigung wartet, vollständig. Wenn es sich nicht um eine geordnete Strategie handelt, wird direkt und ohne Operation zurückgegeben.

  2. Wenn der Pod, der gelöscht werden muss, nicht der erste fehlerhafte Pod ist und die aktuelle Pod-Verwaltungsrichtlinie eine geordnete Richtlinie ist , blockiert er und wartet darauf, dass andere fehlerhafte Pods in den Status „Läuft“ und „Bereit“ oder in den Status „Verfügbar“ wechseln. Wenn es sich nicht um eine geordnete Strategie handelt, wird direkt und ohne Operation zurückgegeben.

  3. Wenn schließlich der zu löschende Pod nicht beendet wird und die Löschbedingungen erfüllt, wird der Löschvorgang ausgeführt und true zurückgegeben. Andernfalls geben Sie direkt false zurück.

Klicken Sie hier, um zu folgen und so schnell wie möglich mehr über die neuen Technologien von Huawei Cloud zu erfahren~

 

IntelliJ IDEA 2023.3 & JetBrains Family Bucket jährliches Hauptversions-Update neues Konzept „defensive Programmierung“: Machen Sie sich einen stabilen Job GitHub.com betreibt mehr als 1.200 MySQL-Hosts, wie kann man nahtlos auf 8.0 aktualisieren? Das Web3-Team von Stephen Chow wird nächsten Monat eine unabhängige App starten. Wird Firefox eliminiert? Visual Studio Code 1.85 veröffentlicht, schwebendes Fenster Die US-amerikanische CISA empfiehlt den Verzicht auf C/C++, um Schwachstellen in der Speichersicherheit zu beseitigen. Yu Chengdong: Huawei wird nächstes Jahr bahnbrechende Produkte auf den Markt bringen und die Branchengeschichte neu schreiben. TIOBE Dezember: C# wird voraussichtlich die Programmiersprache des Jahres. Ein Artikel geschrieben von Lei Jun vor 30 Jahren: „Prinzip und Design des Expertensystems zur Computervirenbestimmung“
{{o.name}}
{{m.name}}

Supongo que te gusta

Origin my.oschina.net/u/4526289/blog/10320141
Recomendado
Clasificación