Kubernetes Containerd-Integration ersetzt Docker für die Produktion



Hinweis perev. : Wir haben mehr als einmal über Containerd und andere Laufzeiten für Kubernetes geschrieben. Die neue Veröffentlichung ist eine Übersetzung der jüngsten Ankündigung eines wichtigen Meilensteins in der Entwicklung von Containerd, die im offiziellen Blog des Kubernetes-Projekts veröffentlicht wurde. Der Text wurde von Mitarbeitern von Google und IBM verfasst, die (natürlich zusammen mit Docker Inc) erheblich zur Verbesserung von Containerd beitragen.

Zu Beginn des Blogs haben wir in der Notiz " Containerd bringt mehr Container-Laufzeitoptionen für Kubernetes" eine Alpha-Version der Integration von Containerd in Kubernetes vorgestellt. Die nächsten 6 Monate der Entwicklung führten dazu, dass die Integration öffentlich verfügbar wurde! Dies bedeutet, dass Sie jetzt Containerd 1.1 als Laufzeit für Container in Kubernetes-Clustern in der Produktion verwenden können.

Containerd 1.1 funktioniert mit Kubernetes Version 1.10 und höher und unterstützt alle Kubernetes-Funktionen. In der Kubernetes-Testinfrastruktur entspricht die Abdeckung von Containerd-Integrationstests auf der Google Cloud Platform der Integration mit Docker (siehe Test-Dashboard ).

„Wir freuen uns, dass Containerd diesen wichtigen Meilenstein schnell erreicht. Bei Alibaba Cloud haben wir von Anfang an begonnen, Containerd aktiv einzusetzen, und dank seiner Betonung auf Einfachheit und Zuverlässigkeit wurde Containerd zur Standard-Container-Engine in seinem Produkt Serverless Kubernetes, das hohe Anforderungen an Leistung und Stabilität stellt. Containerd wird zweifellos der Hauptmotor der Container-Ära sein und zur Entwicklung von Innovationen führen. “ - Xinwei, ein Vollzeitingenieur von Alibaba Cloud

Architektonische Verbesserungen


Die Architektur für die Integration von Containerd in Kubernetes wurde zweimal geändert. Jeder seiner Evolutionsschritte stabilisierte und verbesserte die Effizienz des Stapels.

Containerd 1.0 - CRI-Containerd (nicht mehr vorhanden)




In Containerd 1.0 wurde der Cri-Containerd-Daemon für die Interaktion zwischen Kubelet und Containerd benötigt (wir haben darüber am Ende dieses Artikels geschrieben - ca. Transl. ) . Dieser Daemon hat Anforderungen an das Container Runtime Interface (CRI) von Kubelet bereitgestellt und Containerd verwendet, um Container und Container-Images ordnungsgemäß zu verwalten. Dieser Ansatz eliminierte eine zusätzliche Verknüpfung im Stapel im Vergleich zur Docker CRI-Implementierung ( Dockershim ) - siehe Abbildung oben .

Cri-Containerd und Containerd 1.0 waren jedoch zwei separate Dämonen, die über GRPC interagierten. Ein zusätzlicher Daemon in diesem Bundle erschwerte den Benutzern das Verständnis des Geräts und der Bereitstellung und verursachte unnötigen Overhead für die Interaktion.

Containerd 1.1 - CRI Plugin (aktuelle Version)




In Containerd 1.1 wurde der Cri-Containerd-Daemon in das Containerd-CRI-Plugin übernommen. Dieses Plugin ist in Containerd 1.1 integriert und standardmäßig aktiviert. Im Gegensatz zu Cri-Containerd interagiert das Plugin mit Containerd, indem es die erforderlichen Funktionen direkt aufruft. Die neue Architektur hat die Integration stabiler und produktiver gemacht und eine weitere Verbindung (GRPC) aus dem Stapel entfernt. Jetzt kann Containerd 1.1 direkt in Kubernetes verwendet werden, und der Cri-Containerd-Daemon wird nicht mehr benötigt.

Leistung


Eines der Hauptziele von Containerd 1.1 war die Verbesserung der Leistung. Optimierungen wurden im Bereich der Startzeit und der vom Dämon verwendeten Ressourcen durchgeführt.

Die folgenden Ergebnisse sind ein Vergleich von Containerd 1.1 und Docker 18.03 CE. Integration Containerd 1.1 verwendet das integrierte CRI-Plugin, und die Integration für Docker 18.03 CE funktioniert mit Dockershim. Die Ergebnisse wurden mithilfe des Kubernetes- Knotenleistungs- Benchmarks generiert, der Teil der e2e-Tests für K8s-Knoten ist . Die meisten Vergleichsdaten sind im Node Performance Dashboard öffentlich verfügbar.

Verzögerung des Herdstarts


Die Ergebnisse des 105-Pod-Batch-Startbenchmarks zeigen, dass die Integration von Containerd 1.1 beim Starten des Pods weniger Verzögerungen aufweist als Docker 18.03 CE mit Dockershim (je kleiner desto besser).



CPU und Speicher


Im Leerlauf verbraucht die Integration von Containerd 1.1 mit 105 Herden weniger Prozessor und Speicher als die Integration von Docker 18.03 CE mit Dockershim. Die Ergebnisse können abhängig von der Anzahl der auf dem Knoten gestarteten Herde variieren - die Anzahl von 105 Herden wird ausgewählt, weil Der Standardwert ist jetzt der Maximalwert für benutzerdefinierte Herde auf dem Knoten.

Wie aus den folgenden Grafiken ersichtlich ist, verbraucht die Integration von Containerd 1.1 in Kubelet 30,89% weniger CPU und 11,30% weniger RSS-Speicher (residente Satzgröße ) sowie 12,78% weniger RSS-Speicher, der von der Container-Laufzeit verbraucht wird .



Ergänzung durch den Übersetzer


Es ist zu beachten, dass sich eine weitere alternative Lösung, CRI-O , weiterentwickelt. Insbesondere auf einem Open Source Summit Japan 2018 in diesen Tagen präsentierte ein Mitarbeiter von NTT einen Bericht mit einem umfassenden Vergleich bestehender ausführbarer Umgebungen für Container. Und hier ist eine seiner Folien, die ihre Leistung vergleicht:



crictl


Die Container Runtime Console Interface (CLI) ist ein nützliches Tool zum Erkennen von Problemen im System und in der Anwendung. Wenn Sie Docker als Containerumgebung in Kubernetes verwenden, rufen Systemadministratoren manchmal die Kubernetes-Site auf, um Docker-Befehle auszuführen und Informationen über das System und / oder die Anwendung zu sammeln. Beispielsweise können sie docker ps und docker inspect , um den Status des Prozesses zu überprüfen, docker images , um eine Liste der Bilder auf dem Knoten docker info , docker info , um die Konfiguration der Laufzeit für Container usw. abzurufen.

Für Containerd und alle anderen CRI-kompatiblen Umgebungen wie Dockershim empfehlen wir die Verwendung von crictl als CLI-Alternative zu Docker-Konsolenbefehlen, um Probleme auf Pods, Containern und Container-Images zu analysieren, die auf Kubernetes-Knoten gehostet werden.

crictl ist ein Dienstprogramm, das ähnliche Funktionen wie die Docker-CLI bietet und für alle Laufzeitumgebungen für mit CRI kompatible Container gleich gut funktioniert. Es befindet sich im Repository von kubernetes-inkubator / cri-tools . Die aktuelle Version ist cri-tools v1.11.0 (die Version wurde für die aktuelle Version vor 3 Tagen anstelle von v1.0.0-beta.1 , angegeben im Originalartikel, ca. übersetzt ) korrigiert . Obwohl das Dienstprogramm crictl der Docker-CLI ähnelt und einen einfachen Übergang für Benutzer bietet, handelt es sich nicht um eine vollständige Kopie davon. Einige wichtige Unterschiede werden nachstehend beschrieben.

Eingeschränkte Verwendung: crictl ist ein Tool zur Fehlerbehebung


crictl ist kein Ersatz für kubectl oder kubectl - seine Verwendung beschränkt sich auf den Umfang der Problemidentifizierung und -analyse. Die Docker-Konsolenoberfläche bietet eine Vielzahl von Befehlen und ist daher ein sehr nützliches Entwicklungswerkzeug. Dies ist jedoch nicht die beste Option zur Fehlerbehebung auf Kubernetes-Knoten. Einige Docker-Befehle (z. B. docker network und docker build ) sind für Kubernetes unbrauchbar, und einige (z. B. docker rename ) können alles beschädigen. Der Zweck von crictl besteht darin, genügend Befehle bereitzustellen, um Probleme auf Knoten zu identifizieren, die in Produktionsumgebungen sicher verwendet werden können.

Kubernetes Fokus


crictl bietet eine verständlichere Containeransicht in der Kubernetes-Welt. Die Docker-Konsolenschnittstelle funktioniert nicht mit grundlegenden Kubernetes-Konzepten wie unter (pod) und Namespace ( Namespace ), wodurch die visuelle Darstellung von Containern und Herden verhindert wird (die Bedeutung dieses Problems ist bereits im Überwachungskontext zutreffend, über den wir kürzlich in diesem Bericht gesprochen haben - Hinweis . perev. ) . Ein solches Beispiel ist docker ps das obskure, lange Namen für Docker-Container und eine Liste von Pausencontainern zusammen mit Anwendungscontainern anzeigt:



Pausencontainer sind jedoch Teil der Herdimplementierung, wobei für jeden Herd ein solcher Container verwendet wird. Sie sollten nicht angezeigt werden, wenn Container angezeigt werden, die Teil des Herdes sind.

crictl wurde dagegen für Kubernetes erstellt. Das Dienstprogramm bietet verschiedene Befehlssätze für Herde und Container. Beispielsweise zeigt crictl pods Informationen zu crictl pods , und crictl ps zeigt nur Informationen zu Anwendungscontainern an. Alle Daten werden in einer Tabellenansicht formatiert:





Ein weiteres Beispiel - in crictl pods gibt es ein Argument - --namespace , mit dem Pods nach in Kubernetes definierten Namespaces --namespace werden können:



Weitere Informationen zur Verwendung von crictl mit Containerd finden Sie hier:


Aber was ist mit der Docker Engine?


Wir hören oft die folgende Frage: "Bedeutet der Wechsel zu Containerd, dass ich die Docker Engine nicht mehr verwenden kann?", Und die kurze Antwort darauf lautet "NEIN".

Docker Engine basiert auf Containerd. Die nächste Version der Docker Community Edition (Docker CE) wird Containerd Version 1.1 verwenden. Dementsprechend wird es ein eingebautes und standardmäßig aktiviertes CRI-Plugin haben. Dies bedeutet, dass Benutzer die Möglichkeit haben, weiterhin mit der Docker Engine für andere typische Szenarien zu arbeiten sowie Kubernetes so zu konfigurieren, dass das zugrunde liegende Containerd verwendet wird, das mit der Docker Engine geliefert wird und gleichzeitig von der Docker Engine auf demselben Host verwendet wird. Schauen Sie sich das folgende Architekturdiagramm an, das zeigt, wie Docker Engine und Kubelet denselben Container verwenden:



Da Containerd sowohl von Kubelet als auch von der Docker Engine verwendet wird, erhalten Benutzer, die sich für die Integration in Containerd entscheiden, nicht nur alle neuen Funktionen für Kubernetes, Verbesserungen der Leistung und Stabilität, sondern auch die Option, die Docker Engine wie zuvor für andere Anforderungen zu verwenden.

Der Namespace- Mechanismus in Containerd stellt sicher, dass Kubelet und die Docker Engine keinen Zugriff auf Container und Images haben, die nicht von ihnen erstellt wurden. Dies bedeutet, dass sie sich nicht gegenseitig stören sowie:

  • Benutzer, die den docker ps eingeben, sehen die in Kubernetes erstellten Container nicht. Verwenden Sie dazu crictl ps . Umgekehrt sehen Benutzer keine Container, die in der Docker-CLI auf Kubernetes oder im Befehl crictl ps . Die crictl run crictl create und crictl run dienen nur zur Fehlerbehebung. Das manuelle Ausführen von Herden oder Containern mit crictl auf Produktionsknoten wird nicht empfohlen.
  • Benutzer, die den docker images docker images eingeben, sehen die Bilder von Kubernetes nicht. Verwenden Sie dazu den Befehl crictl images . Umgekehrt sieht Kubernetes die Bilder nicht, die mit den Befehlen docker pull , docker load und docker build . Verwenden Sie dazu den Befehl crictl pull sowie ctr cri load , wenn Sie das Bild laden möchten.

Zusammenfassung


  • Containerd 1.1 bietet native CRI-Unterstützung. Es kann direkt von Kubernetes verwendet werden.
  • Containerd 1.1 ist produktionsbereit.
  • Containerd 1.1 bietet eine gute Leistung in Bezug auf die Startzeit des Pods und die Auslastung der Systemressourcen.
  • crictl ist ein Konsolen-Dienstprogramm (CLI) für die Kommunikation mit Containerd 1.1 und anderen Laufzeitumgebungen für Container, die CRI entsprechen, um Probleme auf dem Knoten zu identifizieren.
  • Containerd 1.1 wird in der nächsten stabilen Version von Docker CE enthalten sein. Benutzer haben die Möglichkeit, in Fällen, die nicht von Kubernetes stammen, weiterhin mit Docker zu arbeiten und Kubernetes so zu konfigurieren, dass das zugrunde liegende Containerd verwendet wird, das Teil von Docker ist.

Wir möchten uns bei allen von Google, IBM, Docker, ZTE, ZJU und einzelnen Entwicklern bedanken, die dazu beigetragen und alles möglich gemacht haben!

Eine detaillierte Liste der Änderungen in Containerd 1.1 finden Sie in den Versionshinweisen .

Wie man es versucht


Anweisungen zum Einrichten eines Kubernetes-Clusters zur Verwendung von Containerd als Standardlaufzeit:

  • für einen Cluster auf GCE, der mit kube-up.sh , - hier ;
  • einen Cluster mit vielen Knoten mit Ansible und kubeadm installieren - hier ;
  • Informationen zum Erstellen eines Clusters von Grund auf in Google Cloud finden Sie unter " Kubernetes the Hard Way ".
  • zur manuellen Installation aus dem Tarball-Archiv - hier ;
  • zur Installation mit LinuxKit auf einer lokalen virtuellen Maschine - hier .

Wie man dazu beiträgt


Containerd CRI-Plugin - Ein Open Source-Projekt auf GitHub, das Teil von Containerd ist: https://github.com/containerd/cri . Alle vorgeschlagenen Änderungen sind in Form von Ideen, Tickets und Korrekturen willkommen. Diese Anleitung für Entwickler ist ein guter Ausgangspunkt, um Änderungen vorzunehmen.

PS vom Übersetzer


Lesen Sie auch in unserem Blog:

Source: https://habr.com/ru/post/de414875/


All Articles