Einführung in Kubernetes CCM (Cloud Controller Manager) für Yandex.Cloud



In Fortsetzung der jüngsten Version des CSI-Treibers für Yandex.Cloud veröffentlichen wir ein weiteres Open Source-Projekt für diese Cloud - Cloud Controller Manager . CCM ist nicht nur für den gesamten Cluster erforderlich, sondern auch für den CSI-Treiber selbst. Details zu seinem Zweck und einigen Implementierungsfunktionen sind unter dem Schnitt.

Einführung


Warum ist das?


Die Motive, die uns dazu veranlassten, CCM für Yandex.Cloud zu entwickeln, stimmen vollständig mit denen überein, die bereits in der Ankündigung des CSI-Treibers beschrieben wurden. Wir bedienen viele Kubernetes-Cluster von verschiedenen Cloud-Anbietern, für die wir ein einziges Tool verwenden. Es implementiert zahlreiche Annehmlichkeiten, die die verwalteten Lösungen dieser Anbieter "umgehen". Ja, wir haben einen ziemlich spezifischen Fall und Bedürfnisse, aber die aufgrund dieser Entwicklungen entwickelten Entwicklungen können auch für andere Benutzer nützlich sein.

Was ist CCM im Allgemeinen?


In der Regel bereiten wir unsere Umgebung von außen auf den Cluster vor - beispielsweise mit Terraform. Manchmal muss jedoch die umgebende Cloud-Umgebung von einem Cluster aus verwaltet werden . Eine solche Gelegenheit wird bereitgestellt und von CCM umgesetzt .

Insbesondere bietet Cloud Controller Manager fünf grundlegende Arten der Interaktion:

  1. Instanzen - Implementiert eine 1: 1-Beziehung zwischen einem Knotenobjekt in Kubernetes ( Node) und einer virtuellen Maschine in einem Cloud-Anbieter. Dazu tun wir:
    • Füllen Sie das Feld spec.providerIDim Objekt aus Node. Für OpenStack CCM hat dieses Feld beispielsweise das folgende Format : openstack:///d58a78bf-21b0-4682-9dc6-2132406d2bb0. Sie können den Namen des Cloud-Anbieters und die eindeutige UUID des Servers (virtuelle Maschine in OpenStack) des Objekts sehen.
    • nodeInfo Node . , instance type AWS;
    • . , Node NotReady, , providerID. — Node, ;
  2. Zones – failure domain Node, Pod’ ;
  3. LoadBalancerService LoadBalancer , . , Yandex.Cloud NetworkLoadBalancer TargetGroup ;
  4. Route – , .. Kubernetes pod IP- pod’. (VXLAN, GENEVE) :

  5. Volume – PV, PVC SC. CCM, Container Storage Interface (CSI). CSI , , CSI-.

Früher lag der gesamte Code, der mit der Cloud interagierte, hauptsächlich in den Git-Repositorys des Kubernetes-Projekts unter der Adresse k8s.io/kubernetes/pkg/cloudprovider/providers. Sie entschieden sich jedoch, dies abzulehnen, da die Arbeit mit einer großen Codebasis unpraktisch war. Alle alten Implementierungen wurden in ein separates Repository verschoben . Zur Vereinfachung der weiteren Unterstützung und Entwicklung wurden alle gemeinsamen Komponenten auch in ein separates Repository verschoben .

Wie bei CSI haben viele große Cloud-Dienstleister bereits ihr CCM für den Cloud-Einsatz in Kubernetes entwickelt. Wenn der Lieferant nicht über CCM verfügt, aber alle erforderlichen Funktionen über die API verfügbar sind, können Sie CCM selbst implementieren.

Um Ihre CCM-Implementierung zu schreiben, reicht es aus, die erforderlichen Go-Schnittstellen zu implementieren .

UNDdas haben wir bekommen .

Implementierung


Wie bist du dazu gekommen?


Wir haben vor einem Jahr mit der Entwicklung (oder besser gesagt sogar der Verwendung) des fertigen (!) CCM für Yandex.Cloud begonnen.

Bei dieser Implementierung fehlte uns jedoch:

  • Authentifizierung über das JWT IAM-Token;
  • Service Controller-Unterstützung.

In Absprache mit dem Autor (dlisin) in Telegram haben wir den yandex-cloud-controller-manager gegabelt und die fehlenden Funktionen hinzugefügt.

Hauptmerkmale


CCM unterstützt derzeit die folgenden Schnittstellen:

  • die Instanzen ;
  • Zonen ;
  • LoadBalancer .

Wenn Yandex.Cloud in Zukunft mit den erweiterten Funktionen von VPC arbeitet, werden wir die Routes- Schnittstelle hinzufügen .

Loadbalanacer als Hauptherausforderung


Zunächst haben wir wie bei anderen CCM-Implementierungen versucht, ein Paar von LoadBalancerund TargetGroupfür jedes Servicemit einem Typ zu erstellen LoadBalancer. Yandex.Cloud zeigte jedoch eine interessante Einschränkung: Es kann nicht TargetGroupsmit Schnittpunkten Targets(Paar SubnetID- IpAddress) verwendet werden.



Daher innerhalb der etablierten CCM startete einen Controller , dass , wenn das Objekt Wechsel Nodeauf jeder virtuellen Maschine sammelt Informationen über alle Schnittstellen, gruppiert sie zu bestimmten gehören , NetworkIDerzeugt auf TargetGroupauf NetworkIDund sicherstellen , dass Strom es ist. Anschließend erstellen wir beim Erstellen eines Objekts Servicemit einem Typ LoadBalanacereinfach das zuvor erstellte Objekt TargetGroupan die neuen NetworkLoadBalanacer.

Wie fange ich an?


CCM unterstützt Kubernetes Version 1.15 und höher. Im Cluster muss für seinen Betrieb das Flag --cloud-provider=externalauf den Wert truefür kube-apiserver, kube-controller-manager, kube-scheduler und alle kubelet'ov gesetzt werden.

Alle notwendigen Schritte für die Installation selbst sind in README beschrieben . Die Installation läuft darauf hinaus, Objekte in Kubernetes aus Manifesten zu erstellen.

Um CCM verwenden zu können, benötigen Sie außerdem:

  • angeben , in dem Manifest der Kennung des Yandex.Cloud Verzeichnis ( folder-id);
  • Dienstkonto für die Interaktion mit der Yandex.Cloud-API. Im Manifest müssen SecretSie die autorisierten Schlüssel auf das Dienstkonto übertragen. In der Dokumentation wird beschrieben, wie Sie ein Dienstkonto erstellen und die Schlüssel abrufen.

Wir freuen uns über Feedback und neue Probleme, wenn Sie auf Probleme stoßen!

Zusammenfassung


Wir haben in den letzten zwei Wochen implementiertes CCM in fünf Kubernetes-Clustern verwendet und planen, ihre Anzahl im kommenden Monat auf 20 zu erhöhen. Die Verwendung von CCM für große und kritische K8-Installationen wird derzeit nicht empfohlen.

Wie im Fall von CSI freuen wir uns, wenn Yandex-Entwickler die Entwicklung und Unterstützung dieses Projekts übernehmen. Wir sind bereit, das Repository auf Anfrage zu übertragen, um speziellere Aufgaben für uns zu erledigen.

PS


Lesen Sie auch in unserem Blog:


All Articles