
Vissa appar behöver ocksÄ lagra data, men de Àr ganska avslappnade med att informationen inte sparas efter en omstart.
Till exempel Àr cachetjÀnster begrÀnsade av RAM, men kan ocksÄ flytta data som sÀllan anvÀnds till lagring som Àr lÄngsammare Àn RAM, med liten inverkan pÄ den totala prestandan. Andra applikationer mÄste vara medvetna om att filer kan innehÄlla viss skrivskyddad inmatning, till exempel instÀllningar eller hemliga nycklar.
Kubernetes har redan flera typer , men deras funktionalitet Àr begrÀnsad till vad som Àr implementerat i K8s.
Kortlivad tillÀt att Kubernetes kunde utökas med hjÀlp av CSI-drivrutiner för att ge stöd för lÀtta lokala volymer. PÄ sÄ sÀtt Àr det möjligt att anvÀnda : instÀllningar, hemligheter, identiteter, variabler etc. CSI-drivrutiner mÄste modifieras för att stödja den hÀr Kubernetes-funktionen, eftersom de vanliga standardiserade drivrutinerna inte förvÀntas fungera - men sÄdana volymer förvÀntas kunna anvÀndas pÄ alla noder som valts för poden.
Detta kan vara ett problem för volymer med betydande resursförbrukning för noder eller för lagring som bara Àr tillgÀnglig pÄ vissa noder. Det Àr dÀrför Kubernetes 1.19 introducerar tvÄ nya alfavolymfunktioner som konceptuellt liknar EmptyDir-volymer:
allmÀnna efemÀra volymer;
Ăvervakning av CSI-lagringskapacitet.
Fördelar med det nya tillvÀgagÄngssÀttet:
lagringen kan vara lokal eller ansluten via ett nÀtverk;
Volymer kan ha en specificerad storlek som inte kan överskridas av applikationen;
fungerar med alla CSI-drivrutiner som stöder provisionering av bestÀndiga volymer och (för att stödja kapacitetsspÄrning) implementerar anropet
GetCapacity;Volymer kan ha vissa initialdata beroende pÄ drivrutin och parametrar;
alla typiska volymoperationer (skapa en ögonblicksbild, Àndra storlek etc.) stöds;
Volymer kan anvÀndas med vilken applikationskontrollant som helst som accepterar en modul- eller volymspecifikation;
Kubernetes-schemalÀggaren vÀljer automatiskt lÀmpliga noder, sÄ det finns inget behov av att etablera och konfigurera schemalÀggartillÀgg eller Àndra webhooks.
Applikationsalternativ
SÄledes Àr generella, efemÀra volymer lÀmpliga för följande anvÀndningsfall:
Persistent minne som RAM-ersÀttning för Memcached
Senaste memcachade utgÄvor med permanent minne (Intel Optane, etc., cirka. översÀttare) istÀllet för vanligt RAM. NÀr du distribuerar memcached via applikationskontrollanten kan du anvÀnda generella efemÀra volymer för att begÀra en volym av en given storlek frÄn PMEM med hjÀlp av CSI-drivrutinen, t.ex. .
Lokal LVM-lagring som en arbetsyta
Program som arbetar med data som Àr större Àn RAM-minnet kan krÀva lokal lagring med en storlek eller prestandamÄtt som vanliga Kubernetes EmptyDir-volymer inte kan tillhandahÄlla. Till exempel, en .
Skrivskyddad Ätkomst för datavolymer
Volymtilldelning kan resultera i en full volym nÀr:
restaurering ;
skapelse ;
arbete .
Dessa volymer kan monteras i skrivskyddat lÀge.
Hur fungerar den hÀr
AllmÀnna, efemÀra volymer
En viktig egenskap hos generella, efemÀra volymer Àr den nya volymkÀllan, EphemeralVolumeSource, som innehÄller alla fÀlt för att skapa en volymförfrÄgan (historiskt kallad en permanent volymförfrÄgan, PVC). Den nya kontrollanten i kube-controller-manager letar efter poddar som skapar en sÄdan volymkÀlla och skapar sedan en PVC för dessa poddar. För CSI-drivrutinen ser den hÀr begÀran ut som vilken annan som helst, sÄ inget sÀrskilt stöd behövs.
Ăven om sĂ„dana PVC:er existerar kan de anvĂ€ndas som alla andra volymförfrĂ„gningar. De kan sĂ€rskilt refereras som en datakĂ€lla nĂ€r man kopierar en volym eller skapar en ögonblicksbild frĂ„n en volym. PVC-objektet innehĂ„ller ocksĂ„ volymens aktuella tillstĂ„nd.
Namnen pÄ de automatiskt skapade PVC:erna Àr fördefinierade: en kombination av podnamnet och volymnamnet, separerade med ett bindestreck. Fördefinierade namn gör det enklare att interagera med PVC:n, eftersom du inte behöver slÄ upp den om du vet podnamnet och volymnamnet. Nackdelen Àr att namnet kanske redan anvÀnds, vilket upptÀcks av Kubernetes och resulterar i att poden inte startar.
För att sÀkerstÀlla att volymen tas bort tillsammans med poden gör kontrollenheten en podÀgarens begÀran för volymen. NÀr poden tas bort utlöses standardmekanismen för sophÀmtning, vilket tar bort bÄde begÀran och volymen.
FörfrĂ„gningar tilldelas en lagringsdrivrutin via den vanliga lagringsklassmekanismen. Ăven om klasser med direkt- och sent bundna grĂ€nser (Ă€ven kallade WaitForFirstConsumer) stöds, för kortlivade volymer Ă€r det vettigt att anvĂ€nda WaitForFirstConsumer, dĂ„ kan schemalĂ€ggaren ta hĂ€nsyn till bĂ„de nodanvĂ€ndning och lagringstillgĂ€nglighet nĂ€r den vĂ€ljer en nod. Det Ă€r hĂ€r en ny funktion kommer in i bilden.
Ăvervakning av lagringskapacitet
Vanligtvis har schemalÀggaren ingen kunskap om var CSI-drivrutinen kommer att skapa volymen. SchemalÀggaren har inte heller möjlighet att kontakta drivrutinen direkt för att begÀra denna information. DÀrför avsöker schemalÀggaren noder tills den hittar en dÀr volymerna kan nÄs (sen bindning), eller lÀmnar valet av plats helt till drivrutinen (omedelbar bindning).
Nytt CSIStorageCapacity, som Àr i alfa, tillÄter lagring av nödvÀndig data i etcd sÄ att den Àr tillgÀnglig för schemalÀggaren. Till skillnad frÄn stöd för generella, efemÀra volymer mÄste spÄrning av lagringskapacitet vara aktiverad nÀr drivrutinen distribueras: external-provisioner mÄste publicera kapacitetsinformationen som mottagits frÄn föraren via den vanliga GetCapacity.
Om schemalÀggaren behöver vÀlja en nod för en pod med en obunden volym som anvÀnder sen bindning, och drivrutinen aktiverade den hÀr funktionen under distributionen genom att stÀlla in flaggan CSIDriver.storageCapacity, noder som inte har tillrÀckligt med lagringskapacitet kommer automatiskt att tas bort. Detta fungerar för bÄde generella, efemÀra och persistenta volymer, men inte för CSI-efemÀra volymer, eftersom deras parametrar inte kan lÀsas av Kubernetes.
Som vanligt skapas omedelbart bundna volymer innan poddar schemalÀggs, och deras placering vÀljs av lagringsdrivrutinen, sÄ vid konfiguration external-provisioner Som standard hoppas lagringsklasser med omedelbar bindning över eftersom data ÀndÄ inte kommer att anvÀndas.
Eftersom Kubernetes-schemalÀggaren tvingas arbeta med potentiellt inaktuell information finns det ingen garanti för att kapaciteten kommer att vara tillgÀnglig i alla fall nÀr volymen skapas, men chansen att den skapas utan Äterförsök ökar ÀndÄ.
NB Du kommer att kunna fĂ„ mer detaljerad information, samt sĂ€kert "öva pĂ„ kattstĂ€llet", och i hĂ€ndelse av en helt oklar situation fĂ„ kvalificerad hjĂ€lp frĂ„n teknisk support pĂ„ intensivkurser - kommer att Ă€ga rum den 28-30 september, och för mer avancerade specialister 14â16 oktober.
ĐĐ”Đ·ĐŸĐżĐ°ŃĐœĐŸŃŃŃ
CSIStorageCapacity
CSIStorageCapacity-objekt finns i namnrymder. NÀr man rullar ut varje CSI-drivrutin till sin egen namnrymd rekommenderas det att begrÀnsa RBAC-behörigheter för CSIStorageCapacity i den namnrymden, eftersom det Àr uppenbart varifrÄn informationen kommer. Kubernetes kontrollerar ÀndÄ inte detta, och drivrutiner distribueras vanligtvis i samma namnrymd, sÄ i slutÀndan förvÀntas drivrutinerna fungera och inte publicera felaktig data (och hÀr hade jag tur, översÀttarens anteckning baserad pÄ ett skÀggigt skÀmt)
AllmÀnna, efemÀra volymer
Om anvÀndare har behörighet att skapa en pod (direkt eller indirekt) kommer de ocksÄ att kunna skapa generella, tillfÀlliga volymer Àven om de inte har behörighet att skapa en volymförfrÄgan. Detta beror pÄ att RBAC-behörighetskontroller tillÀmpas pÄ den kontrollant som skapar PVC:n, inte pÄ anvÀndaren. Detta Àr den huvudsakliga Àndringen som behöver göras. , innan den hÀr funktionen aktiveras i kluster om otillförlitliga anvÀndare inte ska ha behörighet att skapa volymer.
Exempel
Separat i PMEM-CSI innehÄller alla nödvÀndiga Àndringar för att köra ett Kubernetes 1.19-kluster inuti virtuella QEMU-maskiner med alla funktioner som finns i alfastadiet. Drivrutinskoden har inte Àndrats, bara distributionen har Àndrats.
PÄ en lÀmplig bil (Linux, en vanlig anvÀndare kan anvÀnda , se detaljer) dessa kommandon kommer att öppna klustret och installera PMEM-CSI-drivrutinen:
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 allt har fungerat kommer resultatet att innehÄlla bruksanvisningar:
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-objekt Àr inte avsedda att lÀsas av mÀnniskor, sÄ viss bearbetning krÀvs. Med hjÀlp av Golang-mallfilter kommer lagringsklasserna att visas, i det hÀr exemplet kommer namn, topologi och kapacitet att visas:
$ 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
Ett enskilt objekt har följande innehÄll:
$ kubectl describe csistoragecapacities/csisc-6cw8j
Name: csisc-sqdnt
Namespace: default
Labels: <none>
Annotations: <none>
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: <none>
LÄt oss försöka skapa en demoapplikation med en allmÀnt anvÀndbar, kortlivad volym. FilinnehÄll 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 skapandet, som visas i instruktionerna ovan, fick vi en extra pod och 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
PVC-Ă€gare - under:
$ 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
...
Som förvÀntat har informationen för uppdaterats 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
Om en annan applikation behöver mer Àn 26620Mi, kommer schemalÀggaren inte att ta hÀnsyn till det. pmem-csi-pmem-govm-worker1 i alla fall.
Vad hÀnder nu?
BÄda funktionerna Àr fortfarande under utveckling. Flera Àrenden har öppnats under alfatestning. LÀnkarna till förbÀttringsförslag dokumenterar det arbete som behöver göras för att komma till betaversionen, samt vilka alternativ som redan har övervÀgts och förkastats:
KĂ€lla: will.com
