
Nekim aplikacijama također je potrebno pohraniti podatke, ali su dovoljno tolerantne prema tome da podaci neće biti sačuvani nakon ponovnog pokretanja.
Na primjer, servisi za keširanje su ograničeni po operativnoj memoriji, ali također mogu premještati podatke koji se rijetko koriste u pohranu koja radi sporije od operativne memorije, uz malo utjecaja na ukupne performanse. Drugim aplikacijama je potrebno znati da u datotekama mogu biti neki ulazni podaci samo za čitanje, poput postavki ili tajnih ključeva.
U Kubernetesu već postoji nekoliko tipova , ali je njihova funkcionalnost ograničena onim što je implementirano u K8s.
Efemerni omogućuju širenje Kubernetesa pomoću CSI drajvera za podršku laganim lokalnim volumenima. Na taj način je moguće primijeniti : postavke, tajne, identifikacijske podatke, varijable i slično. CSI drajveri trebaju biti implementirani kako bi podržali ovu funkciju Kubernetesa, jer se pretpostavlja da standardizirani drajveri neće raditi — ali se očekuje da se takvi volumeni mogu koristiti na bilo kojem čvoru izabranom za pod.
To može predstavljati problem za volumene koji značajno koriste resurse čvora ili za pohranu dostupnu samo na nekim čvorovima. Stoga su u Kubernetesu 1.19 predstavljene dvije nove funkcije volumena za alpha testiranje, konceptualno slične volumenu EmptyDir:
efemerni volumeni opće namjene;
praćenje kapaciteta CSI pohrane.
Prednosti novog pristupa:
pohrana može biti lokalna ili mrežno povezana;
volumeni mogu imati zadanu veličinu koja ne može biti prekoračena od strane aplikacije;
radi s bilo kojim CSI drajverima koji podržavaju pružanje trajnih volumena i (za podršku praćenju kapaciteta) implementiraju poziv
GetCapacity;volumeni mogu imati neke početne podatke, ovisno o drajveru i parametrima;
sve tipične operacije s volumenom (stvaranje snimke stanja, promjena veličine itd.) su podržane;
volumeni se mogu koristiti s bilo kojim kontrolerom aplikacija koji prihvaća specifikaciju modula ili volumena;
Kubernetes planirnik sam bira odgovarajuće čvoriće, tako da više nije potrebno osiguravati i podešavati ekstenzije planirnika i menjati webhooks.
Primjene
Time efemerni volumeni opće namjene odgovaraju sljedećim primjenama:
Trajna memorija kao zamjena za radnu memoriju za memcached
Najnovija izdanja memcached-a za korištenje trajne memorije (Intel Optane i slično, nap. prevoditelja) umjesto obične radne memorije. Pri implementaciji memcached-a putem kontrolera aplikacija moguće je koristiti efemerne volumene opće namjene za zahtjev za izdvajanje volumena određene veličine iz PMEM-a pomoću CSI drajvera, na primjer .
Lokalno skladište LVM kao radni prostor
Aplikacije koje rade s podacima čija veličina prelazi veličinu radne memorije mogu zahtijevati lokalno skladište s veličinom ili metriko performansi koje ne mogu pružiti obični EmptyDir volumeni iz Kubernetes-a. Na primjer, za tu svrhu napisan je .
Pristup samo za čitanje za volumene s podacima
Izdvajanje volumena može dovesti do stvaranja popunjenog volumena prilikom:
obnavljanja ;
stvaranja ;
radu .
Ovi volumeni mogu biti montirani u režimu samo za čitanje.
Kako to funkcionira
Efemerni volumeni opće namjene
Ključna karakteristika efemernih volumena opće namjene je novi izvor volumena, EphemeralVolumeSource, koji sadrži sva polja za izradu zahtjeva za volumen (historijski se naziva zahtjev za trajnim volumenom, PVC). Novi kontroler u kube-controller-manager pretražuje podove koji stvaraju takav izvor volumena, a zatim stvara PVC za te podove. Za CSI drajver, ovaj zahtjev izgleda kao i ostali, tako da ovdje nije potrebna posebna podrška.
Dok takvi PVC postoje - mogu se koristiti kao i bilo koji drugi zahtjevi za volumen. Konkretno, mogu biti referenca kao izvor podataka prilikom kopiranja volumena ili stvaranja snimke s volumena. PVC objekt također sadrži trenutno stanje volumena.
Automatski generirana PVC imena su unaprijed određena: to je kombinacija imena pod-a i imena volumena, povezanih crticom. Ova unaprijed definirana imena olakšavaju interakciju s PVC-om, jer se ne mora tražiti ako znate ime pod-a i ime volumena. Nedostatak je taj što ime može već biti korišteno, što Kubernetes otkriva i, kao rezultat, pokretanje pod-a se blokira.
Da biste bili sigurni da se volumen uklanja zajedno s pod-om, kontroler postavlja pod kao vlasnika zahtjeva za volumenom. Kada se pod ukloni, aktivira se standardni mehanizam za čišćenje, koji uklanja i zahtjev i volumen.
Zahtjevima se dodjeljuje pohrambeni vozač kroz uobičajeni mehanizam klase pohrane. Iako se podupiru klase neposredne i kasnije povezanosti (one također WaitForFirstConsumer) za efemerne volumene, ima smisla koristiti WaitForFirstConsumer, tako da planirnik može uzeti u obzir i korištenje čvora i dostupnost pohrane pri odabiru čvora. Ovdje se pojavljuje nova funkcija.
Praćenje kapaciteta pohrane
Obično planirnik nema podatke o tome gdje će CSI vozač stvoriti volumen. Također, planirnik nema mogućnost izravno kontaktirati vozača za zahtjev tih informacija. Stoga planirnik ispituje čvorove dok ne pronađe onaj na kojem su volumeni dostupni (kasnije povezivanje), ili potpuno prepušta odabir mjesta vozaču (neposredno povezivanje).
Novi CSIStorageCapacity, u alpha fazi, omogućava pohranu potrebnih podataka u etcd, tako da su dostupni planirniku. Za razliku od podrške za efemerne volumene opće namjene, prilikom implementacije vozača potrebno je uključiti praćenje kapaciteta pohrane: external-provisioner mora objaviti informacije o kapacitetu koje dobiva od vozača putem uobičajenog GetCapacity.
Ako planirniku treba odabrati čvor za pod s nepovezanim volumenom koji koristi kasnije povezivanje, a vozač je prilikom implementacije aktivirao ovu funkciju postavljanjem oznake CSIDriver.storageCapacity, automatski će biti isključeni čvorovi koji nemaju dostatnu pohranu. Ovo radi i za efemerne opće namjene, kao i za trajne volumene, ali ne za efemerne CSI volumene, budući da njihovi parametri ne mogu biti očitani od strane Kubernetesa.
Kao i obično, volumeni s neposrednim vezivanjem kreiraju se prije planiranja podova, a njihovo mjesto odabire vozač pohrane, tako da prilikom postavljanja external-provisioner po defaultu se propuštaju klase pohrane s neposrednim vezivanjem, jer ti podaci ionako neće biti korišteni.
Budući da Kubernetes planer mora raditi s potencijalno zastarjelim informacijama, nema jamstva da će kapacitet biti dostupan bilo kada kada se volumen kreira, no, u svakom slučaju, šanse da će biti kreiran bez ponovljenih pokušaja se povećavaju.
Napomena. Detaljnije informacije moći ćete dobiti, kao i sigurno 'vježbati na mačkama' na terenu, a u slučaju zaista nejasne situacije dobiti kvalificiranu pomoć tehničke podrške na intenzivima — održat će se 28-30. rujna, a za naprednije stručnjake 14–16. listopada.
Sigurnost
CSIStorageCapacity
CSIStorageCapacity objekti nalaze se u prostorima imena, prilikom instalacije svakog CSI vozača preporučuje se ograničiti RBAC prava za CSIStorageCapacity u tom prostoru, s obzirom na to odakle dolaze podaci. U svakom slučaju, Kubernetes to ne provjerava, a obično se vozači instaliraju u jednom prostoru imena, tako da se na kraju očekuje da će vozači raditi i neće objavljivati netočne podatke (i ovdje mi je karta ispala, napomena prevoditelja inspirirana starim vicem)
Efemerni volumeni opće namjene
Ako korisnici imaju prava za kreiranje poda (izravno ili neizravno) — također će moći kreirati ephemeral volumene opće namjene čak i ako nemaju prava za kreiranje zahtjeva za volumen. A sve to zato što se provjere RBAC prava primjenjuju na kontroler koji kreira PVC, a ne na korisnika. Ovo je osnovna promjena koju treba dodati , prije omogućavanja ove funkcije u klasterima, ako nepouzdani korisnici ne smiju imati prava na kreiranje volumena.
Primjer
Odvojena u PMEM-CSI sadrži sve potrebne promjene za pokretanje Kubernetes klastera 1.19 unutar QEMU virtualnih mašina sa svim funkcijama koje su u alpha fazi. Kod vozača nije mijenjan, samo se promijenila instalacija.
Na prikladnoj mašini (Linux, običan korisnik može koristiti , pogledajte detalje) ove komande podignut će klaster i instalirati PMEM-CSI vozača:
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
Nakon što sve proradi, ishod će sadržavati upute za korištenje:
Testna klaster je spremna. Prijavite se s [...]pmem-csi/_work/pmem-govm/ssh.0, pokrenite
kubectl nakon prijave. Alternativno, koristite kubectl izravno s
sljedećom varijablom okruženja:
KUBECONFIG=[...]pmem-csi/_work/pmem-govm/kube.config
secret/pmem-csi-registry-secrets stvoren
secret/pmem-csi-node-secrets stvoren
serviceaccount/pmem-csi-controller stvoren
...
Da isprobate pmem-csi upravljač efemernih volumena:
cat deploy/kubernetes-1.19/pmem-app-ephemeral.yaml |
[...]pmem-csi/_work/pmem-govm/ssh.0 kubectl create -f -
Objekti CSIStorageCapacity nisu namijenjeni za ljudsko čitanje, pa je potrebna određena obrada. Korištenjem predložaka na Golangu bit će prikazane klase pohrane; u ovom primjeru prikazat će se ime, topologija i kapacitet:
$ kubectl get
-o go-template='{{range .items}}{{if eq .storageClassName "pmem-csi-sc-late-binding"}}{{.metadata.name}} {{.nodeTopology.matchLabels}} {{.capacity}}
{{end}}{{end}}'
csistoragecapacities
csisc-2js6n map[pmem-csi.intel.com/node:pmem-csi-pmem-govm-worker2] 30716Mi
csisc-sqdnt map[pmem-csi.intel.com/node:pmem-csi-pmem-govm-worker1] 30716Mi
csisc-ws4bv map[pmem-csi.intel.com/node:pmem-csi-pmem-govm-worker3] 30716Mi
Jedan objekt ima sljedeći sadržaj:
$ kubectl describe csistoragecapacities/csisc-6cw8j
Name: csisc-sqdnt
Namespace: default
Labels:
Annotations:
API Version: storage.k8s.io/v1alpha1
Capacity: 30716Mi
Kind: CSIStorageCapacity
Metadata:
Creation Timestamp: 2020-08-11T15:41:03Z
Generate Name: csisc-
Managed Fields:
...
Owner References:
API Version: apps/v1
Controller: true
Kind: StatefulSet
Name: pmem-csi-controller
UID: 590237f9-1eb4-4208-b37b-5f7eab4597d1
Resource Version: 2994
Self Link: /apis/storage.k8s.io/v1alpha1/namespaces/default/csistoragecapacities/csisc-sqdnt
UID: da36215b-3b9d-404a-a4c7-3f1c3502ab13
Node Topology:
Match Labels:
pmem-csi.intel.com/node: pmem-csi-pmem-govm-worker1
Storage Class Name: pmem-csi-sc-late-binding
Events:
Pokušajmo stvoriti demonstracijsku aplikaciju s jednim efemernim volumenom opće namjene. Sadržaj datoteke 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
Nakon stvaranja, kao što je prikazano u uputama iznad, imali smo dodatni pod i 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
$ 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
Vlasnik PVC-a je pod:
$ kubectl get -o yaml pvc/my-csi-app-inline-volume-my-csi-volume
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
annotations:
pv.kubernetes.io/bind-completed: "yes"
pv.kubernetes.io/bound-by-controller: "yes"
volume.beta.kubernetes.io/storage-provisioner: pmem-csi.intel.com
volume.kubernetes.io/selected-node: pmem-csi-pmem-govm-worker1
creationTimestamp: "2020-08-11T15:44:57Z"
finalizers:
- kubernetes.io/pvc-protection
managedFields:
...
name: my-csi-app-inline-volume-my-csi-volume
namespace: default
ownerReferences:
- apiVersion: v1
blockOwnerDeletion: true
controller: true
kind: Pod
name: my-csi-app-inline-volume
uid: 75c925bf-ca8e-441a-ac67-f190b7a2265f
...
Očekivano je ažurirana informacija za pmem-csi-pmem-govm-worker1:
csisc-2js6n map[pmem-csi.intel.com/node:pmem-csi-pmem-govm-worker2] 30716Mi
csisc-sqdnt map[pmem-csi.intel.com/node:pmem-csi-pmem-govm-worker1] 26620Mi
csisc-ws4bv map[pmem-csi.intel.com/node:pmem-csi-pmem-govm-worker3] 30716Mi
Ako drugoj aplikaciji bude potrebno više od 26620Mi, planer to neće uzeti u obzir pmem-csi-pmem-govm-worker1 u svakom slučaju.
Što dalje?
Obje funkcije su još u razvoju. Nekoliko prijava je otvoreno tijekom alpha testiranja. Dokumentira se rad koji treba obaviti kako bi se prešlo u beta fazu, kao i koje su alternative već razmatrane i odbijene:
Izvor: habr.com
