Efemer kötetek tárolási kapacitás követéssel: EmptyDir a szteroidokon
Egyes alkalmazásoknak adattárolásra is szükségük van, de eléggé megnyugszanak abban, hogy újraindítás után az adatok nem mentődnek el.
Például a gyorsítótárazási szolgáltatásokat korlátozza a RAM, de a ritkán használt adatokat is áthelyezhetik a RAM-nál lassabb tárolásra, ami csekély hatással van az általános teljesítményre. Más alkalmazásoknak tisztában kell lenniük azzal, hogy a fájlok csak olvasható bevitelt tartalmazhatnak, például beállításokat vagy titkos kulcsokat.
A Kubernetesnek már több típusa van efemer kötetek, de funkcionalitásuk a K8s-ban megvalósítottra korlátozódik.
Tiszavirág életű CSI kötetek lehetővé tette a Kubernetes CSI-illesztőprogramokkal való bővítését, hogy támogatást nyújtson a könnyű helyi kötetekhez. Ily módon lehetséges használni tetszőleges szerkezetek: beállítások, titkok, azonosító adatok, változók stb. A CSI-illesztőprogramokat módosítani kell, hogy támogassák ezt a Kubernetes-funkciót, mivel feltételezhető, hogy a szokásos szabványos illesztőprogramok nem működnek – de feltételezzük, hogy az ilyen kötetek a podhoz kiválasztott bármely csomóponton használhatók.
Ez problémát jelenthet olyan köteteknél, amelyek jelentős gazdagép-erőforrásokat fogyasztanak, vagy olyan tárhely esetében, amely csak néhány gazdagépen érhető el. Ezért a Kubernetes 1.19 két új alfatesztelési kötet-szolgáltatást vezet be, amelyek elvileg hasonlóak az EmptyDir kötetekhez:
általános célú efemer kötetek;
CSI tárolókapacitás nyomon követése.
Az új megközelítés előnyei:
a tárolás lehet helyi vagy hálózaton keresztül csatlakoztatva;
a kötetek meghatározott méretűek lehetnek, amelyeket az alkalmazás nem léphet túl;
működik minden olyan CSI-illesztőprogrammal, amely támogatja az állandó kötetek kiépítését, és (a kapacitáskövetés támogatása érdekében) megvalósítja a hívást GetCapacity;
a kötetek tartalmazhatnak néhány kezdeti adatot az illesztőprogramtól és a beállításoktól függően;
minden szabványos kötettel végzett művelet (pillanatkép készítése, átméretezés stb.) támogatott;
kötetek bármely olyan alkalmazásvezérlővel használhatók, amely elfogad egy modult vagy kötetspecifikációt;
A Kubernetes ütemező önállóan választja ki a megfelelő csomópontokat, így többé nincs szükség ütemezőbővítmények létrehozására és konfigurálására vagy webhookok módosítására.
Alkalmazási lehetőségek
Ezért az általános célú efemer kötetek a következő felhasználási esetekre alkalmasak:
Állandó memória a RAM helyettesítőjeként a gyorsítótárban
A memcached legújabb kiadásai hozzáadott támogatás állandó memória használata (Intel Optane stb., kb. fordító) normál RAM helyett. A memcached alkalmazásvezérlőn keresztül történő üzembe helyezésekor általános célú efemer kötetekkel kérheti, hogy adott méretű kötetet rendeljenek ki a PMEM-ből a CSI illesztőprogram segítségével, például PMEM-CSI.
LVM helyi tárhely munkaterületként
A RAM-nál nagyobb adatokkal dolgozó alkalmazások olyan méretű vagy teljesítménymutatókkal rendelkező helyi tárhelyet igényelhetnek, amelyet a Kubernetes szokásos EmptyDir-kötetei nem tudnak biztosítani. Például erre a célra azt írták TopoLVM.
Csak olvasási hozzáférés az adatmennyiségekhez
Egy kötet kiosztása teljes kötet létrehozását eredményezheti, ha:
Ezek a kötetek csak olvasható módban csatlakoztathatók.
Ez hogy működik
Általános célú, efemer kötetek
Az általános célú efemer kötetek kulcsfontosságú jellemzője az új kötetforrás, EphemeralVolumeSource, amely tartalmazza a kötetkérelem létrehozásához szükséges összes mezőt (korábbi nevén tartós kötetkérés, PVC). Új vezérlő bekerült kube-controller-manager megvizsgálja azokat a hüvelyeket, amelyek ilyen hangerőforrást hoznak létre, majd létrehoz egy PVC-t ezekhez a hüvelyekhez. A CSI meghajtó esetében ez a kérés ugyanúgy néz ki, mint a többi, ezért itt nincs szükség speciális támogatásra.
Amíg léteznek ilyen PVC-k, ugyanúgy használhatók, mint bármely más kérés a köteten. Különösen adatforrásként hivatkozhatnak rájuk egy kötet másolásakor vagy pillanatfelvétel készítésekor a kötetről. A PVC objektum a kötet aktuális állapotát is tartalmazza.
Az automatikusan létrehozott PVC-k nevei előre meghatározottak: a podnév és a kötetnév kombinációja, kötőjellel elválasztva. Az előre meghatározott nevek megkönnyítik a PVC-vel való interakciót, mert nem kell keresnie, ha ismeri a pod nevét és a kötet nevét. Hátránya, hogy a név már használatban lehet, amit a Kubernetes észlel, és ennek eredményeként a pod nem indul el.
Annak biztosítására, hogy a kötet a podlal együtt törlésre kerüljön, a vezérlő kérést küld a tulajdonos alá tartozó kötethez. A pod törlésekor a szabványos szemétgyűjtő mechanizmus működik, amely törli a kérést és a kötetet is.
A kéréseket a tároló-illesztőprogram egyezteti a tárolási osztály normál mechanizmusán keresztül. Bár az osztályok azonnali és késői kötéssel (aka WaitForFirstConsumer) támogatottak, efemer köteteknél érdemes használni WaitForFirstConsumer, akkor az ütemező a csomóponthasználatot és a tárhely elérhetőségét is figyelembe veheti a csomópont kiválasztásakor. Itt egy új funkció jelenik meg.
Tárolási kapacitás követése
Az ütemező általában nem tudja, hogy a CSI-illesztőprogram hol hozza létre a kötetet. Arra sincs mód, hogy az ütemező közvetlenül felvegye a kapcsolatot a sofőrrel, hogy ezt az információt kérje. Ezért az ütemező addig lekérdezi a csomópontokat, amíg meg nem találja azt, amelyen a kötetek elérhetők (késői kötés), vagy a hely megválasztását teljesen az illesztőprogramra bízza (azonnali kötés).
Új APICSIStorageCapacity, amely alfa szakaszban van, lehetővé teszi a szükséges adatok etcd-ben történő tárolását, hogy azok elérhetőek legyenek az ütemező számára. Az általános célú efemer kötetek támogatásával ellentétben az illesztőprogram telepítésekor engedélyeznie kell a tárolókapacitás nyomon követését: external-provisioner közzé kell tennie az illesztőprogramtól normál módon kapott kapacitásinformációkat GetCapacity.
Ha az ütemezőnek ki kell választania egy csomópontot egy kötetlen kötettel rendelkező podhoz, amely késői összerendelést használ, és az illesztőprogram engedélyezte ezt a funkciót a telepítés során a jelző beállításával CSIDriver.storageCapacity, akkor a nem elegendő tárolókapacitással rendelkező csomópontok automatikusan el lesznek dobva. Ez mind az általános célú efemer, mind az állandó köteteknél működik, de nem a CSI efemer köteteknél, mivel ezek paramétereit a Kubernetes nem tudja beolvasni.
Szokás szerint az azonnal összekapcsolt kötetek a pod-ok ütemezése előtt jönnek létre, és elhelyezésüket a tároló-illesztőprogram választja ki, így a konfiguráláskor external-provisioner Alapértelmezés szerint az azonnali kötéssel rendelkező tárolási osztályok kimaradnak, mivel ezek az adatok egyébként sem kerülnek felhasználásra.
Mivel a kubernetes ütemező kénytelen potenciálisan elavult információkkal dolgozni, nincs garancia arra, hogy a kötet létrehozásakor minden esetben rendelkezésre áll a kapacitás, de ennek ellenére megnő annak esélye, hogy újrapróbálkozás nélkül létrejön.
NB Részletesebb információkat kaphat, valamint biztonságosan „gyakorolhat a macskaállványon”, és teljesen érthetetlen helyzet esetén szakképzett technikai támogatást kaphat intenzív tanfolyamokon - Kubernetes bázis szeptember 28-30-án kerül megrendezésre, és a haladóbb szakemberek számára Kubernetes Mega október 14-16.
biztonság
CSIStorageCapacity
A CSIStorageCapacity objektumok névterekben találhatók; amikor minden CSI-illesztőprogramot a saját névterében teszünk közzé, ajánlatos korlátozni az RBAC-jogokat a CSIStorageCapacityre ezen a területen, mivel nyilvánvaló, honnan származnak az adatok. A Kubernetes egyébként nem ellenőrzi ezt, és az illesztőprogramok általában ugyanabba a névtérbe kerülnek, így végső soron az illesztőprogramoktól elvárható, hogy működjenek, és ne tegyenek közzé hibás adatokat (és itt hibásodott meg a kártyám, kb. szakállas vicc alapján fordító)
Általános célú, efemer kötetek
Ha a felhasználók jogosultak egy pod létrehozására (közvetlenül vagy közvetve), akkor is képesek lesznek általános célú, efemer köteteket létrehozni, még akkor is, ha nincs jogosultságuk kérés létrehozására a köteten. Ennek az az oka, hogy az RBAC engedélyek ellenőrzése a PVC-t létrehozó vezérlőre vonatkozik, nem a felhasználóra. Ez a fő módosítás fiókjába, mielőtt engedélyezné ezt a funkciót azokon a fürtökön, ahol a nem megbízható felhasználóknak nem kellene kötetek létrehozására joga.
Példa
Különálló ág A PMEM-CSI tartalmazza az összes szükséges változtatást a Kubernetes 1.19-es fürt QEMU virtuális gépeken belüli futtatásához, az alfa szakasz összes funkciójával. Az illesztőprogram kódja nem változott, csak a telepítés változott.
Egy megfelelő gépen (Linux, normál felhasználó használhatja Dokkmunkás, néz itt részletek) ezek a parancsok előhívják a fürtöt, és telepítik a PMEM-CSI illesztőprogramot:
git clone --branch=kubernetes-1-19-blog-post https://github.com/intel/pmem-csi.git
cd pmem-csi
export TEST_KUBERNETES_VERSION=1.19 TEST_FEATURE_GATES=CSIStorageCapacity=true,GenericEphemeralVolume=true TEST_PMEM_REGISTRY=intel
make start && echo && test/setup-deployment.sh
Miután minden működik, a kimenet használati utasításokat tartalmaz:
The test cluster is ready. Log in with [...]/pmem-csi/_work/pmem-govm/ssh.0, run
kubectl once logged in. Alternatively, use kubectl directly with the
following env variable:
KUBECONFIG=[...]/pmem-csi/_work/pmem-govm/kube.config
secret/pmem-csi-registry-secrets created
secret/pmem-csi-node-secrets created
serviceaccount/pmem-csi-controller created
...
To try out the pmem-csi driver ephemeral volumes:
cat deploy/kubernetes-1.19/pmem-app-ephemeral.yaml |
[...]/pmem-csi/_work/pmem-govm/ssh.0 kubectl create -f -
A CSIStorageCapacity objektumokat nem arra szánták, hogy emberek olvassák, ezért némi feldolgozásra van szükség. A Golang sablonszűrők megmutatják a tárolási osztályokat, ez a példa a nevet, a topológiát és a kapacitást:
Próbáljunk meg létrehozni egy demóalkalmazást egyetlen általános célú, efemer kötettel. Fájl tartalma pmem-app-ephemeral.yaml:
# This example Pod definition demonstrates
# how to use generic ephemeral inline volumes
# with a PMEM-CSI storage class.
kind: Pod
apiVersion: v1
metadata:
name: my-csi-app-inline-volume
spec:
containers:
- name: my-frontend
image: intel/pmem-csi-driver-test:v0.7.14
command: [ "sleep", "100000" ]
volumeMounts:
- mountPath: "/data"
name: my-csi-volume
volumes:
- name: my-csi-volume
ephemeral:
volumeClaimTemplate:
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 4Gi
storageClassName: pmem-csi-sc-late-binding
Létrehozása után, amint az a fenti utasításokban látható, most van egy további tok és PVC:
$ kubectl get pods/my-csi-app-inline-volume -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
my-csi-app-inline-volume 1/1 Running 0 6m58s 10.36.0.2 pmem-csi-pmem-govm-worker1 <none> <none>
$ kubectl get pvc/my-csi-app-inline-volume-my-csi-volume
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
my-csi-app-inline-volume-my-csi-volume Bound pvc-c11eb7ab-a4fa-46fe-b515-b366be908823 4Gi RWO pmem-csi-sc-late-binding 9m21s
Ha egy másik alkalmazásnak 26620Mi-nél többre van szüksége, az ütemező nem veszi figyelembe pmem-csi-pmem-govm-worker1 mindenesetre.
Mi a következő lépés?
Mindkét funkció még fejlesztés alatt áll. Az alfateszt során több alkalmazás is megnyílt. A fejlesztési javaslat hivatkozásai dokumentálják a béta szakaszba lépéshez szükséges munkát, valamint azt, hogy mely alternatívákat vették már figyelembe és utasították el: