ProHoster > Blog > podávání > Pomíjivé svazky se sledováním úložné kapacity: EmptyDir na steroidech
Pomíjivé svazky se sledováním úložné kapacity: EmptyDir na steroidech
Některé aplikace také potřebují ukládat data, ale docela jim vyhovuje, že se data po restartu neuloží.
Například služby ukládání do mezipaměti jsou omezeny pamětí RAM, ale mohou také přesouvat data, která se zřídka používají, do úložiště, které je pomalejší než RAM, s malým dopadem na celkový výkon. Jiné aplikace si musí být vědomy, že v souborech může být nějaký vstup pouze pro čtení, jako jsou nastavení nebo tajné klíče.
Kubernetes už má několik typů efemérní objemy, ale jejich funkčnost je omezena na to, co je implementováno v K8s.
Efemérní svazky CSI umožnilo rozšíření Kubernetes o ovladače CSI, aby poskytovaly podporu pro lehké místní svazky. Tímto způsobem je možné použít libovolné struktury: nastavení, tajemství, identifikační údaje, proměnné a tak dále. Ovladače CSI musí být upraveny tak, aby podporovaly tuto funkci Kubernetes, protože se předpokládá, že běžné standardizované ovladače nebudou fungovat – ale předpokládá se, že takové svazky lze použít na jakémkoli uzlu vybraném pro pod.
To může být problém u svazků, které spotřebovávají značné zdroje hostitele, nebo u úložiště, které je dostupné pouze u některých hostitelů. Proto Kubernetes 1.19 zavádí dvě nové funkce pro testování alfa verze, které jsou koncepčně podobné svazkům EmptyDir:
pomíjivé objemy pro obecné účely;
Sledování kapacity úložiště CSI.
Výhody nového přístupu:
úložiště může být lokální nebo připojené přes síť;
svazky mohou mít specifikovanou velikost, kterou aplikace nemůže překročit;
pracuje se všemi ovladači CSI, které podporují poskytování trvalých svazků a (pro podporu sledování kapacity) implementují volání GetCapacity;
svazky mohou mít některá počáteční data v závislosti na ovladači a nastavení;
jsou podporovány všechny standardní operace se svazkem (vytvoření snímku, změna velikosti atd.);
svazky lze použít s jakýmkoli aplikačním řadičem, který přijímá specifikaci modulu nebo svazku;
Plánovač Kubernetes vybírá vhodné uzly sám, takže již není potřeba zajišťovat a konfigurovat rozšíření plánovače nebo upravovat webhooky.
Možnosti aplikace
Proto jsou efemérní svazky pro obecné účely vhodné pro následující případy použití:
Perzistentní paměť jako náhrada RAM pro memcached
Nejnovější verze memcached přidána podpora pomocí trvalé paměti (Intel Optane atd., Cca. překladatel) místo běžné paměti RAM. Při nasazování memcached prostřednictvím aplikačního řadiče můžete použít univerzální dočasné svazky a požádat o přidělení svazku dané velikosti z PMEM pomocí ovladače CSI, například PMEM-CSI.
Lokální úložiště LVM jako pracovní prostor
Aplikace, které pracují s daty, která jsou větší než RAM, mohou vyžadovat místní úložiště s metrikami velikosti nebo výkonu, které běžné svazky EmptyDir od Kubernetes nemohou poskytnout. Například pro tento účel byl napsán TopoLVM.
Přístup pouze pro čtení pro objemy dat
Přidělení svazku může vést k vytvoření celého svazku, když:
Tyto svazky lze připojit v režimu pouze pro čtení.
Jak to funguje
General Purpose Ephemeral Volumes
Klíčovou vlastností pomíjivých svazků pro obecné účely je nový zdroj svazků, EphemeralVolumeSourceobsahující všechna pole pro vytvoření požadavku na svazek (historicky nazývaný trvalý požadavek na svazek, PVC). Nový ovladač v kube-controller-manager podívá se na pody, které vytvářejí takový zdroj objemu, a poté pro tyto pody vytvoří PVC. U ovladače CSI vypadá tento požadavek stejně jako ostatní, takže zde není potřeba žádná speciální podpora.
Dokud takové PVC existují, lze je použít jako jakékoli jiné požadavky na svazek. Konkrétně na ně lze odkazovat jako na zdroj dat při kopírování svazku nebo vytváření snímku ze svazku. Objekt PVC obsahuje také aktuální stav objemu.
Názvy automaticky vytvořených PVC jsou předdefinovány: jsou kombinací názvu pod a názvu svazku, oddělené pomlčkou. Předdefinované názvy usnadňují interakci s PVC, protože pokud znáte název podu a název svazku, nemusíte je hledat. Nevýhodou je, že název může být již používán, což Kubernetes detekuje a v důsledku toho je blok blokován spuštění.
Aby bylo zajištěno, že se svazek vymaže spolu s modulem, ovladač odešle požadavek na svazek pod vlastníkem. Když je modul odstraněn, funguje standardní mechanismus pro shromažďování odpadu, který odstraní požadavek i svazek.
Požadavky jsou porovnávány ovladačem úložiště prostřednictvím normálního mechanismu třídy úložiště. Ačkoli třídy s okamžitou a pozdní vazbou (aka WaitForFirstConsumer) jsou podporovány, pro efemérní objemy má smysl používat WaitForFirstConsumer, pak plánovač může při výběru uzlu vzít v úvahu využití uzlu i dostupnost úložiště. Zde se objeví nová funkce.
Sledování kapacity úložiště
Plánovač obvykle neví, kde ovladač CSI vytvoří svazek. Plánovač také nemá možnost kontaktovat přímo řidiče a požádat o tyto informace. Plánovač se proto dotazuje na uzly, dokud nenajde ten, na kterém lze přistupovat ke svazkům (pozdní vazba), nebo ponechá volbu umístění zcela na ovladači (okamžitá vazba).
Nový APICSIStorageCapacity, který je ve fázi alfa, umožňuje uložit potřebná data do etcd tak, aby byla k dispozici plánovači. Na rozdíl od podpory pomíjivých svazků pro obecné účely musíte při nasazení ovladače povolit sledování kapacity úložiště: external-provisioner by měl zveřejnit informace o kapacitě obdržené od řidiče normálním způsobem GetCapacity.
Pokud plánovač potřebuje vybrat uzel pro pod s nevázaným svazkem, který používá pozdní vazbu, a ovladač tuto funkci povolil během nasazení nastavením příznaku CSIDriver.storageCapacity, pak uzly, které nemají dostatečnou kapacitu úložiště, budou automaticky vyřazeny. To funguje jak pro efemérní, tak pro trvalé svazky pro obecné účely, ale ne pro efemérní svazky CSI, protože jejich parametry nemůže Kubernetes přečíst.
Jako obvykle jsou bezprostředně propojené svazky vytvořeny před naplánováním podů a jejich umístění volí ovladač úložiště, takže při konfiguraci external-provisioner Ve výchozím nastavení jsou třídy úložiště s okamžitou vazbou přeskočeny, protože tato data nebudou stejně použita.
Vzhledem k tomu, že plánovač kubernetes je nucen pracovat s potenciálně zastaralými informacemi, není zaručeno, že kapacita bude k dispozici v každém případě, když je svazek vytvořen, ale přesto se zvyšuje šance, že bude vytvořen bez opakování.
NB Můžete získat podrobnější informace, bezpečně si „zacvičit na kočičím stánku“ a v případě zcela nepochopitelné situace získat kvalifikovanou technickou podporu na intenzivních kurzech - Základna Kubernetes se bude konat 28. – 30. září a pro pokročilejší specialisty Kubernetes Mega 14.–16. října.
zabezpečení
CSIS kapacita úložiště
Objekty CSIStorageCapacity jsou umístěny ve jmenných prostorech; při zavádění každého ovladače CSI do vlastního jmenného prostoru se doporučuje omezit práva RBAC na CSIStorageCapacity v tomto prostoru, protože je zřejmé, odkud data pocházejí. Kubernetes to stejně nekontroluje a obvykle jsou ovladače umístěny do stejného jmenného prostoru, takže se nakonec očekává, že ovladače budou fungovat a nebudou publikovat nesprávná data (a tady moje karta selhala, Cca. překladatel založený na vousatém vtipu)
General Purpose Ephemeral Volumes
Pokud mají uživatelé práva k vytvoření pod (přímo nebo nepřímo), budou také moci vytvářet pomíjivé svazky pro obecné účely, i když nemají práva k vytvoření požadavku na svazku. Je to proto, že kontroly oprávnění RBAC jsou aplikovány na řadič, který vytváří PVC, nikoli na uživatele. Toto je hlavní změna, kterou je třeba přidat na váš účetpřed povolením této funkce na clusterech, kde by nedůvěryhodní uživatelé neměli mít práva k vytváření svazků.
příklad
Samostatný Vetka PMEM-CSI obsahuje všechny potřebné změny ke spuštění clusteru Kubernetes 1.19 uvnitř virtuálních počítačů QEMU se všemi funkcemi ve fázi alfa. Kód ovladače se nezměnil, změnilo se pouze nasazení.
Na vhodném stroji (Linux, běžný uživatel může použít přístavní dělník, Koukni se zde podrobnosti) tyto příkazy vyvolají cluster a nainstalují ovladač PMEM-CSI:
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
Jakmile vše funguje, výstup bude obsahovat návod k použití:
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 -
Objekty CSIStorageCapacity nejsou určeny ke čtení lidmi, takže je vyžadováno určité zpracování. Filtry šablon Golang zobrazí třídy úložiště, tento příklad ukáže název, topologii a kapacitu:
Zkusme vytvořit demo aplikaci s jediným pomíjivým svazkem pro obecné účely. Obsah souboru 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
Po vytvoření, jak je znázorněno ve výše uvedených pokynech, nyní máme další pod a 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
Pokud jiná aplikace potřebuje více než 26620Mi, nebude plánovač brát v úvahu pmem-csi-pmem-govm-worker1 v každém případě.
Co bude dál?
Obě funkce jsou stále ve vývoji. Během alfa testování bylo otevřeno několik aplikací. Odkazy na návrh vylepšení dokumentují práci, kterou je třeba vykonat pro přechod do beta fáze, a také to, které alternativy již byly zváženy a zamítnuty: