IepazÄ«stinÄm ar Kubernetes CCM (Cloud Controller Manager) Yandex.Cloud
Turpinot neseno CSI draivera izlaiÅ”ana Yandex.Cloud mÄs publicÄjam vÄl vienu atvÄrtÄ pirmkoda projektu Å”im mÄkonim - MÄkoÅu kontroliera pÄrvaldnieks. CCM ir nepiecieÅ”ams ne tikai klasterim kopumÄ, bet arÄ« paÅ”am CSI draiverim. SÄ«kÄka informÄcija par tÄ mÄrÄ·i un dažÄm ievieÅ”anas funkcijÄm ir izgriezta.
Ievads
KÄpÄc ir Å”is?
MotÄ«vi, kas pamudinÄja mÅ«s izstrÄdÄt CCM priekÅ” Yandex.Cloud, pilnÄ«bÄ sakrÄ«t ar tiem, kas jau aprakstÄ«ti paziÅojums CSI draiveri. MÄs uzturam daudz Kubernetes klasteru no dažÄdiem mÄkoÅpakalpojumu sniedzÄjiem, kuriem izmantojam vienu rÄ«ku. Tas ievieÅ” daudzas ÄrtÄ«bas, āapejotā Å”o pakalpojumu sniedzÄju pÄrvaldÄ«tos risinÄjumus. JÄ, mums ir diezgan specifisks gadÄ«jums un vajadzÄ«bas, taÄu to dÄļ radÄ«tÄs izstrÄdes var bÅ«t noderÄ«gas citiem lietotÄjiem.
Kas Ä«sti ir CCM?
Parasti mÄs sagatavojam apkÄrtÄjo vidi klasterim no Ärpuses - piemÄram, izmantojot Terraform. Bet dažreiz ir nepiecieÅ”ams pÄrvaldÄ«t mÄkoÅu vidi mums apkÄrt no klastera. Å Äda iespÄja tiek nodroÅ”inÄta, un tieÅ”i tÄ tiek Ä«stenota CCM.
GadÄ«jumos ā ievieÅ” 1:1 attiecÄ«bas starp Kubernetes mezgla objektu (Node) un virtuÄlo maŔīnu mÄkoÅpakalpojumÄ. Å im nolÅ«kam mÄs:
aizpildiet lauku spec.providerID objektÄ Node. PiemÄram, OpenStack CCM Å”im laukam ir Å”Äds formÄts: openstack:///d58a78bf-21b0-4682-9dc6-2132406d2bb0. JÅ«s varat redzÄt mÄkoÅa nodroÅ”inÄtÄja nosaukumu un objekta unikÄlo servera (virtuÄlÄs maŔīnas OpenStack) UUID;
papildinÄt nodeInfo objektÄ Node informÄcija par virtuÄlo maŔīnu. PiemÄram, mÄs norÄdÄm instances veidu AWS;
MÄs pÄrbaudÄm virtuÄlÄs maŔīnas klÄtbÅ«tni mÄkonÄ«. PiemÄram, ja objekts Node nonÄca stÄvoklÄ« NotReady, varat pÄrbaudÄ«t, vai virtuÄlÄ maŔīna mÄkoÅpakalpojumÄ vispÄr pastÄv providerID. Ja tÄ nav, izdzÄsiet objektu Node, kas citÄdi paliktu klasterÄ« uz visiem laikiem;
Zonas ā iestata objekta kļūmes domÄnu Node, lai plÄnotÄjs varÄtu atlasÄ«t Pod mezglu atbilstoÅ”i mÄkoÅa nodroÅ”inÄtÄja reÄ£ioniem un zonÄm;
LoadBalancer ā veidojot objektu Service ar tipu LoadBalancer rada sava veida balansÄtÄju, kas novirzÄ«s trafiku no Ärpuses uz klastera mezgliem. PiemÄram, vietnÄ Yandex.Cloud varat izmantot NetworkLoadBalancer Šø TargetGroup Å”iem nolÅ«kiem;
MarÅ”ruts ā veido tÄ«klu starp mezgliem, jo SaskaÅÄ ar Kubernetes prasÄ«bÄm katram podam ir jÄbÅ«t savai IP adresei un jÄspÄj sasniegt jebkuru citu pod. Å iem nolÅ«kiem varat izmantot pÄrklÄjuma tÄ«klu (VXLAN, GENEVE) vai iestatÄ«t marÅ”rutÄÅ”anas tabulu tieÅ”i mÄkoÅa pakalpojumu sniedzÄja virtuÄlajÄ tÄ«klÄ:
tilpums ā Ä»auj dinamiski sakÄrtot PV, izmantojot PVC un SC. SÄkotnÄji Ŕī funkcionalitÄte bija daļa no CCM, taÄu tÄs lielÄs sarežģītÄ«bas dÄļ tÄ tika pÄrvietota uz atseviŔķu projektu Container Storage Interface (CSI). MÄs esam runÄjuÅ”i par CSI vairÄk nekÄ vienu reizi ŠæŠøŃŠ°Š»Šø un, kÄ jau minÄts, pat izlaists CSI draiveris.
IepriekÅ” viss kods, kas mijiedarbojas ar mÄkoni, atradÄs Kubernetes projekta galvenajÄ Git repozitorijÄ plkst. k8s.io/kubernetes/pkg/cloudprovider/providers, taÄu viÅi nolÄma no tÄ atteikties, jo sagÄdÄja neÄrtÄ«bas darbÄ ar lielu kodu bÄzi. Visas vecÄs ievieÅ”anas ir pÄrvietotas uz atseviŔķa repozitorija. TurpmÄkÄ atbalsta un attÄ«stÄ«bas ÄrtÄ«bÄm tika pÄrvietotas arÄ« visas kopÄ«gÄs sastÄvdaļas atseviŔķa repozitorija.
TÄpat kÄ CSI gadÄ«jumÄ, daudzi lieli mÄkoÅdatoÅ”anas pakalpojumu sniedzÄji jau ir izstrÄdÄjuÅ”i savus CCM, lai Kubernetes izmantotu mÄkoÅus. Ja piegÄdÄtÄjam nav CCM, bet visas nepiecieÅ”amÄs funkcijas ir pieejamas caur API, tad CCM varat ieviest pats.
MÄs sÄkÄm izstrÄdi (pareizÄk sakot, pat lietoÅ”anu) ar gatavs(!) CCM Yandex.Cloud pirms gada.
TomÄr Å”ajÄ Ä«stenoÅ”anÄ mums trÅ«ka:
autentifikÄcija, izmantojot JWT IAM marÄ·ieri;
Servisa kontroliera atbalsts.
Vienojoties ar autoru (dlizÄ«ns) ProgrammÄ Telegram mÄs izveidojÄm yandex-cloud-controller-manager un pievienojÄm trÅ«kstoÅ”Äs funkcijas.
GalvenÄs iezÄ«mes
PaÅ”laik CCM atbalsta Å”Ädas saskarnes:
Gadījumos;
Zonas;
LoadBalancer.
NÄkotnÄ, kad Yandex.Cloud sÄks strÄdÄt ar uzlabotÄm VPC iespÄjÄm, mÄs pievienosim saskarni marÅ”ruti.
LoadBalanacer kÄ galvenais izaicinÄjums
SÄkotnÄji mÄs mÄÄ£inÄjÄm, tÄpat kÄ citas CCM implementÄcijas, izveidot pÄris LoadBalancer Šø TargetGroup visiem Service ar tipu LoadBalancer. TomÄr Yandex.Cloud atklÄja vienu interesantu ierobežojumu: jÅ«s nevarat izmantot TargetGroups ar krustojas Targets (pÄris SubnetID SÄkot no IpAddress).
TÄpÄc izveidotajÄ CCM tiek palaists kontrolieris, kas, mainoties objektiem Node apkopo informÄciju par visÄm saskarnÄm katrÄ virtuÄlajÄ maŔīnÄ, grupÄ tÄs atbilstoÅ”i to piederÄ«bai noteiktai NetworkID, rada ar TargetGroup par NetworkID, kÄ arÄ« uzrauga atbilstÄ«bu. PÄc tam, veidojot objektu Service ar tipu LoadBalanacer mÄs vienkÄrÅ”i pievienojam iepriekÅ” izveidotu TargetGroup uz jaunu NetworkLoadBalanaceresmu.
KÄ sÄkt lietot?
CCM atbalsta Kubernetes versiju 1.15 un jaunÄku versiju. KlasterÄ«, lai tas darbotos, ir nepiecieÅ”ams karogs --cloud-provider=external bija iestatÄ«ts uz true kube-apiserver, kube-controller-manager, kube-plÄnotÄjs un visi kubelets.
Visas nepiecieÅ”amÄs darbÄ«bas paÅ”ai instalÄÅ”anai ir aprakstÄ«tas README. InstalÄÅ”ana ir saistÄ«ta ar objektu izveidi Kubernetes no manifestiem.
pakalpojuma konts mijiedarbÄ«bai ar Yandex.Cloud API. ManifestÄ Secret ir nepiecieÅ”ama pÄrsÅ«tÄ«t autorizÄtÄs atslÄgas no pakalpojuma konta. DokumentÄcijÄ aprakstÄ«ts, kÄ izveidot pakalpojuma kontu un iegÅ«t atslÄgas.
PriecÄsimies saÅemt jÅ«su atsauksmes un jauni jautÄjumija rodas kÄdas problÄmas!
RezultÄti
MÄs esam izmantojuÅ”i ieviesto CCM piecos Kubernetes klasteros pÄdÄjo divu nedÄļu laikÄ un plÄnojam nÄkamajÄ mÄnesÄ« to skaitu paplaÅ”inÄt lÄ«dz 20. PaÅ”laik mÄs neiesakÄm izmantot CCM lielÄm un kritiskÄm K8 instalÄcijÄm.
TÄpat kÄ CSI gadÄ«jumÄ, mÄs priecÄsimies, ja Yandex izstrÄdÄtÄji uzÅemsies Ŕī projekta izstrÄdi un atbalstu - esam gatavi pÄc viÅu pieprasÄ«juma nodot repozitoriju, lai tiktu galÄ ar mums aktuÄlÄkiem uzdevumiem.