
Örömmel jelentjük be, hogy a Flant cég hozzájárulása a Kubernetes Open Source eszközeihez bővül, kiadva (Container Storage Interface) a Yandex Felhőhöz.
De mielőtt rátérnénk a megvalósítás részleteire, válaszoljunk arra a kérdésre, hogy miért van erre egyáltalán szükség, amikor a Yandex már kínálja a .
Bevezetés
Miért?
Cégünk belső működésében, a Kubernetes éles üzemeltetésének megkezdése óta (azaz már több éve) folyamatosan fejlődik egy saját eszközünk (deckhouse), amelyet szintén tervezzük hamarosan Open Source projektként elérhetővé tenni. Ennek segítségével egységesen konfiguráljuk és állítjuk be az összes klasztert, és jelenleg már több mint 100 klaszterünk van, különböző hardverkonfigurációkon és minden elérhető felhőszolgáltatáson.
A deckhouse-t használó klaszterek minden szükséges komponenst tartalmaznak: terheléselosztók, monitoring kényelmes grafikonokkal, metrikákkal és riasztásokkal, felhasználói autentikáció külső szolgáltatók által a dashboardok eléréséhez és így tovább. Egy ilyen „feljavított” klasztert nincs értelme menedzselt megoldásként telepíteni, mert gyakran ez lehetetlen, vagy félkomponens letiltásához vezet.
NB: Ez a tapasztalatunk, és elég speciális. Semmiképpen sem állítjuk, hogy mindenkinek önállóan kellene a Kubernetes klaszterek telepítésével foglalkoznia ahelyett, hogy kész megoldásokat használnának. Érdemes megjegyezni, hogy a Yandex-től nincs valós Kubernetes üzemeltetési tapasztalatunk, ezért a szolgáltatás értékelésével kapcsolatban semmiféle nyilatkozatot nem teszünk a jelen cikkben.
Mi ez és kinek szól?
Tehát már beszéltünk a Kubernetes tárolókkal kapcsolatos modern megközelítésekről: és ehhez a megközelítéshez.
Jelenleg sok nagy felhőszolgáltató kifejlesztett illesztőprogramokat a saját „felhős” lemezeik Kubernetes Persistent Volume-ként való használatához. Ha pedig a szolgáltatónak nincs ilyen illesztőprogramja, de minden szükséges funkció API-n keresztül rendelkezésre áll, akkor semmi sem akadályozza meg, hogy saját erőből implementálj egy illesztőprogramot. Mi is így jártunk a Yandex Felhő esetében.
A fejlesztés alapjául a és néhány ötletet a , mivel ezen felhők (Google és Yandex) API-ja között számos hasonlóság van. Különösen az API mindkettőnél, és a Yandex visszatér egy objektumot Művelet a hosszú távú műveletek állapotának nyomon követésére (például új lemez létrehozása). Az API-val való interakcióhoz a Yandex.Cloud-ot használják .
A végrehajtott munka eredménye és hasznos lehet azok számára, akik valamilyen okból saját Kubernetes telepítést használnak a Yandex.Cloud virtuális gépein (de nem kész, kezelt klaszter) és szeretnék használni (rendelni) a lemezeket a CSI-n keresztül.
Megvalósítás
Főbb lehetőségek
Jelenleg a meghajtó a következő funkciókat támogatja:
- Lemezek rendelése a klaszter összes zónájában a klaszterben lévő csomópontok topológiája szerint;
- Korábban rendelhető lemezek eltávolítása;
- Offline méretezés a lemezekhez (Yandex.Cloud növelés lemezek, amelyek csatlakoztatva vannak a virtuális géphez). Arról, hogy hogyan kellett módosítani a meghajtót, hogy a lehető legkisebb fájdalommal végrehajthassuk a méretezést, lásd alább.
A jövőben tervezik a lemezképek létrehozásának és törlésének támogatását.
A fő nehézség és annak leküzdése
Az, hogy az API Yandex.Cloud-ban nincs lehetőség a lemezek valós idejű növelésére — korlátozás, amely megnehezíti a PV (Persistent Volume) méretezési műveletet: hiszen ilyenkor a pod alkalmazás, amely a lemezt használja, leállítása szükséges, ami leállást okozhat az alkalmazásban.
A következő szerint , ha a CSI-vezérlő arról tájékoztat, hogy a lemezek méretezését csak «offline» tudja végezni (VolumeExpansion.OFFLINE), akkor a lemez növelési folyamatának így kell zajlania:
Ha a plugin csak
VolumeExpansion.OFFLINEkiterjesztési képességgel rendelkezik és a Volume jelenleg ki van adva vagy elérhető egy csomóponton, akkorA ControllerExpandVolume-otCSAK akkor kell hívni, miután:
- A plugin rendelkezik controller
PUBLISH_UNPUBLISH_VOLUMEképességgel ésA ControllerUnpublishVolume-tsikeresen hívták.VAGY HA
- A plugin NEM rendelkezik vezérlő
PUBLISH_UNPUBLISH_VOLUMEképességgel, a plugin rendelkezik csomópontSTAGE_UNSTAGE_VOLUMEképességgel, ésA NodeUnstageVolumesikeresen befejeződött.VAGY HA
- A plugin NEM rendelkezik vezérlő
PUBLISH_UNPUBLISH_VOLUMEsem csomópontSTAGE_UNSTAGE_VOLUMEképességgel, ésA NodeUnpublishVolumesikeresen befejeződött.
Lényegében ez azt jelenti, hogy a lemezt le kell csatlakoztatni a virtuális gépről, mielőtt növelni lehet.
Sajnálatos módon % implementációja, a CSI specifikációk közötti sidecar-ok nem felelnek meg ezeknek a követelményeknek:
- A sidecar konténerben
csi-attacher, amelynek biztosítania kell a szükséges szünetet a csatlakoztatások között, offline méretezés esetén egyszerűen nem valósult meg ez a funkció. Erről a vitát kezdeményeztek. . - Mi is az a sidecar konténer ebben a kontextusban? Maga a CSI plugin nem foglalkozik a Kubernetes API-val való interakcióval, csak reagál azokra a gRPC hívásokra, amelyeket a sidecar konténerek küldenek. Az utóbbiak a Kubernetes közösségről.
A mi esetünkben (CSI plugin) a lemez bővítési művelete a következőképpen néz ki:
- Megkapjuk a gRPC hívást
A ControllerExpandVolume-ot; - Megpróbáljuk bővíteni a lemezt az API-ban, de hibát kapunk, amely arra figyelmeztet, hogy a művelet nem hajtható végre, mivel a lemez csatlakoztatva van;
- Mentjük a lemez azonosítóját egy térképre, amely a lemezeket tartalmazza, amelyek esetében bővítési műveletet kell végezni. A továbbiakban a tékéről a következőképpen fogunk hivatkozni:
volumeResizeRequired; - Kézzel eltávolítjuk a podot, amely a lemezt használja. A Kubernetes újraindítja azt. Annak érdekében, hogy a lemez ne csatlakozzon (
ControllerPublishVolume) a bővítési művelet befejezése előtt, az összekapcsolás próbálkozásakor ellenőrizzük, hogy a lemez továbbra isvolumeResizeRequiredés hibát adunk vissza; - A CSI driver megpróbálja újra elvégezni a bővítési műveletet. Ha a művelet sikeres, a lemezt eltávolítjuk a
volumeResizeRequired; - Mivel a lemez azonosítója hiányzik a
volumeResizeRequired,ControllerPublishVolumesikeresen végbemegy, a lemez csatlakozik, a pod elindul.
Mindez elég egyszerűen hangzik, de mint mindig, itt is vannak buktatók. A lemezek bővítésével foglalkozik , amely hiba esetén a művelet végrehajtása során exponenciális időzítésű időtúllépéssel, amely 1000 másodpercig terjed:
func DefaultControllerRateLimiter() RateLimiter {
return NewMaxOfRateLimiter(
NewItemExponentialFailureRateLimiter(5*time.Millisecond, 1000*time.Second),
// 10 qps, 100 vödrös méret. Ez csak a próbálkozás sebességére vonatkozik, és ez csak az általános tényező (nem elemenként)
&BucketRateLimiter{Limiter: rate.NewLimiter(rate.Limit(10), 100)},
)
}Ez időnként ahhoz vezethet, hogy a lemez bővítési művelete 15+ percig elhúzódik, így a megfelelő pod elérhetetlen.
Az egyetlen lehetőség, amely viszonylag könnyen és fájdalommentesen lehetővé tette számunkra a potenciális leállási idő csökkentését, az volt, hogy saját verziót használtunk az external-resizerből, maximális időtúllépési korlátozással :
workqueue.NewItemExponentialFailureRateLimiter(5*time.Millisecond, 5*time.Second)Nem tartottuk szükségesnek, hogy sürgősen kezdeményezzünk egy vitát és javítsuk az external-resizer-t, mivel a lemezek offline bővítése — a többi felhőszolgáltató által hamarosan megszűnő archaizmus.
Hogyan kezdjük el a használatát?
A drivert a Kubernetes 1.15-ös és újabb verziói támogatják. A driver működéséhez a következő követelményeknek kell teljesülniük:
- Zászló
--allow-privilegedbeállítvaigazaz API-szerver és kubelet számára; - Bekapcsolva
--feature-gates=VolumeSnapshotDataSource=true,KubeletPluginsWatcher=true,CSINodeInfo=true,CSIDriverRegistry=trueaz API-szerver és kubelet számára; - A csatlakoztatás terjedelme () engedélyezve kell legyen a klaszterben. Docker használata esetén a démon konfigurálva kell legyen, hogy megengedje a megosztott csatlakozásokat (shared mounts).
Minden szükséges lépés az installációval kapcsolatban . Az installálás a Kubernetes objektumok létrehozását jelenti a manifesztumokból.
A meghajtó működéséhez a következőre van szükség:
- Meg kell adnia a manifesztumban a könyvtár azonosítóját (
folder-id) a Yandex Felhőben (); - A Yandex Felhő API-jával való interakcióhoz a CSI-meghajtóban szolgáltatói fiókot kell használni. A Secret manifesztumban meg kell adni a szolgáltatói fióktól. A dokumentációban , hogyan kell szolgáltatói fiókot létrehozni és kulcsokat szerezni.
Összességében — , és örömmel fogadjuk a visszajelzéseket és , ha bármilyen problémával találkozna!
További támogatás
Összefoglalva szeretnénk megjegyezni, hogy ezt a CSI-meghajtót nem nagy kíváncsiságból kezdtük el a Go alkalmazások írásával foglalkozni, hanem a cégünk belső igényéből. Nem látjuk célszerűnek a saját megvalósításunk fenntartását, ezért ha a Yandex érdeklődést mutat és továbbra is támogatni kívánja a meghajtót, örömmel átadjuk a repót a rendelkezésére.
Továbbá, valószínűleg a Yandex-nek a managed Kubernetes klaszterében van saját CSI-meghajtó realizációja, amelyet Open Source-ként ki lehet adni. Ez a fejlesztési lehetőség is kedvező számunkra — a közösség megbízható meghajtót használhatna a szolgáltatótól, nem pedig egy külső cégtől.
P.S.
Olvasson további információkat a blogunkban:
- «»;
- «»;
- «»;
- «».
Forrás: habr.com
