Efemära volymer med spårning av lagringskapacitet: EmptyDir på steroider
Vissa applikationer behöver också lagra data, men de är ganska bekväma med att data inte kommer att sparas efter en omstart.
Till exempel är cachningstjä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 program måste vara medvetna om att det kan finnas viss skrivskyddad indata i filerna, till exempel inställningar eller hemliga nycklar.
Kubernetes har redan flera typer flyktiga volymer, men deras funktionalitet är begränsad till vad som är implementerat i K8s.
Kortlivad CSI-volymer tillät Kubernetes att utökas med 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 godtyckliga strukturer: inställningar, hemligheter, identifieringsdata, variabler och så vidare. CSI-drivrutiner måste modifieras för att stödja denna Kubernetes-funktion, eftersom det antas att vanliga standardiserade drivrutiner inte kommer att fungera - men det antas att sådana volymer kan användas på vilken nod som helst som valts för podden.
Detta kan vara ett problem för volymer som förbrukar betydande värdresurser eller för lagring som bara är tillgänglig på vissa värdar. Det är därför Kubernetes 1.19 introducerar två nya alfatestningsvolymfunktioner som konceptuellt liknar EmptyDir-volymer:
kortvariga volymer för allmänna ändamål;
Spårning av CSI-lagringskapacitet.
Fördelar med det nya tillvägagångssättet:
lagring 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 tillhandahållande av beständiga volymer och (för att stödja kapacitetsspårning) implementera samtalet GetCapacity;
volymer kan ha vissa initiala data beroende på drivrutinen och inställningarna;
alla standardoperationer med en volym (skapa en ögonblicksbild, ändra storlek, etc.) stöds;
volymer kan användas med vilken applikationsstyrenhet som helst som accepterar en modul- eller volymspecifikation;
Kubernetes schemaläggare väljer lämpliga noder på egen hand, så det finns inte längre något behov av att tillhandahålla och konfigurera schemaläggartillägg eller ändra webhooks.
Programalternativ
Därför är kortvariga volymer för allmänna ändamål lämpliga för följande användningsfall:
Beständigt minne som ersättning för RAM för memcached
Senaste utgåvorna av memcached lagt till stöd använder beständigt minne (Intel Optane, etc., cirka. översättare) istället för vanligt RAM. När du distribuerar memcached via en applikationskontroller kan du använda tillfälliga volymer för allmänna ändamål för att begära att en volym av en given storlek allokeras från PMEM med CSI-drivrutinen, till exempel PMEM-CSI.
LVM lokal lagring som arbetsyta
Applikationer som arbetar med data som är större än RAM-minne kan kräva lokal lagring med en storlek eller prestandamått som vanliga EmptyDir-volymer från Kubernetes inte kan tillhandahålla. Till exempel skrevs det för detta ändamål TopoLVM.
Skrivskyddad åtkomst för datavolymer
Tilldelning av en volym kan resultera i att en full volym skapas när:
En nyckelfunktion för kortvariga volymer för allmänna ändamål är den nya volymkällan, EphemeralVolumeSource, som innehåller alla fält för att skapa en volymbegäran (historiskt kallad en beständig volymbegäran, PVC). Ny styrenhet in kube-controller-manager tittar på baljorna som skapar en sådan volymkälla och skapar sedan en PVC för dessa baljor. För CSI-drivrutinen ser denna begäran ut på samma sätt som de andra, så här behövs ingen speciell support.
Så länge sådana PVC finns kan de användas som alla andra önskemål på volymen. I synnerhet kan de refereras till som en datakälla när du kopierar en volym eller skapar en ögonblicksbild från en volym. PVC-objektet innehåller också volymens aktuella tillstånd.
Namnen på automatiskt skapade PVC-skivor är fördefinierade: de är en kombination av podnamnet och volymnamnet, åtskilda av ett bindestreck. Fördefinierade namn gör det lättare att interagera med PVC eftersom du inte behöver leta efter det om du känner till podnamnet och volymnamnet. Nackdelen är att namnet kanske redan används, vilket upptäcks av Kubernetes och som ett resultat blockeras podden från att starta.
För att säkerställa att volymen raderas tillsammans med podden, gör kontrollern en begäran till volymen under ägaren. När podden raderas fungerar den vanliga sophämtningsmekanismen, vilket tar bort både begäran och volymen.
Förfrågningar matchas av lagringsdrivrutinen genom den normala mekanismen för lagringsklassen. Även om klasser med omedelbar och sen bindning (aka WaitForFirstConsumer) stöds, för efemära 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 du väljer en nod. En ny funktion visas här.
Spårning av lagringskapacitet
Vanligtvis har schemaläggaren ingen kunskap om var CSI-drivrutinen kommer att skapa volymen. Det finns inte heller något sätt för schemaläggaren att kontakta föraren direkt för att begära denna information. Därför kontrollerar schemaläggaren noder tills den hittar en på vilken volymer kan nås (sen bindning) eller överlåter valet av plats helt till föraren (omedelbar bindning).
Nytt APICSIStorageCapacity, som är i alfastadiet, tillåter att nödvändig data lagras i etcd så att den är tillgänglig för schemaläggaren. Till skillnad från stöd för tillfälliga volymer för allmänna ändamål måste du aktivera spårning av lagringskapacitet när du distribuerar drivrutinen: external-provisioner ska publicera kapacitetsinformationen som erhållits från föraren via normal 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, då kommer noder som inte har tillräckligt med lagringskapacitet att kasseras automatiskt. Detta fungerar för både korttidsvolymer för allmänt bruk och beständiga volymer, men inte för tillfälliga volymer för CSI eftersom deras parametrar inte kan läsas av Kubernetes.
Som vanligt skapas omedelbart länkade volymer innan poddar schemaläggs, och deras placering väljs av lagringsdrivrutinen, så vid konfigurering external-provisioner Som standard hoppas lagringsklasser med omedelbar bindning över, eftersom dessa data ändå inte kommer att användas.
Eftersom kubernetes-schemaläggaren tvingas arbeta med potentiellt inaktuell information finns det ingen garanti för att kapacitet kommer att finnas tillgänglig i alla fall när volymen skapas, men chanserna att den skapas utan omförsök ökar ändå.
NB Du kan få mer detaljerad information, samt säkert "öva på kattstället", och i händelse av en helt obegriplig situation, få kvalificerad teknisk supporthjälp på intensivkurser - Kubernetes bas kommer att hållas den 28-30 september, och för mer avancerade specialister Kubernetes Mega 14–16 oktober.
Безопасность
CSIStorageCapacity
CSIStorageCapacity-objekt finns i namnutrymmen; när man rullar ut varje CSI-drivrutin i sitt eget namnområde, rekommenderas att begränsa RBAC-rättigheter till CSIStorageCapacity i det utrymmet eftersom det är uppenbart var data kommer ifrån. Kubernetes kontrollerar inte detta i alla fall, och vanligtvis placeras drivrutiner i samma namnutrymme, så i slutändan förväntas drivrutinerna fungera och inte publicera felaktiga data (och det var här mitt kort misslyckades, cirka. översättare baserad på ett skäggigt skämt)
Kortvariga volymer för allmänna ändamål
Om användare har rättigheter att skapa en pod (direkt eller indirekt), kommer de också att kunna skapa tillfälliga volymer för allmänna ändamål även om de inte har rättigheter att skapa en begäran på volymen. Detta beror på att RBAC-behörighetskontroller tillämpas på styrenheten som skapar PVC, inte på användaren. Detta är huvudändringen att lägga till till ditt konto, innan du aktiverar den här funktionen på kluster där opålitliga användare inte ska ha rättigheter att skapa volymer.
Exempel
Separat gren PMEM-CSI innehåller alla nödvändiga ändringar för att köra ett Kubernetes 1.19-kluster i virtuella QEMU-maskiner med alla funktioner i alfastadiet. Förarkoden har inte ändrats, bara distributionen har ändrats.
På en lämplig maskin (Linux kan en normal användare använda Hamnarbetare, se här detaljer) kommer dessa kommandon att ta fram 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 utgången att innehålla instruktioner för användning:
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. Golang-mallfilter visar lagringsklasserna, det här exemplet visar namn, topologi och kapacitet:
Låt oss försöka skapa en demoapplikation med en kortvarig volym för allmänt bruk. Filens innehå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 att ha skapat, som visas i instruktionerna ovan, har vi nu 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
Om en annan applikation behöver mer än 26620Mi, tar inte schemaläggaren hänsyn pmem-csi-pmem-govm-worker1 hur som helst.
Vad händer nu?
Båda funktionerna är fortfarande under utveckling. Flera applikationer öppnades under alfatestning. Förbättringsförslagslänkarna dokumenterar det arbete som behöver göras för att gå över till betastadiet, samt vilka alternativ som redan har övervägts och förkastats: