Ett tillfÀlligt lager med kapacitetsspÄrning: EmptyDir pÄ steroider

Ett tillfÀlligt lager med kapacitetsspÄrning: EmptyDir pÄ steroider

Vissa applikationer behöver ocksÄ lagra data, men de Àr ganska avslappnade nÀr det gÀller att data inte sparas efter omstart.

Till exempel, cache-tjÀnster Àr begrÀnsade av RAM-minnet, men de kan ocksÄ flytta data som sÀllan anvÀnds till lagring som fungerar lÄngsammare Àn RAM, med liten effekt pÄ den övergripande prestandan. Andra applikationer behöver veta att filer kan ha vissa skrivskyddade indata, sÄsom instÀllningar eller hemliga nycklar.

I Kubernetes finns det redan flera typer av efemÀra volymer, men deras funktionalitet Àr begrÀnsad till vad som Àr implementerat i K8s.

EfemÀra volymer CSI har möjliggjort att utöka Kubernetes med CSI-drivrutiner för att stödja lÀtta lokala volymer. PÄ detta sÀtt Àr det möjligt att anvÀnda vilka strukturer som helst: instÀllningar, hemligheter, identitetsdata, variabler och sÄ vidare. CSI-drivrutiner mÄste anpassas för att stödja denna funktioner i Kubernetes, eftersom man förvÀntar sig att vanliga standardiserade drivrutiner inte kommer att fungera - men man förvÀntar sig att sÄdana volymer kan anvÀndas pÄ vilken nod som helst som valts för podden.

Detta kan bli ett problem för volymer med betydande resursförbrukning pÄ noden eller för lagring som endast Àr tillgÀnglig pÄ vissa noder. DÀrför introducerades i Kubernetes 1.19 tvÄ nya volymfunktioner för alfa-testning, konceptuellt liknande tomma volymer:

  • efemĂ€ra volymer av allmĂ€nt bruk;

  • lagringskapacitetsspĂ„rning för CSI.

Fördelarna med den nya metoden:

  • lagringen kan vara lokal eller ansluten via nĂ€tverk;

  • volymer kan ha en angiven storlek som inte fĂ„r överskridas av applikationen;

  • fungerar med alla CSI-drivrutiner som stöder tillhandahĂ„llande av bestĂ€ndiga volymer och (för att stödja kapacitetsövervakning) implementerar anropet GetCapacity;

  • volymer kan ha vissa initiala data, beroende pĂ„ drivrutinen och parametrarna;

  • alla typiska operationer pĂ„ volymen (skapa snapshots, Ă€ndra storlek, osv.) stöds;

  • volymer kan anvĂ€ndas med vilken applikationskontrollerare som helst som accepterar modul- eller volymspecifikation.

  • Kubernetes-schemalĂ€ggaren vĂ€ljer sjĂ€lv lĂ€mpliga noder, sĂ„ det Ă€r inte lĂ€ngre nödvĂ€ndigt att tillhandahĂ„lla och konfigurera schemalĂ€ggarutvidgningar eller Ă€ndra webhooks.

AnvÀndningsalternativ

DÀrför passar efemÀra volymer av allmÀn typ för följande anvÀndningsalternativ:

Permanent minne som ersÀttning för RAM för memcached

De senaste versionerna av memcached har lagt till stöd för anvÀndning av permanent minne (Intel Optane m.fl., översÀttarens anm.) istÀllet för vanligt RAM. Vid distribution av memcached via applikationskontroller kan man med hjÀlp av efemÀra volymer av allmÀn typ begÀra tilldelning av en volym med angiven storlek frÄn PMEM med CSI-drivrutinen, till exempel PMEM-CSI.

Lokal LVM-lagring som arbetsyta

Applikationer som arbetar med data vars storlek överskrider storleken pÄ RAM kan begÀra lokal lagring med storlek eller prestandamÄtt som inte kan tillhandahÄllas av vanliga EmptyDir-volymer frÄn Kubernetes. Till exempel har detta syfte skapat TopoLVM.

Skrivskyddad Ätkomst för datavolymer

Tilldelning av en volym kan leda till skapandet av en fylld volym vid:

Dessa volymer kan monteras i skrivskyddat lÀge.

Hur det fungerar

EfemÀra volymer av allmÀn type

En nyckelfunktion för efemÀra volymer av allmÀn typ Àr en ny volymkÀlla, EphemeralVolumeSource, som innehÄller alla fÀlt för att skapa en begÀran om volym (historiskt kallad begÀran om permanent volym, PVC). Den nya kontrolleraren i kube-controller-manager granskar poddar som skapar sÄdana volymkÀllor och skapar sedan PVC för dessa poddar. För CSI-drivrutinen verkar denna begÀran likadant som övriga, sÄ hÀr behövs ingen sÀrskild support.

SĂ„ lĂ€nge sĂ„dana PVC finns — kan de anvĂ€ndas precis som andra volymförfrĂ„gningar. Specifikt kan de refereras som datakĂ€lla vid kopiering av volymer eller skapande av avbildningar frĂ„n en volym. PVC-objektet innehĂ„ller ocksĂ„ det aktuella tillstĂ„ndet för volymen.

Namnen pÄ automatiskt skapade PVC:er Àr fördefinierade: det Àr en kombination av poddnamn och volymnamn, Ätskilda med ett bindestreck. Denna fördefiniering av namn förenklar interaktionen med PVC, eftersom man inte behöver leta efter det om man kÀnner till poddnamnet och volymnamnet. En nackdel Àr att namnet redan kan ha anvÀnts, vilket upptÀckts av Kubernetes, vilket resulterar i att podden inte kan startas.

För att sÀkerstÀlla att volymen tas bort tillsammans med podden, gör kontrollern podden till Àgare av volymförfrÄgan. NÀr podden tas bort, trÀder den normala skrÀprensningsmekanismen i kraft, som tar bort bÄde förfrÄgan och volymen.

FörfrĂ„gningar matchas med lagringsdrivrutinen genom den vanliga mekanismen för lagringsklasser. Även om klasser för omedelbar och sen bindning (de) WaitForFirstConsumer) stöds, Ă€r det meningsfullt att anvĂ€nda WaitForFirstConsumer, vilket gör att schemalĂ€ggaren kan ta hĂ€nsyn till bĂ„de nodens resursanvĂ€ndning och lagringstillgĂ„ng vid val av nod. HĂ€r introduceras en ny funktion.

Övervakning av lagringskapacitet

Normalt har schemalÀggaren ingen information om var CSI-drivrutinen kommer att skapa volymen. SchemalÀggaren har inte heller möjlighet att direkt kontakta drivrutinen för att begÀra denna information. DÀrför frÄgar schemalÀggaren noder tills den hittar en dÀr volymer kan vara tillgÀngliga (sen bindning), eller helt lÀmnar valet av plats till drivrutinen (omedelbar bindning).

Ny API CSIStorageCapacity, som Àr i alpha-stadiet, möjliggör lagring av nödvÀndiga data i etcd, sÄ att de Àr tillgÀngliga för schemalÀggaren. Till skillnad frÄn stödet för generiska efemÀra volymer mÄste lagringskapacitetsövervakning aktiveras vid driftsÀttning av drivrutinen: external-provisioner mÄste publicera kapacitetsinformation som erhÄllits frÄn drivrutinen genom den vanliga GetCapacity.

Om schemalÀggaren behöver vÀlja en nod för en podd med en icke-bunden volym som anvÀnder sen bindning, och drivrutinen aktiverade denna funktion vid driftsÀttning genom att stÀlla in flaggan CSIDriver.storageCapacity, sÄ kommer noder som inte har tillrÀcklig lagringskapacitet automatiskt att avvisas. Detta fungerar bÄde för generiska efemÀra volymer och permanenta volymer, men inte för efemÀra CSI-volymer, eftersom deras egenskaper inte kan lÀsas av Kubernetes.

Som vanligt skapas volymer med omedelbar bindning innan poddar planeras, och deras placering vÀljs av lagringsdrivrutinen, sÄ vid konfiguration external-provisioner överses som standard lagringsklasser med omedelbar bindning eftersom dessa data ÀndÄ inte kommer att anvÀndas.

Eftersom Kubernetes schemalÀggaren mÄste arbeta med potentiellt förÄldrad information finns det ingen garanti för att kapaciteten kommer att vara tillgÀnglig nÀr volymen skapas, men chanserna att den skapas utan omförsök ökar.

N.B. Du kan fĂ„ mer detaljerad information och sĂ€kert "trĂ€na pĂ„ katter i en testmiljö", samt fĂ„ kvalificerad hjĂ€lp frĂ„n supporten vid evenemang som Ă€r helt oklara — Kubernetes Grund det Ă€ger rum den 28-30 september, och för mer avancerade specialister Kubernetes Mega 14–16 oktober.

SĂ€kerhet

CSIStorageCapacity

CSIVolumeCapacity-objekt finns i namnomrÄden, och vid distribution av varje CSIdrivare rekommenderas det att begrÀnsa RBAC-rÀttigheter för CSIVolumeCapacity i detta namnomrÄde, eftersom det tydligt framgÄr varifrÄn data kommer. I alla fall kontrollerar Kubernetes detta inte, och vanligtvis installeras drivrutiner i ett enda namnomrÄde, sÄ i slutÀndan förvÀntas drivrutinerna fungera och inte publicera felaktiga data (och hÀr kom min karta in, översÀttarens anm. baserat pÄ en gammal historia)

EfemÀra volymer av allmÀn type

Om anvÀndare har rÀtt att skapa en podd (direkt eller indirekt) kan de ocksÄ skapa temporÀra allmÀnna volymer Àven om de inte har rÀtt att skapa en begÀran om volym. Och allt beror pÄ att RBAC-rÀttighetskontroller appliceras pÄ controllern som skapar PVC:n, inte pÄ anvÀndaren. Detta Àr en grundlÀggande Àndring som mÄste lÀggas till till kontot, innan den hÀr funktionen aktiveras i kluster dÀr opÄlitliga anvÀndare inte bör ha rÀtt att skapa volymer.

Exempel

Ett separat trÄd i PMEM-CSI innehÄller alla nödvÀndiga Àndringar för att köra Kubernetes-klustret 1.19 inne i virtuella QEMU-maskiner med alla funktioner som Àr i alpha-stadium. Drivrutinskoden har inte Àndrats, endast distributionen.

PÄ lÀmplig maskin (Linux, en vanlig anvÀndare kan anvÀnda Docker, se ). Ett typiskt exempel pÄ anvÀndning: detaljer) dessa kommandon kommer att starta 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 utskriften att innehÄlla instruktioner för anvÀndning:

Testklustret Àr klart. Logga in med [...] /pmem-csi/_work/pmem-govm/ssh.0, kör
kubectl nÀr du Àr inloggad. Alternativt kan du anvÀnda kubectl direkt med följande miljövariabel:
   KUBECONFIG=[...] /pmem-csi/_work/pmem-govm/kube.config

secret/pmem-csi-registry-secrets skapad
secret/pmem-csi-node-secrets skapad
serviceaccount/pmem-csi-controller skapad
...
För att testa pmem-csi-drivrutinen för tillfÀlliga volymer:
   cat deploy/kubernetes-1.19/pmem-app-ephemeral.yaml |
   [...] /pmem-csi/_work/pmem-govm/ssh.0 kubectl create -f -

Objektet CSIStorageCapacity Àr inte avsett för lÀsning av mÀnniskor, sÄ viss bearbetning behövs. Med hjÀlp av mallfilter pÄ Golang kommer lagringsklasser att visas, i det hÀr exemplet visas namn, topologi och 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

Ett enskilt objekt har följande innehÄll:

$ 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:

LÄt oss försöka skapa en demonstrationsapplikation med en allmÀn tillfÀllig volym. InnehÄllet i filen 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, enligt instruktionen 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              
$ 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

Ägaren av PVC Ă€r podden:

$ 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
...

FörvÀntad information har uppdaterats för 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 vilket fall som helst.

Vad hÀnder hÀrnÀst?

BÄda funktionerna Àr fortfarande under utveckling. Flera Àrenden har öppnats under alpha-testning. Dokumentation pÄgÄr kring förslag som har inkommit för förbÀttringar, vilket arbete som behöver göras för att gÄ till beta-stadiet, samt vilka alternativ som redan har övervÀgts och avvisats:

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster