Predstavljamo Kubernetes CCM (Cloud Controller Manager) za Yandex.Cloud

Predstavljamo Kubernetes CCM (Cloud Controller Manager) za Yandex.Cloud

U nastavku nedavne Izdanje CSI drajvera za Yandex.Cloud objavljujemo još jedan Open Source projekt za ovaj oblak - Upravitelj Cloud Controllera. CCM je potreban ne samo za cluster kao cjelinu, već i za sam CSI driver. Pojedinosti o njegovoj namjeni i nekim značajkama implementacije nalaze se ispod.

Uvod

Zašto je ovo?

Motivi koji su nas potaknuli da razvijemo CCM za Yandex.Cloud potpuno se podudaraju s onima koji su već opisani u Obavijest CSI vozači. Održavamo mnoge Kubernetes klastere različitih pružatelja usluga oblaka, za koje koristimo jedan alat. Implementira brojne pogodnosti "zaobilazeći" upravljana rješenja ovih pružatelja usluga. Da, imamo prilično specifičan slučaj i potrebe, ali razvoj stvoren zbog njih može biti koristan drugim korisnicima.

Što je zapravo CCM?

Obično pripremamo okolinu oko sebe za klaster izvana - na primjer, koristeći Terraform. Ali ponekad postoji potreba za upravljanjem okruženjem oblaka oko nas iz klastera. Ta je mogućnost predviđena i ona se provodi TLC.

Konkretno, Cloud Controller Manager pruža pet glavnih vrsta interakcije:

  1. Slučajevi – implementira odnos 1:1 između objekta čvora u Kubernetesu (Node) i virtualni stroj u pružatelju usluga oblaka. Za ovo mi:
    • ispunite polje spec.providerID u objektu Node. Na primjer, za OpenStack CCM ovo polje ima sljedeći format: openstack:///d58a78bf-21b0-4682-9dc6-2132406d2bb0. Možete vidjeti naziv pružatelja usluge oblaka i jedinstveni UUID poslužitelja (virtualnog stroja u OpenStacku) objekta;
    • upotpuniti, dopuna nodeInfo u objektu Node informacije o virtualnom stroju. Na primjer, specificiramo tip instance u AWS-u;
    • Provjeravamo prisutnost virtualnog stroja u oblaku. Na primjer, ako objekt Node otišao u stanje NotReady, možete provjeriti postoji li virtualni stroj uopće u pružatelju usluga oblaka tako da providerID. Ako ga nema, izbrišite objekt Node, koji bi inače zauvijek ostao u klasteru;
  2. zone – postavlja domenu kvara za objekt Node, tako da planer može odabrati čvor za Pod prema regijama i zonama u pružatelju usluga oblaka;
  3. LoadBalancer – prilikom izrade objekta Service s tipom LoadBalancer stvara neku vrstu balansera koji će usmjeriti promet izvana na čvorove klastera. Na primjer, u Yandex.Cloudu možete koristiti NetworkLoadBalancer и TargetGroup za ove svrhe;
  4. Ruta – gradi mrežu između čvorova, jer Prema zahtjevima Kubernetesa, svaki pod mora imati vlastitu IP adresu i biti u mogućnosti dosegnuti bilo koji drugi pod. U ove svrhe možete koristiti preklapajuću mrežu (VXLAN, GENEVE) ili postaviti tablicu usmjeravanja izravno u virtualnoj mreži pružatelja usluga oblaka:

    Predstavljamo Kubernetes CCM (Cloud Controller Manager) za Yandex.Cloud

  5. Volumen – Omogućuje dinamičko naručivanje PV-a pomoću PVC-a i SC-a. U početku je ova funkcionalnost bila dio CCM-a, ali je zbog velike složenosti premještena u zaseban projekt, Container Storage Interface (CSI). Više smo puta razgovarali o CSI-ju писали i, kao što je već spomenuto, čak pušten CSI vozač.

Prethodno je sav kod u interakciji s oblakom bio smješten u glavnom Git repozitoriju projekta Kubernetes na k8s.io/kubernetes/pkg/cloudprovider/providers, ali su to odlučili napustiti zbog neugodnosti rada s velikom bazom koda. Sve stare implementacije premještene su na odvojeno spremište. Radi praktičnosti daljnje podrške i razvoja, sve uobičajene komponente također su premještene u odvojeno spremište.

Kao i kod CSI-ja, mnogi veliki pružatelji usluga oblaka već su dizajnirali svoje CCM-ove kako bi iskoristili oblake na Kubernetesu. Ako dobavljač nema CCM, ali su sve potrebne funkcije dostupne putem API-ja, tada možete sami implementirati CCM.

Da biste napisali vlastitu implementaciju CCM-a, dovoljno je implementirati potrebna Go sučelja.

И ovo je ono što imamo.

Provedba

Kako ste došli do ovoga

Započeli smo razvoj (ili bolje rečeno, čak korištenje) sa spreman(!) CCM za Yandex.Cloud prije godinu dana.

Međutim, u ovoj nam implementaciji nedostaju:

  • autentifikacija putem JWT IAM tokena;
  • Podrška kontrolora usluge.

U dogovoru sa autorom (dlisin) u Telegramu smo račvali yandex-cloud-controller-manager i dodali funkcije koje nedostaju.

Ključne značajke

Trenutno CCM podržava sljedeća sučelja:

  • Slučajevi;
  • zone;
  • LoadBalancer.

U budućnosti, kada Yandex.Cloud počne raditi s naprednim VPC mogućnostima, dodat ćemo sučelje Rute.

LoadBalanacer kao glavni izazov

U početku smo pokušali, kao i druge implementacije CCM-a, stvoriti par LoadBalancer и TargetGroup za svakoga Service s tipom LoadBalancer. Međutim, Yandex.Cloud je otkrio jedno zanimljivo ograničenje: ne možete koristiti TargetGroups s presijecanjem Targets (par SubnetID - IpAddress).

Predstavljamo Kubernetes CCM (Cloud Controller Manager) za Yandex.Cloud

Stoga se unutar kreiranog CCM-a pokreće kontroler koji, kada se objekti mijenjaju Node prikuplja podatke o svim sučeljima na svakom virtualnom stroju, grupira ih prema pripadnosti određenom NetworkID, stvara autor TargetGroup na NetworkID, a također prati relevantnost. Naknadno, prilikom izrade objekta Service s tipom LoadBalanacer jednostavno priložimo unaprijed stvorenu TargetGroup do novih NetworkLoadBalanacer'sam.

Kako početi koristiti?

CCM podržava Kubernetes verziju 1.15 i novije. U klasteru, da bi funkcionirao, zahtijeva zastavu --cloud-provider=external je postavljen na true za kube-apiserver, kube-controller-manager, kube-scheduler i sve kubelets.

Svi potrebni koraci za samu instalaciju opisani su u README. Instalacija se svodi na stvaranje objekata u Kubernetesu iz manifesta.

Za korištenje CCM-a trebat će vam i:

  • odrediti u manifestu identifikator imenika (folder-id) Yandex.Cloud;
  • račun usluge za interakciju s Yandex.Cloud API-jem. U manifestu Secret nužan prijenos ovlaštenih ključeva sa servisnog računa. U dokumentaciji opisano, kako kreirati servisni račun i dobiti ključeve.

Bit će nam drago primiti vaše povratne informacije i nova pitanjaako naiđete na probleme!

Rezultati

Koristili smo implementirani CCM u pet Kubernetes klastera tijekom posljednja dva tjedna i planiramo povećati njihov broj na 20 u narednom mjesecu. Trenutačno ne preporučujemo korištenje CCM-a za velike i kritične K8s instalacije.

Kao iu slučaju CSI-ja, bit će nam drago ako programeri Yandexa preuzmu razvoj i podršku ovog projekta - spremni smo prenijeti spremište na njihov zahtjev kako bismo se nosili sa zadacima koji su nam relevantniji.

PS

Pročitajte i na našem blogu:

Izvor: www.habr.com

Dodajte komentar