
Meillä on ilo ilmoittaa, että Flant laajentaa panostaan avoimen lähdekoodin työkaluihin Kubernetesille julkaisemalla (Container Storage Interface) Yandex.Cloudille.
Mutta ennen kuin siirrymme täytäntöönpanon yksityiskohtiin, vastataan kysymykseen, miksi tätä ylipäänsä tarvitaan, kun Yandexillä on jo palvelu .
Esittely
Miksi tämä on?
Yrityksemme sisällä olemme Kubernetesin tuotannossa käytön alusta lähtien (eli jo usean vuoden ajan) kehittäneet omaa työkaluamme (deckhouse), jonka aiomme muuten myös saattaa pian saataville Open Source -projektina. . Sen avulla konfiguroimme ja konfiguroimme yhtenäisesti kaikki klusterimme, ja tällä hetkellä niitä on jo yli 100, monenlaisissa laitteistokokoonpanoissa ja kaikissa käytettävissä olevissa pilvipalveluissa.
Deckhousea käyttävissä klustereissa on kaikki toimintaan tarvittavat komponentit: tasapainottimet, seuranta kätevillä kaavioilla, mittareilla ja hälytyksellä, käyttäjien todennus ulkoisten palveluntarjoajien kautta kaikkien kojelaudoiden pääsyä varten ja niin edelleen. Ei ole mitään järkeä asentaa tällaista "pumpattua" klusteria hallittuun ratkaisuun, koska se on usein joko mahdotonta tai johtaa siihen, että puolet komponenteista on poistettava käytöstä.
NB: Tämä on meidän kokemuksemme, ja se on melko tarkka. Emme missään tapauksessa ehdota, että kaikkien tulisi ottaa Kubernetes-klustereita käyttöön itse valmiiden ratkaisujen sijaan. Muuten, meillä ei ole todellista kokemusta Yandexin Kubernetesin käyttämisestä, emmekä anna tässä artikkelissa mitään arviota tästä palvelusta.
Mitä se on ja kenelle?
Joten, olemme jo puhuneet nykyaikaisesta lähestymistavasta varastointiin Kubernetesissa: и tähän lähestymistapaan.
Tällä hetkellä monet suuret pilvipalveluntarjoajat ovat kehittäneet ajureita pilvilevyjensä käyttämiseen Kubernetesin pysyvänä talteena. Jos toimittajalla ei ole tällaista ohjainta, mutta kaikki tarvittavat toiminnot tarjotaan API:n kautta, mikään ei estä sinua toteuttamasta ohjainta itse. Näin kävi Yandex.Cloudille.
Otimme kehityksen perustaksi ja pari ideaa sieltä , koska vuorovaikutuksessa näiden pilvien API:n (Google ja Yandex) kanssa on useita yhtäläisyyksiä. Erityisesti API ja ja palauttaa esineen Operation seurata pitkään käynnissä olevien toimintojen tilaa (esimerkiksi uuden levyn luominen). Jos haluat olla vuorovaikutuksessa Yandex.Cloud API:n kanssa, käytä .
Tehdyn työn tulos ja voi olla hyödyllistä niille, jotka jostain syystä käyttävät omaa Kubernetes-asennustaan Yandex.Cloud-virtuaalikoneissa (mutta ei valmiita hallittuja klustereita) ja haluavat käyttää (tilata) levyjä CSI:n kautta.
Реализация
Tärkeimmät ominaisuudet
Tällä hetkellä ohjain tukee seuraavia toimintoja:
- Levyjen järjestäminen klusterin kaikilla vyöhykkeillä klusterin solmujen topologian mukaan;
- Aiemmin tilattujen levyjen poistaminen;
- Levyjen koon muuttaminen offline-tilassa (Yandex.Cloud virtuaalikoneeseen asennettujen levyjen lisääminen). Lisätietoja siitä, kuinka ohjainta piti muokata, jotta koon muuttaminen olisi mahdollisimman kivutonta, on alla.
Tulevaisuudessa aiomme ottaa käyttöön tuen levyvedosten luomiseen ja poistamiseen.
Suurin vaikeus ja kuinka voittaa se
Kyky lisätä levyjä reaaliajassa Yandex.Cloud API:ssa on rajoitus, joka vaikeuttaa PV:n (Persistent Volume) koonmuutostoimintoa: tässä tapauksessa levyä käyttävä sovelluskotelo on pysäytettävä, ja tämä voi aiheuttaa käyttökatkoksia.
Mukaan , jos CSI-ohjain ilmoittaa, että se voi muuttaa levyjen kokoa vain "offline" (VolumeExpansion.OFFLINE), levyn kasvattamisprosessin pitäisi mennä seuraavasti:
Jos laajennuksessa on vain
VolumeExpansion.OFFLINElaajennusmahdollisuus ja volyymi on tällä hetkellä julkaistu tai saatavilla solmussaControllerExpandVolumeTÄYTYY kutsua VAIN jommankumman jälkeen:
- Pluginilla on ohjain
PUBLISH_UNPUBLISH_VOLUMEkyky jaControllerUnpublishVolumeon kutsuttu onnistuneesti.TAI MUUTEN
- Pluginissa EI ole ohjainta
PUBLISH_UNPUBLISH_VOLUMEominaisuus, laajennuksessa on solmuSTAGE_UNSTAGE_VOLUMEkyky jaNodeUnstageVolumeon suoritettu onnistuneesti.TAI MUUTEN
- Pluginissa EI ole ohjainta
PUBLISH_UNPUBLISH_VOLUMEkyky, eikä solmuSTAGE_UNSTAGE_VOLUMEkyky jaNodeUnpublishVolumeon suoritettu onnistuneesti.
Tämä tarkoittaa käytännössä sitä, että sinun on irrotettava levy virtuaalikoneesta ennen sen laajentamista.
Valitettavasti kuitenkin toteutus CSI-spesifikaatio sivuvaunujen kautta ei täytä näitä vaatimuksia:
- Sivuvaunukontissa
csi-attacher, jonka pitäisi olla vastuussa tarvittavan raon olemassaolosta kiinnikkeiden välillä, tätä toimintoa ei yksinkertaisesti ole toteutettu offline-koon muutoksessa. Tästä käynnistettiin keskustelu . - Mikä on sivuvaunukontti tässä yhteydessä? CSI-laajennus itsessään ei ole vuorovaikutuksessa Kubernetes API:n kanssa, vaan se vastaa vain sivuvaunusäiliöiden sille lähettämiin gRPC-kutsuihin. Uusin Kubernetes-yhteisön toimesta.
Meidän tapauksessamme (CSI-laajennus) levyn kasvattaminen näyttää tältä:
- Saamme gRPC-puhelun
ControllerExpandVolume; - Yritämme kasvattaa levyn määrää API:ssa, mutta saamme virheilmoituksen siitä, että toimintoa ei voida suorittaa, koska levy on asennettu;
- Tallennamme levytunnisteen karttaan, joka sisältää levyt, joille lisäys on suoritettava. Alla kutsumme tätä karttaa lyhyyden vuoksi nimellä
volumeResizeRequired; - Poista levyä käyttävä kotelo manuaalisesti. Kubernetes käynnistää sen uudelleen. Jotta levyllä ei ole aikaa asentaa (
ControllerPublishVolume) ennen kuin suoritamme lisäystoiminnon, kun yritämme asentaa, tarkistamme, että annettu levy on edelleen sisällävolumeResizeRequiredja palauttaa virheen; - CSI-ohjain yrittää suorittaa koonmuutostoiminnon uudelleen. Jos toiminto onnistui, poista levy
volumeResizeRequired; - Koska Levytunnus puuttuu kohteesta
volumeResizeRequired,ControllerPublishVolumeläpäisee onnistuneesti, levy on asennettu, pod käynnistyy.
Kaikki näyttää riittävän yksinkertaiselta, mutta kuten aina, on sudenkuoppia. Suurentaa levyjä , joka toiminnan aikana tapahtuneen virheen sattuessa aikakatkaisuajan eksponentiaalisella kasvulla jopa 1000 sekuntiin:
func DefaultControllerRateLimiter() RateLimiter {
return NewMaxOfRateLimiter(
NewItemExponentialFailureRateLimiter(5*time.Millisecond, 1000*time.Second),
// 10 qps, 100 bucket size. This is only for retry speed and its only the overall factor (not per item)
&BucketRateLimiter{Limiter: rate.NewLimiter(rate.Limit(10), 100)},
)
}Tämä voi ajoittain johtaa siihen, että levyn laajennustoimintoa pidennetään yli 15 minuutiksi, jolloin vastaava pod ei ole käytettävissä.
Ainoa vaihtoehto, jonka avulla pystyimme lyhentämään mahdollisia seisokkeja melko helposti ja kivuttomasti, oli ulkoisen resizer-versiomme käyttö enimmäisaikarajoituksella. :
workqueue.NewItemExponentialFailureRateLimiter(5*time.Millisecond, 5*time.Second)Emme pitäneet tarpeellisena käynnistää kiireesti keskustelua ja korjata ulkoista koonmuuttajaa, koska levyjen offline-koon muuttaminen on takaisku, joka katoaa pian kaikilta pilvipalveluntarjoajilta.
Kuinka aloittaa sen käyttö?
Ohjainta tuetaan Kubernetes-versiossa 1.15 ja uudemmissa. Jotta kuljettaja voisi työskennellä, seuraavat vaatimukset on täytettävä:
- lippu
--allow-privilegedasetettu arvoontrueAPI-palvelimelle ja kubeletille; - Mukana
--feature-gates=VolumeSnapshotDataSource=true,KubeletPluginsWatcher=true,CSINodeInfo=true,CSIDriverRegistry=trueAPI-palvelimelle ja kubeletille; - Mount eteneminen () on otettava käyttöön klusterissa. Dockeria käytettäessä demoni on määritettävä sallimaan jaetut liitännät.
Kaikki tarvittavat vaiheet itse asennukseen . Asennus sisältää objektien luomisen Kubernetesiin luetteloista.
Kuljettajan työskentelyyn tarvitset seuraavat:
- Määritä hakemiston tunniste luettelossa (
folder-id) Yandex.Cloud (); - CSI-ohjain käyttää palvelutiliä ollakseen vuorovaikutuksessa Yandex.Cloud API:n kanssa. Salaisessa luettelossa sinun on läpäistävä palvelutililtä. Dokumentaatiossa , kuinka luodaan palvelutili ja hankitaan avaimet.
Kaikki kaikessa - , ja otamme mielellämme palautetta vastaan jos kohtaat ongelmia!
Lisätuki
Tämän seurauksena haluamme huomauttaa, että otimme tämän CSI-ajurin käyttöön ei suuresta halusta pitää hauskaa sovellusten kirjoittamisessa Gossa, vaan yrityksen sisäisen kiireellisen tarpeen vuoksi. Meistä ei vaikuta käytännölliseltä ylläpitää omaa toteutustamme, joten jos Yandex osoittaa kiinnostusta ja päättää jatkaa kuljettajan tukemista, siirrämme arkiston mielellämme heille.
Lisäksi Yandexillä on todennäköisesti oma CSI-ajurin toteutus hallitussa Kubernetes-klusterissaan, joka voidaan julkaista avoimessa lähdekoodissa. Näemme myös tämän kehitysvaihtoehdon edullisena - yhteisö voi käyttää hyväksi todettua ajuria palveluntarjoajalta, ei kolmannelta osapuolelta.
PS.
Lue myös blogistamme:
- «";
- «";
- «";
- «'.
Lähde: will.com
