Vă prezentăm Kubernetes CCM (Cloud Controller Manager) pentru Yandex.Cloud

Vă prezentăm Kubernetes CCM (Cloud Controller Manager) pentru Yandex.Cloud

În continuarea recentului Eliberarea driverului CSI pentru Yandex.Cloud publicăm un alt proiect Open Source pentru acest cloud - Cloud Controller Manager. CCM este necesar nu numai pentru cluster ca un întreg, ci și pentru driverul CSI în sine. Detalii despre scopul său și unele caracteristici de implementare sunt sub tăietură.

Introducere

De ce asta?

Motivele care ne-au determinat să dezvoltăm CCM pentru Yandex.Cloud coincid complet cu cele descrise deja în anunţ Drivere CSI. Menținem multe clustere Kubernetes de la diferiți furnizori de cloud, pentru care folosim un singur instrument. Implementează numeroase facilități „ocolind” soluțiile gestionate ale acestor furnizori. Da, avem un caz și nevoi destul de specifice, dar dezvoltările create din cauza lor pot fi utile altor utilizatori.

Ce este mai exact CCM?

De obicei, pregătim mediul din jurul nostru pentru cluster din afara - de exemplu, folosind Terraform. Dar uneori este nevoie să gestionăm mediul cloud din jurul nostru din cluster. Această posibilitate este oferită și este cea care este implementată CCM.

În mod specific, Cloud Controller Manager oferă cinci tipuri principale de interacțiune:

  1. Instanțe – implementează o relație 1:1 între un obiect nod în Kubernetes (Node) și o mașină virtuală în furnizorul de cloud. Pentru aceasta noi:
    • completați câmpul spec.providerID în obiect Node. De exemplu, pentru OpenStack CCM, acest câmp are următorul format: openstack:///d58a78bf-21b0-4682-9dc6-2132406d2bb0. Puteți vedea numele furnizorului de cloud și UUID-ul unic al serverului (mașina virtuală în OpenStack) al obiectului;
    • completa nodeInfo în obiect Node informații despre mașina virtuală. De exemplu, specificăm tipul instanței în AWS;
    • Verificăm prezența unei mașini virtuale în cloud. De exemplu, dacă un obiect Node a intrat într-o stare NotReady, puteți verifica dacă mașina virtuală există deloc în furnizorul de cloud prin providerID. Dacă nu este acolo, ștergeți obiectul Node, care altfel ar rămâne în grup pentru totdeauna;
  2. zonele – setează domeniul de eroare pentru obiect Node, astfel încât planificatorul să poată selecta un nod pentru Pod în funcție de regiunile și zonele din furnizorul de cloud;
  3. Echilibrarea greutății – la crearea unui obiect Service cu tip LoadBalancer creează un fel de echilibrator care va direcționa traficul din exterior către nodurile clusterului. De exemplu, în Yandex.Cloud puteți utiliza NetworkLoadBalancer и TargetGroup în aceste scopuri;
  4. Traseul – construiește o rețea între noduri, deoarece Conform cerințelor Kubernetes, fiecare pod trebuie să aibă propria sa adresă IP și să poată ajunge la orice alt pod. În aceste scopuri, puteți utiliza o rețea suprapusă (VXLAN, GENEVE) sau puteți seta o tabelă de rutare direct în rețeaua virtuală a furnizorului de cloud:

    Vă prezentăm Kubernetes CCM (Cloud Controller Manager) pentru Yandex.Cloud

  5. Volum – Permite comandarea dinamică a PV folosind PVC și SC. Inițial, această funcționalitate făcea parte din CCM, dar datorită complexității sale mari a fost mutată într-un proiect separat, Container Storage Interface (CSI). Am vorbit despre CSI de mai multe ori писали și, după cum am menționat deja, chiar eliberată driver CSI.

Anterior, tot codul care interacționa cu cloud-ul era localizat în depozitul principal Git al proiectului Kubernetes la k8s.io/kubernetes/pkg/cloudprovider/providers, dar au decis să abandoneze acest lucru din cauza inconvenientului de a lucra cu o bază de cod mare. Toate implementările vechi au fost mutate în depozit separat. Pentru confortul asistenței și dezvoltării ulterioare, toate componentele comune au fost, de asemenea, mutate în depozit separat.

Ca și în cazul CSI, mulți furnizori mari de cloud și-au proiectat deja CCM-urile pentru a folosi cloud-urile pe Kubernetes. Dacă furnizorul nu are CCM, dar toate funcțiile necesare sunt disponibile prin API, atunci puteți implementa singur CCM.

Pentru a scrie propria implementare a CCM, este suficient să implementați interfețele Go necesare.

И asta avem.

punerea în aplicare

Cum ai ajuns la asta

Am început dezvoltarea (sau mai bine zis, chiar folosirea) cu gata(!) CCM pentru Yandex.Cloud acum un an.

Cu toate acestea, în această implementare ne lipseau:

  • autentificare prin token JWT IAM;
  • Suport controler de service.

În acord cu autorul (dlisin) în Telegram, am bifurcat yandex-cloud-controller-manager și am adăugat funcțiile lipsă.

Caracteristici cheie

În prezent, CCM acceptă următoarele interfețe:

  • Instanțe;
  • zonele;
  • Echilibrarea greutății.

În viitor, când Yandex.Cloud începe să lucreze cu capabilități avansate VPC, vom adăuga o interfață rute.

LoadBalanacer ca principală provocare

Inițial, am încercat, ca și alte implementări CCM, să creăm o pereche de LoadBalancer и TargetGroup pentru toată lumea Service cu tip LoadBalancer. Cu toate acestea, Yandex.Cloud a descoperit o limitare interesantă: nu puteți utiliza TargetGroups cu intersectarea Targets (pereche SubnetID - IpAddress).

Vă prezentăm Kubernetes CCM (Cloud Controller Manager) pentru Yandex.Cloud

Prin urmare, în interiorul CCM creat, este lansat un controler, care, atunci când obiectele se schimbă Node colectează informații despre toate interfețele de pe fiecare mașină virtuală, le grupează în funcție de apartenența lor la anumite NetworkID, creează de TargetGroup pe NetworkIDși, de asemenea, monitorizează relevanța. Ulterior, la crearea unui obiect Service cu tip LoadBalanacer pur și simplu atașăm un pre-creat TargetGroup la nou NetworkLoadBalanacer'a.m.

Cum să începi să folosești?

CCM acceptă Kubernetes versiunea 1.15 și o versiune ulterioară. Într-un cluster, pentru ca acesta să funcționeze, este nevoie ca steag --cloud-provider=external a fost setat la true pentru kube-apiserver, kube-controller-manager, kube-scheduler și toate kubeletele.

Toți pașii necesari pentru instalarea în sine sunt descriși în README. Instalarea se rezumă la crearea de obiecte în Kubernetes din manifeste.

Pentru a utiliza CCM veți avea nevoie și de:

  • specifica în manifest identificatorul directorului (folder-id) Yandex.Cloud;
  • cont de serviciu pentru interacțiunea cu API-ul Yandex.Cloud. În manifest Secret must transferul cheilor autorizate din contul de serviciu. În documentație descris, cum să creați un cont de serviciu și să obțineți cheile.

Vom fi bucuroși să primim feedback-ul dvs. și probleme noidaca intampini vreo problema!

Rezultatele

Am folosit CCM implementat în cinci clustere Kubernetes în ultimele două săptămâni și intenționăm să le extindem numărul la 20 în luna viitoare. În prezent, nu recomandăm utilizarea CCM pentru instalații mari și critice K8s.

Ca și în cazul CSI, ne vom bucura dacă dezvoltatorii Yandex preiau dezvoltarea și sprijinirea acestui proiect - suntem gata să transferăm depozitul la cererea lor pentru a ne ocupa de sarcinile care sunt mai relevante pentru noi.

PS

Citește și pe blogul nostru:

Sursa: www.habr.com

Adauga un comentariu