Kubernetes 1.16: Übersicht über die wichtigsten Neuerungen

Kubernetes 1.16: Übersicht über die wichtigsten Neuerungen

Heute, am Mittwoch, stattfinden der nächste Release von Kubernetes — 1.16. Nach Tradition für unseren Blog berichten wir nun schon zum zehnten Mal über die bedeutendsten Änderungen in der neuen Version.

Die Informationen, die zur Vorbereitung dieses Materials verwendet wurden, stammen aus der Tabelle zur Nachverfolgung von Kubernetes-Verbesserungen, CHANGELOG-1.16 und den entsprechenden Issues, Pull Requests sowie den Kubernetes Enhancement Proposals (KEP). Also, los geht's!..

Nodes

Eine wirklich große Anzahl bemerkenswerter Neuerungen (im Alpha-Status) wurde auf der Node-Seite der K8s-Cluster (Kubelet) vorgestellt.

Zunächst wurden die sogenannten «ephemeren Container» (Ephemeral Containers), die darauf abzielen, die Debugging-Prozesse in Pods zu erleichtern, vorgestellt.Der neue Mechanismus ermöglicht das Starten spezieller Container, die im Namensraum vorhandener Pods gestartet werden und nur kurze Zeit leben. Ihr Zweck ist die Interaktion mit anderen Pods und Containern zur Lösung von Problemen und zum Debugging. Für diese Möglichkeit wurde ein neuer Befehl implementiert, kubectl debug, der in seiner Funktionalität mit kubectl exec: vergleichbar ist — nur dass anstelle des Startens eines Prozesses im Container (wie im Falle von exec) ein Container im Pod gestartet wird. Ein solches Kommando fügt einen neuen Container zu einem Pod hinzu:

kubectl debug -c debug-shell --image=debian target-pod -- bash

Details zu den ephemeren Containern (und Beispiele für deren Nutzung) finden Sie in dem entsprechenden KEP. Die aktuelle Implementierung (in K8s 1.16) ist eine Alpha-Version, und unter den Kriterien für ihre Überführung in den Beta-Status steht "Testen der Ephemeral Containers API über mindestens 2 Releases [Kubernetes]".

NB: In ihrer Natur und sogar im Namen ähnelt die Funktionalität bereits bestehenden Plugins, kubectl-debug, über die wir bereits geschrieben haben. Es wird angenommen, dass mit dem Erscheinen der ephemeren Container die Entwicklung eines separaten externen Plugins eingestellt wird.

Eine weitere Neuerung — PodOverhead — soll einen Mechanismus zur Berechnung der Overheads für Pods bereitstellen,die je nach verwendeter Ausführungsumgebung (Runtime) stark variieren können. Als Beispiel nennen die Autoren dieses KEP Kata Containers, die das Starten eines Gastkernels, eines Kata-Agenten, eines Init-Systems usw. erfordern. Wenn der Overhead so groß wird, dass er nicht ignoriert werden kann, ist ein Verfahren erforderlich, um ihn für die weitere Quotenverwaltung, Planung usw. zu berücksichtigen. Zu diesem Zweck wurde im PodSpec ein Feld hinzugefügt, Overhead *ResourceList (entspricht den Daten in RuntimeClass, sofern vorhanden).

Ein weiteres bemerkenswertes neues Feature ist der Node Topology Manager (Node Topology Manager), der darauf abzielt, den Ansatz zur Feinabstimmung der Verteilung von Hardware-Ressourcen für verschiedene Komponenten in Kubernetes zu vereinheitlichen. Diese Initiative ergibt sich aus dem wachsenden Bedarf verschiedener moderner Systeme (aus den Bereichen Telekommunikation, maschinelles Lernen, Finanzdienstleistungen usw.) an leistungsstarkem parallelem Rechnen und der Minimierung von Verzögerungen bei der Ausführung von Operationen, wofür sie die erweiterten Möglichkeiten von CPU und Hardware-Beschleunigung nutzen. Solche Optimierungen in Kubernetes wurden bisher durch disparate Komponenten (CPU-Manager, Device-Manager, CNI) erreicht, und nun wird eine einheitliche interne Schnittstelle hinzugefügt, die den Ansatz vereinheitlicht und die Anbindung neuer ähnlicher — sogenannter topology-aware — Komponenten auf der Kubelet-Seite vereinfacht. Einzelheiten finden Sie in dem entsprechenden KEP.

Kubernetes 1.16: Übersicht über die wichtigsten Neuerungen
der Komponentenschema des Topology Managers

Das nächste Feature ist die Überprüfung von Containern während ihres Starts (Startup-Probe). Wie bekannt ist, ist es bei Containern, die lange für den Start brauchen, schwierig, den aktuellen Status zu erhalten: Sie werden entweder „abgeschossen“, bevor sie tatsächlich funktionieren, oder sie geraten für lange Zeit in einen Deadlock. Die neue Überprüfung (die über ein Feature-Gate mit dem Namen StartupProbeEnabled) hebt — genauer gesagt, verschiebt — die Ausführung aller anderen Überprüfungen bis zu dem Moment auf, an dem der Pod seinen Start abgeschlossen hat. Aus diesem Grund wurde das Feature ursprünglich als pod-startup liveness-probe holdoffbezeichnet. Für Pods, die lange starten, kann der Status in relativ kurzen Zeitintervallen abgefragt werden.

Darüber hinaus wird sofort in der Beta-Version eine Verbesserung für RuntimeClass vorgestellt, die die Unterstützung für „heterogene Cluster“ hinzufügt. Mit RuntimeClass Scheduling ist es nun nicht mehr zwingend erforderlich, dass jeder Knoten jede RuntimeClass unterstützt: Für Pods kann eine RuntimeClass ausgewählt werden, ohne sich um die Topologie des Clusters Gedanken zu machen. Früher musste, um dies zu erreichen — damit Pods auf Knoten landen, die alles unterstützen, was sie benötigen — entsprechende Regeln für NodeSelector und Toleranzen festgelegt werden. In KEP werden Anwendungsbeispiele und natürlich Details zur Umsetzung beschrieben.

Netzwerk

Zwei bedeutende Netzwerkfunktionen, die erstmals (in der Alpha-Version) in Kubernetes 1.16 eingeführt wurden, sind:

  • Bestellen doubles stack — IPv4/IPv6 — und das entsprechende „Verständnis“ auf der Ebene von Pods, Knoten, Services. Es umfasst die IPv4-zu-IPv4- und IPv6-zu-IPv6-Interaktionen zwischen Pods, von Pods zu externen Services, Referenzimplementierungen (im Rahmen der Bridge CNI-, PTP CNI- und Host-Local IPAM-Plugins) sowie die Abwärtskompatibilität mit Kubernetes-Clustern, die nur über IPv4 oder IPv6 arbeiten. Details zur Implementierung finden Sie in KEP.

    Beispielausgabe von IP-Adressen zweier Arten (IPv4 und IPv6) in der Liste der Pods:

    kube-master# kubectl get pods -o wide
    NAME               READY     STATUS    RESTARTS   AGE       IP                          NODE
    nginx-controller   1/1       Running   0          20m       fd00:db8:1::2,192.168.1.3   kube-minion-1
    kube-master#

  • Neue API für EndpointEndpointSlice API. Es löst die Probleme der bestehenden Endpoint-API hinsichtlich Leistung/Skalierbarkeit, die verschiedene Komponenten im Control-Plane (apiserver, etcd, endpoints-controller, kube-proxy) betreffen. Die neue API wird zur API-Gruppe Discovery hinzugefügt und kann Zehntausende von Backend-Endpunkten für jeden Service in einem Cluster, der aus Tausenden von Knoten besteht, bedienen. Dazu wird jeder Service in N Objekte umgewandelt EndpointSlice, die standardmäßig maximal 100 Endpunkte haben (dieser Wert ist konfigurierbar). In der EndpointSlice API sind auch zukünftige Erweiterungsmöglichkeiten vorgesehen: Unterstützung für mehrere IP-Adressen pro Pod, neue Zustände für Endpunkte (nicht nur Bereit und NotReady), dynamisches Subsetting für Endpunkte.

Bis zur Beta-Version ist der in der letzten Veröffentlichung vorgestellte finalizer, genannt service.kubernetes.io/load-balancer-cleanup , und wird an jeden Service des Typs LoadBalancer, angeheftet. Bei der Löschung eines solchen Services verhindert er das tatsächliche Löschen der Ressource, bis die „Bereinigung“ aller entsprechenden Ressourcen des Load-Balancers abgeschlossen ist.

API Machinery

Dieses „Stabilisierungsetappe“ wurde im Bereich des Kubernetes API-Servers und der Interaktion mit ihm festgehalten. Vieles geschah dank der Überführung in den stabilen Status von nicht besonders darstellungsbedürftigen CustomResourceDefinitions (CRD), die seit der fernen Kubernetes-Version 1.7 (Juni 2017) den Beta-Status hatten. Dieselbe Stabilisierung wurde auch für die damit verbundenen Funktionen erreicht:

Ein weiterer Mechanismus, der für Kubernetes-Administratoren mittlerweile zur Gewohnheit geworden ist: admission webhook — befand sich ebenfalls lange Zeit im Beta-Status (seit K8s 1.9) und ist jetzt als stabil erklärt.

Zwei weitere Funktionen haben die Beta-Version erreicht: server-side apply und watch bookmarks.

Das einzige bedeutende Novum in der Alpha-Version war der Verzicht ab SelfLink — eine spezielle URI, die das angegebene Objekt repräsentiert und Teil von ObjectMeta und ListMeta (d.h. Teil jedes Objekts in Kubernetes). Warum wird darauf verzichtet? Die Motivation "auf einfache Weise" klingt wie das Fehlen tatsächlicher (unüberwindbarer) Gründe, warum dieses Feld weiterhin bestehen sollte. Formalere Gründe sind die Leistungsoptimierung (indem unnötige Felder entfernt werden) und die Vereinfachung der Arbeit des generic-apiserver, der gezwungen ist, ein solches Feld auf besondere Weise zu verarbeiten (es ist das einzige Feld, das direkt vor der Serialisierung des Objekts gesetzt wird). Die tatsächliche "Abwärtskompatibilität" (im Rahmen der Beta-Version) SelfLink wird mit der Version Kubernetes 1.20 eintreten, die endgültige mit 1.21.

Datenspeicherung

Die Hauptarbeit im Bereich Storage, wie auch in den vorherigen Releases, erfolgt im Bereich Unterstützung von CSI. Die wichtigsten Änderungen hier sind:

  • zunächst (in der Alpha-Version) ein die Unterstützung von CSI-Plugins für Worker-Knoten mit Windows: die aktuelle Methode zur Arbeit mit Speichern wird hier die in-kernel Plugins in Kubernetes und die FlexVolume-Plugins von Microsoft auf Powershell-Basis ersetzen;

    Kubernetes 1.16: Übersicht über die wichtigsten Neuerungen
    Das Schema zur Implementierung von CSI-Plugins in Kubernetes für Windows

  • die Möglichkeit die Größenänderung von CSI-Volumes, das bereits in K8s 1.12 vorgestellt wurde, hat die Beta-Version erreicht;
  • eine ähnliche "Einstufung" (von Alpha zu Beta) ist die Möglichkeit, CSI zur Erstellung von lokalen ephemeralen Volumes zu verwenden (CSI Inline Volume Support).

Die in der vorherigen Kubernetes-Version eingeführte Funktion zum Klonen von Volumes (Verwendung vorhandener PVC als DataSource zur Erstellung neuer PVC) hat ebenfalls den Beta-Status erreicht.

Scheduler

Zwei bemerkenswerte Änderungen in der Planung (beide in Alpha):

  • EvenPodsSpreading — die Möglichkeit, für die "gerechte Verteilung" von Lasten Pods anstelle von logischen Einheit von Anwendungen zu verwenden (wie Deployment und ReplicaSet) und diese Verteilung zu regulieren (als strenge Anforderung oder als weiche Bedingung, d.h. Priorität). Diese Funktion wird die bestehenden Möglichkeiten zur Verteilung geplanter Pods erweitern, die derzeit durch die Optionen PodAffinity PodAntiAffinity und PodAntiAffinity, indem den Administratoren eine feinere Kontrolle in dieser Angelegenheit eingeräumt wird, was eine höhere Verfügbarkeit und optimierten Ressourcenverbrauch zur Folge hat. Einzelheiten — in KEP.
  • Verwendung BestFit-Richtlinie in RequestedToCapacityRatio-Prioritätsfunktion bei der Planung von Pods, was es ermöglichen wird, einzusetzen Bin Packing („Containerverpackung“) sowohl für grundlegende Ressourcen (CPU, Speicher) als auch für erweiterte (wie GPU). Weitere Informationen finden Sie in KEP.

    Kubernetes 1.16: Übersicht über die wichtigsten Neuerungen
    Pod-Planung: vor der Verwendung der Best-Fit-Politik (direkt über den Default-Scheduler) und mit ihrer Verwendung (über den Scheduler Extender)

Außerdem, wurde vorgestellt die Möglichkeit, eigene Plugins für den Scheduler außerhalb des Hauptentwicklungsbaums von Kubernetes (out-of-tree) zu erstellen.

Weitere Änderungen

Außerdem kann in Kubernetes 1.16 auf folgendes hingewiesen werden: die Initiative zur Harmonisierung bestehender Metriken, genauer gesagt — in Übereinstimmung mit offiziellen Vorgaben zur Instrumentierung von K8s. Diese basieren größtenteils auf der entsprechenden Prometheus-Dokumentation. Unstimmigkeiten sind aus verschiedenen Gründen entstanden (zum Beispiel wurden einige Metriken einfach schon erstellt, bevor die aktuellen Anweisungen erschienen), und die Entwickler haben beschlossen, dass es an der Zeit sei, alles auf einen einheitlichen Standard zu bringen, „in Übereinstimmung mit dem restlichen Prometheus-Ökosystem“. Die aktuelle Umsetzung dieser Initiative hat den Status einer Alpha-Version, der in den nachfolgenden Kubernetes-Versionen schrittweise auf Beta (1.17) und stabil (1.18) angehoben wird.

Darüber hinaus können folgende Änderungen hervorgehoben werden:

  • Entwicklung der Windows-Unterstützung c mit dem Erscheinen des Kubeadm-Tools für dieses Betriebssystem (Alpha-Version), der Möglichkeit RunAsUserName für Windows-Containern (Alpha-Version), Verbesserung der Unterstützung von Gruppenverwalteten Dienstkonten (gMSA) bis zur Beta-Version, im Zugänglichkeitsbaum des Browsers). mount/attach für vSphere-Volumes.
  • Überarbeiteter Datenkomprimierungsmechanismus in API-Antworten. Früher wurde dafür ein HTTP-Filter verwendet, der eine Reihe von Einschränkungen mit sich brachte, die seine Verwendung standardmäßig verhinderten. Jetzt funktioniert die „transparente Kompression von Anfragen“: Clients, die Accept-Encoding: gzip im Header senden, erhalten eine GZIP-komprimierte Antwort, wenn deren Größe 128 Kb überschreitet. Clients in Go unterstützen automatisch die Kompression (senden den benötigten Header), sodass sie sofort einen Rückgang des Datenverkehrs bemerken. (Für andere Sprachen sind möglicherweise geringfügige Modifikationen erforderlich.)
  • Es ist nun möglich, Skalierung von HPA aus / zu null Pods basierend auf externen Metriken. Wenn das Scaling auf Basis von Objekten / externen Metriken erfolgt, kann automatisch auf 0 Replikate skaliert werden, wenn die Workloads inaktiv sind, um Ressourcen zu sparen. Diese Funktion ist besonders nützlich in Fällen, in denen Worker GPU-Ressourcen anfordern und die Anzahl der verschiedenen Arten inaktiver Worker die Anzahl der verfügbaren GPUs übersteigt.
  • Neuer Kunde — k8s.io/client-go/metadata.Client — für den "generischen" Zugriff auf Objekte. Er ist dafür gedacht, Metadaten (d.h. Unterteilungen in der Ressourcenspezifikation des Pods. Genauere Informationen finden Sie im) aus den Clusterressourcen einfach zu erhalten und Operationen wie Garbage Collection und Quota Management durchzuführen.
  • Kubernetes zu sammeln ist jetzt möglich ohne veraltete ("in-tree" integrierte) Cloud-Anbieter (Alpha-Version).
  • In das Tool kubeadm haben wurde eine experimentelle (Alpha-Version) Möglichkeit integriert, Kustomize-Patches während des init, join und upgrade. Weitere Informationen zur Verwendung des Flags --experimental-kustomize, siehe KEP.
  • Neuer Endpunkt für apiserver — readyz, — der es ermöglicht, Informationen über seine Bereitschaft (readiness) zu exportieren. Der API-Server hat auch ein Flag erhalten --maximum-startup-sequence-duration, das es ermöglicht, seine Neustarts zu steuern.
  • Zwei Funktionen für Azure wurden als stabil erklärt: Unterstützung für Verfügbarkeitszonen (Availability Zones) und cross resource group (RG). Darüber hinaus wurden in Azure hinzugefügt:
  • AWS hat jetzt unterstützt für EBS in Windows optimierte API-Aufrufe EC2 DescribeInstances.
  • Kubeadm migriert jetzt selbstständig die CoreDNS-Konfiguration bei der Aktualisierung der CoreDNS-Version. Binärdateien
  • etcd im entsprechenden Docker-Image wurden world-executable gemacht, was es ermöglicht, dieses Image ohne Root-Rechte zu starten. Darüber hinaus hat das etcd-Migrationsimage die Unterstützung für die Version etcd2 eingestellt. Cluster Autoscaler 1.16.0 ist auf die Verwendung von distroless als Basis-Image umgestiegen, hat die Leistung verbessert und neue Cloud-Anbieter (DigitalOcean, Magnum, Packet) hinzugefügt. Aktualisierungen in der verwendeten / abhängigen Software: Go 1.12.9, etcd 3.3.15, CoreDNS 1.6.2.
  • Im Kubernetes 1.15: Übersicht über die Hauptneuerungen Kubernetes 1.14: Übersicht über die Hauptneuerungen
  • Kubernetes 1.13: Übersicht über die Hauptneuerungen

P.S.

Lesen Sie auch in unserem Blog:

Quelle: habr.com

60GB SSD 8Gb DDR4