Introducendu Kubernetes CCM (Cloud Controller Manager) per Yandex.Cloud

Introducendu Kubernetes CCM (Cloud Controller Manager) per Yandex.Cloud

In seguitu à u recente Liberazione di u driver CSI per Yandex.Cloud pubblichemu un altru prughjettu Open Source per questa nuvola - Cloud Controller Manager. CCM hè necessariu micca solu per u cluster in tuttu, ma ancu per u driver CSI stessu. I dettagli nantu à u so scopu è alcune funziunalità di implementazione sò sottu u cut.

Introduzione

Perchè hè questu?

I mutivi chì ci anu incitatu à sviluppà CCM per Yandex.Cloud coincidenu cumplettamente cù quelli chì sò digià descritti in annunziu driver CSI. Mantenemu parechji clusters Kubernetes da diversi fornitori di nuvola, per quale usemu una sola strumentu. Implementa numerose comodità "bypassing" e suluzioni gestite di questi fornituri. Iè, avemu un casu piuttostu specificu è bisogni, ma i sviluppi creati per elli ponu esse utili à altri utilizatori.

Cosa hè esattamente CCM?

Di genere, preparamu l'ambienti intornu à noi per u cluster da fora - per esempiu, cù Terraform. Ma qualchì volta ci hè bisognu di gestisce l'ambiente nuvola intornu à noi da cluster. Sta pussibilità hè furnita, è hè questu chì hè implementatu CCM.

In particulare, Cloud Controller Manager furnisce cinque tippi principali di interazzione:

  1. Instances - implementa una relazione 1: 1 trà un oggettu di node in Kubernetes (Node) è una macchina virtuale in u fornitore di nuvola. Per questu noi:
    • compie u campu spec.providerID in l'ughjettu Node. Per esempiu, per OpenStack CCM stu campu hà u furmatu seguente: openstack:///d58a78bf-21b0-4682-9dc6-2132406d2bb0. Pudete vede u nome di u fornitore di nuvola è l'UUID unicu di u servitore (macchina virtuale in OpenStack) di l'ughjettu;
    • cumplementu nodeInfo in l'ughjettu Node infurmazione nantu à a macchina virtuale. Per esempiu, spicificà u tipu d'istanza in AWS;
    • Cuntrollamu a presenza di una macchina virtuale in u nuvulu. Per esempiu, se un ughjettu Node andò in un statu NotReady, pudete verificà s'ellu a macchina virtuale esiste in tuttu in u fornitore di nuvola da providerID. Se ùn ci hè micca, sguassate l'ughjettu Node, chì altrimenti fermanu in u cluster per sempre;
  2. suddivisioni - stabilisce u duminiu di fallimentu per l'ughjettu Node, cusì chì u pianificatore pò selezziunà un node per u Pod secondu e regioni è e zoni in u fornitore di nuvola;
  3. LoadBalancer - quandu crea un oggettu Service cù tipu LoadBalancer crea un tipu di balancer chì dirigerà u trafficu da l'esternu à i nodi di cluster. Per esempiu, in Yandex.Cloud pudete aduprà NetworkLoadBalancer и TargetGroup per questi scopi;
  4. Route - custruisce una reta trà i nodi, perchè Sicondu i requisiti di Kubernetes, ogni pod deve avè u so propiu indirizzu IP è esse capace di ghjunghje à qualsiasi altru pod. Per questi scopi, pudete aduprà una reta overlay (VXLAN, GENEVE) o stabilisce una tabella di routing direttamente in a reta virtuale di u fornitore di nuvola:

    Introducendu Kubernetes CCM (Cloud Controller Manager) per Yandex.Cloud

  5. Volume - Permette l'ordine dinamicu di PV cù PVC è SC. Inizialmente, sta funziunalità era parte di CCM, ma per via di a so grande cumplessità hè stata trasferita à un prughjettu separatu, Container Storage Interface (CSI). Avemu parlatu di CSI più di una volta hà scrittu è, cum'è digià dettu, ancu liberatu driver CSI.

Prima, tuttu u codice chì interagisce cù u nuvulu era situatu in u repositoriu Git principale di u prughjettu Kubernetes à k8s.io/kubernetes/pkg/cloudprovider/providers, ma decisu di abbandunà questu per l'inconvenimentu di travaglià cù una basa di codice grande. Tutte e vechji implementazioni sò state spustate repository separatu. Per a cunvenzione di più supportu è sviluppu, tutti i cumpunenti cumuni sò stati ancu spustati repository separatu.

Cum'è cù CSI, parechji grandi fornitori di nuvola anu digià cuncepitu i so CCM per sfruttà e nuvole in Kubernetes. Se u fornitore ùn hà micca CCM, ma tutte e funzioni necessarie sò dispunibili via API, pudete implementà CCM sè stessu.

Per scrive a vostra propria implementazione di CCM, hè abbastanza per implementà interfacce Go necessarie.

И questu hè ciò chì avemu avutu.

Реализация

Cumu hè ghjuntu à questu

Avemu principiatu u sviluppu (o megliu, ancu aduprà) cù pronta (!) CCM per Yandex.Cloud un annu fà.

Tuttavia, in questa implementazione ci mancava:

  • autentificazione via token JWT IAM;
  • Supportu di cuntrollu di serviziu.

In accordu cù l'autore (dlisin) in Telegram, avemu forked yandex-cloud-controller-manager è aghjustatu e funzioni mancanti.

Funzioni chjave

Attualmente, CCM supporta e seguenti interfacce:

  • Instances;
  • suddivisioni;
  • LoadBalancer.

In u futuru, quandu Yandex.Cloud cumencia à travaglià cù capacità avanzate di VPC, aghjunghjemu una interfaccia Rutes.

LoadBalanacer cum'è sfida principale

Inizialmente, avemu pruvatu, cum'è altre implementazioni CCM, per creà un paru di LoadBalancer и TargetGroup per ognunu Service cù tipu LoadBalancer. Tuttavia, Yandex.Cloud hà scupertu una limitazione interessante: ùn pudete micca aduprà TargetGroups cù l'intersezzione Targets (coppiu SubnetID - IpAddress).

Introducendu Kubernetes CCM (Cloud Controller Manager) per Yandex.Cloud

Dunque, in u CCM creatu, hè lanciatu un controller, chì, quandu l'uggetti cambianu Node raccoglie l'infurmazioni nantu à tutte l'interfaccia nantu à ogni macchina virtuale, li raggruppa secondu a so appartenenza à certi NetworkID, crea da TargetGroup nantu NetworkID, è monitoreghja ancu a pertinenza. In seguitu, quandu crea un ughjettu Service cù tipu LoadBalanacer avemu simpricimenti attache un pre-creatu TargetGroup à novu NetworkLoadBalanacer'sò.

Cumu cumincià à aduprà?

CCM supporta Kubernetes versione 1.15 è superiore. In un cluster, per u travagliu, esige chì a bandiera --cloud-provider=external era stabilitu à true per kube-apiserver, kube-controller-manager, kube-scheduler è tutti i kubelets.

Tutti i passi necessarii per a stallazione stessu sò descritti in README. L'installazione si riduce à creà oggetti in Kubernetes da manifesti.

Per utilizà CCM, avete ancu bisognu:

  • indicà in u manifestu l'identificatore di u cartulare (folder-id) Yandex.Cloud;
  • contu di serviziu per interagisce cù l'API Yandex.Cloud. In u manifestu Secret hè necessariu trasferisce e chjave autorizate da u contu di serviziu. In a documentazione descrittu, cumu per creà un contu di serviziu è uttene chjave.

Seremu felici di riceve u vostru feedback è prublemi novis'è tù scontri ogni prublema!

Risultati

Avemu usatu u CCM implementatu in cinque clusters Kubernetes in l'ultime duie settimane è pensanu à espansione u so numeru à 20 in u mesi chì vene. Attualmente ùn ricumandemu micca aduprà CCM per installazioni K8s grandi è critichi.

Cum'è in u casu di CSI, seremu cuntenti se i sviluppatori Yandex piglianu u sviluppu è u sustegnu di stu prughjettu - simu pronti à trasfirià u repository à a so dumanda per trattà cù i travaglii chì sò più pertinenti per noi.

PS

Leghjite puru nant'à u nostru blog:

Source: www.habr.com

Add a comment