Lagerkapacitet sporede flygtige volumener: EmptyDir på steroider
Nogle applikationer skal også gemme data, men de er ret komfortable med, at dataene ikke bliver gemt efter en genstart.
For eksempel er cachetjenester begrænset af RAM, men kan også flytte data, der sjældent bruges, til lager, der er langsommere end RAM, med ringe indflydelse på den samlede ydeevne. Andre programmer skal være opmærksomme på, at der kan være nogle skrivebeskyttede input i filerne, såsom indstillinger eller hemmelige nøgler.
Kubernetes har allerede flere typer flygtige bind, men deres funktionalitet er begrænset til det, der er implementeret i K8'erne.
Ephemeral CSI-volumener tillod Kubernetes at blive udvidet med CSI-drivere for at understøtte lette lokale volumener. På denne måde er det muligt at bruge vilkårlige strukturer: indstillinger, hemmeligheder, identifikationsdata, variabler og så videre. CSI-drivere skal modificeres for at understøtte denne Kubernetes-funktion, da det antages, at almindelige standardiserede drivere ikke vil fungere - men det antages, at sådanne volumener kan bruges på enhver node valgt til poden.
Dette kan være et problem for enheder, der bruger betydelige værtsressourcer, eller for lager, der kun er tilgængelig på nogle værter. Det er derfor, Kubernetes 1.19 introducerer to nye alfa-testvolumenfunktioner, der konceptuelt ligner EmptyDir-volumener:
flygtige bind til generelle formål;
CSI-lagerkapacitetssporing.
Fordele ved den nye tilgang:
lagring kan være lokalt eller forbundet via et netværk;
volumener kan have en specificeret størrelse, der ikke kan overskrides af applikationen;
fungerer med alle CSI-drivere, der understøtter levering af vedvarende volumener og (for at understøtte kapacitetssporing) implementerer opkaldet GetCapacity;
volumener kan have nogle indledende data afhængigt af driveren og indstillingerne;
alle standardoperationer med en volumen (oprettelse af et snapshot, ændring af størrelse osv.) understøttes;
volumener kan bruges med enhver applikationscontroller, der accepterer en modul- eller volumenspecifikation;
Kubernetes-planlæggeren vælger egnede noder alene, så der er ikke længere behov for at klargøre og konfigurere planlægningsudvidelser eller ændre webhooks.
Applikationsindstillinger
Derfor er flygtige volumener til generelle formål egnede til følgende anvendelsessager:
Vedvarende hukommelse som erstatning for RAM til memcached
Seneste udgivelser af memcached tilføjet støtte ved hjælp af vedvarende hukommelse (Intel Optane osv., ca. oversætter) i stedet for almindelig RAM. Når du implementerer memcached gennem en applikationscontroller, kan du bruge kortvarige volumener til generelle formål til at anmode om, at en volumen af en given størrelse allokeres fra PMEM ved hjælp af CSI-driveren, f.eks. PMEM-CSI.
LVM lokalt lager som et arbejdsområde
Programmer, der arbejder med data, der er større end RAM, kan kræve lokal lagring med en størrelse eller ydeevnemålinger, som almindelige EmptyDir-volumener fra Kubernetes ikke kan levere. For eksempel blev det skrevet til dette formål TopoLVM.
Skrivebeskyttet adgang til datamængder
Tildeling af en volumen kan resultere i oprettelse af en fuld volumen, når:
Disse volumener kan monteres i skrivebeskyttet tilstand.
Hvordan fungerer denne her
Kortvarige bind til generelle formål
Et nøgletræk ved kortvarige volumener til generelle formål er den nye volumenkilde, EphemeralVolumeSource, der indeholder alle felterne til at oprette en volumenanmodning (historisk kaldet en persistent volume request, PVC). Ny controller ind kube-controller-manager ser på de pods, der skaber en sådan volumenkilde, og laver derefter en PVC til disse pods. For CSI-driveren ser denne anmodning ud som de andre, så der er ikke behov for særlig support her.
Så længe sådanne PVC'er eksisterer, kan de bruges som alle andre forespørgsler på volumen. De kan især henvises til som en datakilde, når du kopierer en diskenhed eller laver et snapshot fra en diskenhed. PVC-objektet indeholder også volumenets aktuelle tilstand.
Navnene på automatisk oprettede PVC'er er foruddefinerede: de er en kombination af podnavnet og volumennavnet, adskilt af en bindestreg. Foruddefinerede navne gør det lettere at interagere med PVC, fordi du ikke behøver at lede efter det, hvis du kender podnavnet og volumennavnet. Ulempen er, at navnet muligvis allerede er i brug, hvilket bliver opdaget af Kubernetes, og som følge heraf er poden blokeret fra at starte.
For at sikre, at volumen slettes sammen med poden, sender controlleren en anmodning til volumen under ejeren. Når poden slettes, fungerer standardaffaldsindsamlingsmekanismen, som sletter både anmodningen og volumen.
Anmodninger matches af lagerdriveren gennem lagerklassens normale mekanisme. Selvom klasser med øjeblikkelig og sen binding (aka WaitForFirstConsumer) understøttes, for flygtige mængder giver det mening at bruge WaitForFirstConsumer, så kan planlæggeren overveje både nodebrug og lagertilgængelighed, når der vælges en node. En ny funktion vises her.
Sporing af lagerkapacitet
Planlæggeren har typisk ingen viden om, hvor CSI-driveren vil oprette volumen. Der er heller ingen måde for planlæggeren at kontakte chaufføren direkte for at anmode om disse oplysninger. Derfor spørger skemalæggeren noder, indtil den finder en, hvor der kan tilgås bind (sen binding) eller overlader valget af placering helt til føreren (umiddelbar binding).
Nyt APICSIStorageCapacity, som er i alfastadiet, gør det muligt at lagre de nødvendige data i etcd, så de er tilgængelige for planlæggeren. I modsætning til understøttelse af kortvarige volumener til generelle formål, skal du aktivere lagerkapacitetssporing, når du implementerer driveren: external-provisioner skal offentliggøre kapacitetsoplysningerne modtaget fra chaufføren via alm GetCapacity.
Hvis planlæggeren skal vælge en node til en pod med en ubundet volumen, der bruger sen binding, og driveren aktiverede denne funktion under implementeringen ved at indstille flaget CSIDriver.storageCapacity, så vil noder, der ikke har nok lagerkapacitet, automatisk blive kasseret. Dette virker for både kortvarige og vedvarende volumener til generelle formål, men ikke for flygtige CSI-volumener, fordi deres parametre ikke kan læses af Kubernetes.
Som sædvanlig oprettes umiddelbart forbundne volumener, før pods planlægges, og deres placering vælges af lagerdriveren, så når du konfigurerer external-provisioner Som standard springes lagerklasser med øjeblikkelig binding over, da disse data alligevel ikke vil blive brugt.
Da kubernetes-planlæggeren er tvunget til at arbejde med potentielt forældede informationer, er der ingen garanti for, at kapacitet vil være tilgængelig i alle tilfælde, når volumen oprettes, men chancerne for, at den bliver oprettet uden genforsøg, øges alligevel.
NB Du kan få mere detaljeret information, samt sikkert "øve dig på kattestanden", og i tilfælde af en helt uforståelig situation modtage kvalificeret teknisk support assistance på intensive kurser - Kubernetes Base afholdes den 28.-30. september, og for mere avancerede specialister Kubernetes Mega 14.–16. oktober.
Безопасность
CSIS StorageCapacity
CSIStorageCapacity-objekter ligger i navnerum; når hver CSI-driver udrulles i sit eget navneområde, anbefales det at begrænse RBAC-rettigheder til CSIStorageCapacity i dette rum, da det er tydeligt, hvor dataene kommer fra. Kubernetes tjekker alligevel ikke efter dette, og sædvanligvis placeres drivere i det samme navneområde, så i sidste ende forventes driverne at virke og ikke offentliggøre forkerte data (og det er her, mit kort fejlede, ca. oversætter baseret på en skægget joke)
Kortvarige bind til generelle formål
Hvis brugere har rettigheder til at oprette en pod (direkte eller indirekte), vil de også være i stand til at oprette kortvarige volumener til generelle formål, selvom de ikke har rettigheder til at oprette en anmodning på volumen. Dette skyldes, at RBAC-tilladelsestjek anvendes på den controller, der skaber PVC'en, ikke på brugeren. Dette er den vigtigste ændring, der skal tilføjes til din konto, før du aktiverer denne funktion på klynger, hvor upålidelige brugere ikke bør have rettigheder til at oprette volumener.
Eksempel
Adskille gren PMEM-CSI indeholder alle de nødvendige ændringer for at køre en Kubernetes 1.19-klynge inde i QEMU virtuelle maskiner med alle funktionerne i alfa-stadiet. Driverkoden er ikke ændret, kun implementeringen er ændret.
På en passende maskine (Linux, kan en normal bruger bruge Docker, se her detaljer) vil disse kommandoer hente klyngen frem og installere PMEM-CSI-driveren:
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
Når alt virker, vil outputtet indeholde instruktioner til brug:
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 -
CSIStorageCapacity-objekter er ikke beregnet til at blive læst af mennesker, så en vis behandling er påkrævet. Golang skabelonfiltre viser lagerklasserne, dette eksempel viser navn, topologi og kapacitet:
Lad os prøve at skabe en demoapplikation med et enkelt kortvarigt volumen til generelle formål. Filens indhold 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
Efter at have oprettet, som vist i instruktionerne ovenfor, har vi nu en ekstra pod og 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
Hvis en anden applikation har brug for mere end 26620Mi, vil planlæggeren ikke tage højde for det pmem-csi-pmem-govm-worker1 i hvert fald.
Hvad er det næste?
Begge funktioner er stadig under udvikling. Adskillige applikationer blev åbnet under alfa-testning. Forbedringsforslagets links dokumenterer det arbejde, der skal gøres for at gå til betastadiet, samt hvilke alternativer, der allerede er blevet overvejet og afvist: