So bereinigen Sie alte Kubernetes-Aufgaben
Webagentur » Digitale Nachrichten » Was ist Kubernetes Server-Side Apply (SSA)?

Was ist Kubernetes Server-Side Apply (SSA)?

Server-Side Apply (SSA) ist in Kubernetes seit v1.22 im August 2021 allgemein verfügbar. Es handelt sich um eine deklarative Ressourcenverwaltungsstrategie, die Differenzberechnungen verbessert und vor Merge-Konflikten warnt, indem sie die Logik von verschiebt kubectl apply Bestellung auf dem Server.

In diesem Artikel wird erläutert, wie SSA funktioniert und warum es gegenüber dem vorherigen clientseitigen Anwendungsansatz (CSA) bevorzugt wird. Außerdem erfahren Sie, wie Sie SSA aktivieren, wenn Sie Änderungen an Objekten in Ihrem Cluster vornehmen.

Grundlegendes zu deklarativen Updates

La kubectl apply Der Befehl führt deklarative Aktualisierungen an Objekten durch. Anstatt Kubernetes aufzufordern, bestimmte Felder zu ändern, stellen Sie eine vollständige Darstellung des Objekts so bereit, wie es angezeigt werden soll. Das System errechnet automatisch die Differenzen zum bestehenden Stand Ihres Clusters. Es führt dann die Aktionen aus, die den Status in den gewünschten Status umwandeln, der durch Ihre Manifestdatei ausgedrückt wird.

Hier ist ein einfaches Pod-Manifest:

apiVersion: v1
Art: Schote
Metadaten:
  Name: 
spec:
  Behälter:
    - Name: 
      Image: nginx: neueste

Funktionsweise kubectl apply Mit diesem Manifest wird ein neuer Pod gestartet, der die ausführt nginx:latest Bild. Der Unterschied zwischen dem bestehenden Zustand des Clusters und dem gewünschten ist klar: Es wurde ein Pod geschaffen, wo es vorher keinen gab nginx Nom.

Anschließend können Sie das Manifest bearbeiten, indem Sie eine der Pod-Eigenschaften ändern:

apiVersion: v1
Art: Schote
Metadaten:
  Name: 
spec:
  Behälter:
    - Name: 
      Image: nginx:1.23

Diesmal ist der Unterschied zwischen dem Ist-Zustand und dem Soll-Zustand weniger signifikant. Das kubectl apply Der Befehl erkennt die überarbeitete Version image und aktualisieren Sie Ihre Pod-Konfiguration entsprechend.

Probleme mit der clientseitigen Anwendung

Das Zurückstellen von Änderungen und das Auflösen von Konflikten ist der wichtigste Teil deklarativer Aktualisierungen. Dieser Prozess wird standardmäßig in Kubectl ausgeführt. Der Client ist dafür verantwortlich, das vorhandene Objekt auf dem Server zu identifizieren und seine Änderungen zu vergleichen.

La kubectl apply Der Befehl schreibt a last-applied-configuration Anmerkungen zu Objekten, um diesen Prozess zu erleichtern. Es identifiziert Felder, die auf dem aktiven Objekt vorhanden sind, aber aus dem eingehenden Manifest entfernt wurden. Der Client weiß dann, wie er sie aus dem Objekt löschen muss, um den neuen Zustand zu erreichen.

Dieser Ansatz ist problematisch, wenn mehrere Agenten dasselbe Objekt aktualisieren. Ein einzelnes Objekt kann beispielsweise sowohl von Kubectl als auch von einem dedizierten Controller in Ihrem Cluster geändert werden. Die clientseitige Anwendung kann weder wissen, welcher Agent ein Feld geändert hat, noch wissen, wann ein Konflikt auftritt. Es vergleicht lediglich Ihr lokales Manifest mit dem des vorhandenen Objekts last-applied-configuration und fügt alle Änderungen ein.

Die clientseitige Anwendung ist auch untrennbar mit Kubectl verbunden. Tools von Drittanbietern, die ihre eigenen deklarativen Aktualisierungen durchführen möchten, müssen entweder Kubectl aufrufen oder die neu erstellen apply Logik von Grund auf. Keine dieser beiden Optionen ist besonders ideal.

Serverseitiger Anwendungsbetrieb

Das grundlegende Problem mit CSA besteht darin, dass veraltete lokale Manifeste niemals erkannt werden. Wenn ein anderer Applikator ein Objekt modifiziert, bevor Sie es ausführen kubectl apply, können Ihre alten lokalen Revisionen die korrekten neuen überschreiben. Bei aktiviertem SSA wird der Konflikt erkannt und die Aktualisierung blockiert. Es ist ein zentralisiertes System, das sicherstellt, dass Ihr lokaler Staat auf dem neuesten Stand gehalten wird.

SSA funktioniert durch Hinzufügen eines Steuerungsebenenmechanismus, der Informationen zu jedem Feld Ihrer Objekte speichert. Es ersetzt die last-applied-configuration Anmerkung mit einem neuen metadata.managedFields aufstellen. Jedes Feld Ihres Objekts wird im verfolgt managedFields.

Felder werden einem „Feldmanager“ zugewiesen, der den Kunden identifiziert, dem sie gehören. Wenn Sie ein Manifest mit Kubectl anwenden, ist Kubectl der designierte Handler. Der Handler eines Felds kann auch ein externer Controller oder eine Integration sein, die Ihre Objekte aktualisiert.

Managern ist es untersagt, die Felder anderer Personen zu aktualisieren. Sie können ein Feld nicht mit ändern kubectl apply wenn es derzeit einem anderen Controller gehört. Drei Strategien sind verfügbar, um diese Zusammenführungskonflikte zu lösen:

  • Überschreiben des Wertes erzwingen – In manchen Situationen möchten Sie vielleicht die Aktualisierung erzwingen. Dies wird seinen Wert ändern und das Eigentum an den neuen Landverwalter übertragen. Es ist hauptsächlich für Controller gedacht, die die Verwaltung der von ihnen ausgefüllten Felder behalten müssen. Sie können eine Aktualisierung manuell erzwingen, indem Sie die --force-conflicts Flagge in Kubectl.
  • Wert nicht überschreiben – Der Implementierer kann das Feld aus seiner lokalen Konfiguration entfernen und dann die Anfrage wiederholen. Das Feld behält seinen vorhandenen Wert. Durch das Löschen des Felds wird der Konflikt gelöst, indem dem vorhandenen Manager die Eigentümerschaft übertragen wird.
  • Aktienverwaltung – Der Enforcer kann seinen lokalen Wert aktualisieren, damit er mit dem vorhandenen Wert auf dem Server übereinstimmt. Wenn er die Anfrage wiederholt, während er das Eigentum beansprucht, erlaubt ihm SSA, die Verwaltung mit dem bestehenden Manager zu teilen. Dies liegt daran, dass der Antragsteller den aktuellen Status des Felds akzeptiert, aber angegeben hat, dass er es möglicherweise in Zukunft verwalten möchte.

Dieser Ansatz ist viel leistungsfähiger als der traditionelle kubectl apply. Es verhindert versehentliches Überschreiben, ermöglicht es Controllern, zuverlässig den Besitz der von ihnen kontrollierten Felder zu beanspruchen, und ist vollständig deklarativ. SSA verfolgt, wie verschiedene Benutzer einzelne Felder geändert haben, anstatt nur den letzten vollständigen Zustand des Objekts aufzuzeichnen. Das bedeutet auch, dass Sie sich jetzt in jedem Tool bewerben können, unabhängig von der Sprache oder kubectl binäre Verfügbarkeit. Sie erhalten die gleichen konsistenten Ergebnisse, unabhängig davon, wie Sie die Operation einleiten.

Verwenden Sie SSA noch heute

Sie können SSA aktivieren, indem Sie die --server-side Flag jedes Mal, wenn Sie Kubectl ausführen, gelten:

$ kubectl apply -f nginx.yaml --serverseitiger Pod/nginx serverseitig angewendet

Die Befehlsausgabe ändert sich, um anzuzeigen, dass SSA verwendet wurde.

Beim Überprüfen des YAML-Manifests des Objekts werden die unterstützten Felder angezeigt:

$ kubectl get pod nginx -o yaml apiVersion: v1 kind: Pod metadata: creationTimestamp: "2022-11-24T16:02:29Z" managedFields: - apiVersion: v1 fieldsType: FieldsV1 fieldsV1: f:spec: f:containers: k: {"name":"nginx"}: .: {} f:image: {} f:name: {} manager: kubectl operation: Apply time: "2022-11-24T16:02:29Z" - apiVersion: v1 fieldsType : FieldsV1 fieldsV1: f:status: f:conditions: k:{"type":"ContainersReady"}: .: {} f:lastProbeTime: {} f:lastTransitionTime: {} f:status: {} f:type: {} k:{"type":"Initialized"}: .: {} f:lastProbeTime: {} f:lastTransitionTime: {} f:status: {} f:type: {} k:{"type":" Ready"}: .: {} f:lastProbeTime: {} f:lastTransitionTime: {} f:status: {} f:type: {} f:containerStatuses: {} f:hostIP: {} f:phase: {} f:podIP: {} f:podIPs: .: {} k:{"ip":"10.244.0.186"}: .: {} f:ip: {} f:startTime: {} manager: kubelet operation: Update Unterressource: Statuszeit: "2022-11-24T16:02:31Z" ...

Felder werden nach dem Manager gruppiert, dem sie gehören. In diesem Beispiel spec wird von Kubectl verwaltet, da der Pod so erstellt wurde. Das status Das Feld wird jedoch von Kubelet verwaltet, da der Knoten, auf dem der Pod ausgeführt wird, den Wert dieses Felds während des Lebenszyklus des Pods ändert.

SSA ist auch bereit für den Einsatz in Steuerungen. Es ermöglicht eine leistungsfähigere Semantik und neue Arten von Controllern, einschließlich solcher, die Objekte rekonstruieren. Dieses Modell handhabt Änderungen, indem es zuerst die Felder eines Objekts von Grund auf zur Zufriedenheit des Controllers rekonstruiert und dann das Ergebnis auf den Server anwendet. Dies ist eine natürlichere Methode als das manuelle Festlegen der Abfolge von Vorgängen, die die gewünschte Änderung bewirken.

Überprüfen Sie, ob ein Objekt mit SSA verwaltet wird

Sie können überprüfen, ob ein Objekt CSA oder SSA verwendet, indem Sie sein YAML-Manifest in Kubectl abrufen:

$ kubectl get pod nginx -o yaml

Wenn du ein siehst last-applied-configuration Anmerkung, Ihr Objekt wird von CSA verwaltet:

apiVersion: v1
Art: Schote
Metadaten:
  Anmerkungen:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"name":"nginx","namespace":"default"},"spec": {"Container":[{"image":"nginx:latest","name":"nginx"}]}}
  Erstellungszeitstempel: "2022-11-24T14:20:07Z"
  Name: 
  Namensraum: Standard
  ...
...

SSA wurde für das Objekt if verwendet metadata.managedFields erscheint stattdessen:

apiVersion: v1
Art: Schote
Metadaten:
  Erstellungszeitstempel: "2022-11-24T16:02:29Z"
  ManagedFields:
  - apiVersion: v1
    FelderTyp: FelderV1
    FelderV1:
      f:spez:
        f:Container:
          k:{"name":"nginx"}:
            .: {}
            f: Bild: {}
            f:Name: {}
    Manager: kubectl
    Betrieb: Jetzt bewerben
    Zeit: "2022-11-24T16:02:29Z"
    ...
  ...
...

Sie können ein Objekt zwischen CSA und SSA verschieben, indem Sie einfach hinzufügen oder weglassen --server-side melde dich beim nächsten Lauf kubectl apply. Kubernetes verwaltet die Konvertierung von last-applied-configuration in managedFields und umgekehrt.

Bei Upgrades auf SSA können Konflikte auftreten, wenn sich Ihr lokales Manifest von dem Objekt auf dem Server unterscheidet. Dies geschieht, wenn Sie einen zwingenden Befehl wie ausgeführt haben kubectl scale ou kubectl label seit Ihrer letzten Anwendung auf das Objekt. Sie sollten überprüfen, ob Ihr lokales Manifest genau mit dem aktiven Objekt übereinstimmt, bevor Sie in SSA konvertieren.

Zusammenfassung

Die serverseitige Anwendung ist ein deklarativer Objektverwaltungsansatz, bei dem Felder von der Kubernetes-Steuerungsebene nachverfolgt werden. Dies ermöglicht eine robuste Konflikterkennung und flexible Lösungsstrategien. SSA adressiert clientseitige Anwendungsbeschränkungen, die ein unbeabsichtigtes Überschreiben von Feldern ohne Vorwarnung ermöglichen.

Obwohl SSA jetzt allgemein verfügbar ist, müssen Sie es immer noch bei jeder Ausführung manuell angeben kubectl apply. Denken Sie daran, dass SSA besonders in Situationen nützlich ist, in denen Objekte von mehreren verschiedenen Prozessen verwaltet werden, z. B. menschliche Operatoren mit Kubectl und einer Controller-Schleife. Sie werden nicht viel von SSA profitieren, wenn Sie ausschließlich verwenden kubectl apply um Objekte zu erstellen und zu aktualisieren.

Eine zukünftige Version von Kubernetes sollte CSA entfernen, sodass SSA die einzige Standardoption ist. Das --server-side Flag wird dann überflüssig.

★ ★ ★ ★ ★