Lühiajalised mahud koos salvestusmahu jälgimisega: EmptyDir steroididel

Lühiajalised mahud koos salvestusmahu jälgimisega: EmptyDir steroididel

Mõned rakendused peavad ka andmeid salvestama, kuid nad on üsna rahul sellega, et pärast taaskäivitamist andmeid ei salvestata.

Näiteks vahemällu salvestamise teenused on piiratud RAM-iga, kuid need võivad harva kasutatavaid andmeid teisaldada ka RAM-ist aeglasemale salvestusruumile, mis ei mõjuta üldist jõudlust. Teised rakendused peavad teadma, et failides võib olla kirjutuskaitstud sisend, näiteks sätted või salajased võtmed.

Kubernetes on juba mitut tüüpi efemeersed köited, kuid nende funktsionaalsus piirdub K8-des rakendatuga.

Põgusad CSI mahud võimaldas Kubernetesi laiendada CSI-draiveritega, et pakkuda tuge kergetele kohalikele köidetele. Sel viisil on võimalik kasutada suvalised struktuurid: seaded, saladused, identifitseerimisandmed, muutujad jne. CSI-draivereid tuleb selle Kubernetese funktsiooni toetamiseks muuta, kuna eeldatakse, et tavalised standardsed draiverid ei tööta – kuid eeldatakse, et selliseid helitugevusi saab kasutada igas podi jaoks valitud sõlmes.

See võib olla probleem köidete puhul, mis tarbivad märkimisväärseid hostiressursse, või salvestusruumi puhul, mis on saadaval ainult mõnel hostil. Seetõttu tutvustab Kubernetes 1.19 kahte uut alfatestimise mahu funktsiooni, mis on kontseptuaalselt sarnased EmptyDiri köidetega:

  • üldotstarbelised lühiajalised köited;

  • CSI mälumahu jälgimine.

Uue lähenemisviisi eelised:

  • salvestusruum võib olla kohalik või võrgu kaudu ühendatud;

  • mahud võivad olla kindla suurusega, mida rakendus ei saa ületada;

  • töötab kõigi CSI-draiveritega, mis toetavad püsivate mahtude pakkumist ja (võimsuse jälgimise toetamiseks) rakendavad kõnet GetCapacity;

  • köidetel võib sõltuvalt draiverist ja sätetest olla algandmeid;

  • toetatud on kõik mahuga standardtoimingud (hetktõmmise loomine, suuruse muutmine jne);

  • köiteid saab kasutada mis tahes rakenduskontrolleriga, mis aktsepteerib moodulit või helitugevuse spetsifikatsiooni;

  • Kubernetese ajakava valib sobivad sõlmed ise, seega pole enam vaja planeerijalaiendeid ette valmistada ja konfigureerida ega veebihaake muuta.

Rakenduse valikud

Seetõttu sobivad üldotstarbelised efemeersed köited järgmisteks kasutusjuhtudeks:

Püsmälu, mis asendab vahemälu RAM-i

Memcachedi viimased versioonid lisatud toetus kasutades püsimälu (Intel Optane jne, u. tõlkija) tavalise RAM-i asemel. Rakenduse kontrolleri kaudu memcachedi juurutamisel saate kasutada üldotstarbelisi lühiajalisi köiteid, et nõuda, et PMEM-ist eraldataks teatud suurusega köide, kasutades näiteks CSI draiverit. PMEM-CSI.

LVM-i kohalik salvestusruum tööruumina

Rakendused, mis töötavad RAM-ist suuremate andmetega, võivad vajada kohalikku salvestusruumi, mille suurus või jõudlusmõõdikud ei suuda pakkuda tavalisi Kubernetese EmptyDir-köiteid. Näiteks selleks oli kirjutatud TopoLVM.

Kirjutuskaitstud juurdepääs andmemahtudele

Köite eraldamine võib põhjustada täismahu loomise, kui:

Neid köiteid saab paigaldada kirjutuskaitstud režiimis.

Kuidas see töötab

Üldotstarbelised lühiajalised köited

Üldotstarbeliste lühiajaliste köidete põhifunktsiooniks on uus köiteallikas, EphemeralVolumeSource, mis sisaldab kõiki välju mahupäringu loomiseks (ajalooliselt nimetatakse seda püsivaks mahupäringuks, PVC). Uus kontroller sisse kube-controller-manager vaatab kaunasid, mis loovad sellise mahuallika, ja loob seejärel nende kaunade jaoks PVC. CSI draiveri puhul näeb see taotlus välja samasugune nagu teised, seega pole siin erilist tuge vaja.

Kuni sellised PVC-d on olemas, saab neid kasutada nagu kõiki muid helitugevuse taotlusi. Eelkõige saab neile viidata andmeallikana köite kopeerimisel või köitest hetktõmmise loomisel. PVC objekt sisaldab ka helitugevuse hetkeseisu.

Automaatselt loodud PVC-de nimed on eelmääratletud: need on sidekriipsuga eraldatud kausta nime ja köite nime kombinatsioon. Eelmääratletud nimed muudavad PVC-ga suhtlemise lihtsamaks, kuna te ei pea seda otsima, kui teate kausta nime ja helitugevuse nime. Negatiivne külg on see, et nimi võib olla juba kasutusel, mille tuvastab Kubernetes ja selle tulemusena blokeeritakse podi käivitamine.

Tagamaks, et köide kustutatakse koos kaustaga, esitab kontroller päringu omaniku all olevale helitugevusele. Kui pod on kustutatud, töötab tavaline prügikoristusmehhanism, mis kustutab nii päringu kui ka helitugevuse.

Päringuid sobitab salvestusdraiver tavalise salvestusklassi mehhanismi kaudu. Kuigi tunnid kohese ja hilise sidumisega (aka WaitForFirstConsumer) on toetatud, lühiajaliste köidete puhul on mõttekas kasutada WaitForFirstConsumer, siis saab planeerija sõlme valimisel arvestada nii sõlme kasutust kui ka salvestusruumi saadavust. Siin kuvatakse uus funktsioon.

Salvestusmahu jälgimine

Tavaliselt ei tea ajakava koostaja, kus CSI-draiver helitugevuse loob. Samuti ei saa ajakava koostaja selle teabe saamiseks otse juhiga ühendust võtta. Seetõttu küsitleb planeerija sõlme, kuni leiab ühe, millelt köidetele juurde pääseda (hiline sidumine) või jätab asukoha valiku täielikult draiveri hooleks (kohene sidumine).

uus API CSIStorageCapacity, mis on alfafaasis, võimaldab salvestada vajalikud andmed etcd-sse, et need oleksid planeerijale kättesaadavad. Erinevalt üldotstarbeliste lühiajaliste mahtude toest peate draiveri juurutamisel lubama mälumahu jälgimise. external-provisioner peaks avaldama juhilt tavalise kaudu saadud võimsusteabe GetCapacity.

Kui planeerija peab valima sidumata köitega podi jaoks sõlme, mis kasutab hilist sidumist ja draiver lubas selle funktsiooni juurutamise ajal lipu määramisega CSIDriver.storageCapacity, siis sõlmed, millel pole piisavalt mälumahtu, visatakse automaatselt kõrvale. See töötab nii üldotstarbeliste lühiajaliste kui ka püsivate köidete puhul, kuid mitte CSI lühiajaliste köidete puhul, kuna Kubernetes ei saa nende parameetreid lugeda.

Nagu tavaliselt, luuakse kohe lingitud köited enne kaustade ajastamist ja nende paigutuse valib salvestusdraiver, nii et konfigureerimisel external-provisioner Vaikimisi jäetakse kohese sidumisega salvestusklassid vahele, kuna neid andmeid nagunii ei kasutata.

Kuna kubernetes'i planeerija on sunnitud töötama potentsiaalselt vananenud teabega, ei ole garantiid, et maht on igal juhul saadaval köite loomisel, kuid tõenäosus, et see luuakse ilma korduskatsetusteta, suureneb.

NB Täpsemat infot saab, aga ka turvaliselt “kasside stendil harjutada” ning täiesti arusaamatu olukorra korral saada kvalifitseeritud tehnilise toe abi intensiivkursustel - Kubernetese baas toimub 28.-30.septembril ja edasijõudnutele spetsialistidele Kubernetes Mega 14.–16. oktoober.

turvalisus

CSIStorageCapacity

CSIStorageCapacity objektid asuvad nimeruumides; iga CSI draiveri kasutuselevõtul oma nimeruumis on soovitatav piirata RBAC õigusi CSIStorageCapacityga selles ruumis, kuna on ilmne, kust andmed pärinevad. Kubernetes seda niikuinii ei kontrolli ja tavaliselt pannakse draiverid samasse nimeruumi, nii et lõppkokkuvõttes eeldatakse, et draiverid töötavad ega avalda valesid andmeid (ja see on koht, kus minu kaart ebaõnnestus, u. tõlkija habemega nalja põhjal)

Üldotstarbelised lühiajalised köited

Kui kasutajatel on õigused podi loomiseks (otse või kaudselt), saavad nad luua ka üldotstarbelisi lühiajalisi köiteid, isegi kui neil pole volitusel päringu loomise õigusi. Selle põhjuseks on asjaolu, et RBAC-i lubade kontrolle rakendatakse kontrollerile, mis loob PVC, mitte kasutajale. See on peamine lisatav muudatus teie kontole, enne selle funktsiooni lubamist klastrites, kus ebausaldusväärsetel kasutajatel ei tohiks olla õigusi köidete loomiseks.

Näide

Eraldi põsesamm PMEM-CSI sisaldab kõiki vajalikke muudatusi Kubernetes 1.19 klastri käitamiseks QEMU virtuaalmasinates koos kõigi alfafaasi funktsioonidega. Draiveri kood pole muutunud, muutunud on ainult juurutus.

Sobival masinal (Linux, tavakasutaja saab kasutada laevalaadija, vaata siin üksikasjad) need käsud avavad klastri ja installivad PMEM-CSI draiveri:

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

Kui kõik töötab, sisaldab väljund kasutusjuhiseid:

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 objektid ei ole mõeldud inimestele lugemiseks, seega on vaja teatud töötlemist. Golangi mallifiltrid näitavad salvestusklasse, see näide näitab nime, topoloogiat ja mahtu:

$ 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

Ühel objektil on järgmine sisu:

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

Proovime luua demorakenduse ühe üldotstarbelise lühiajalise mahuga. Faili sisu 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

Pärast loomist, nagu ülaltoodud juhistes näidatud, on meil nüüd täiendav kott ja 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 omanik – all:

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

Eeldatavasti värskendatud teave 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

Kui mõni muu rakendus vajab rohkem kui 26620Mi, ei võta planeerija arvesse pmem-csi-pmem-govm-worker1 igal juhul.

Mis edasi?

Mõlemad funktsioonid on alles väljatöötamisel. Alfatestimise käigus avati mitu rakendust. Parendusettepaneku lingid dokumenteerivad töö, mida tuleb teha beetafaasile üleminekuks, ning millised alternatiivid on juba kaalutud ja tagasi lükatud:

Allikas: www.habr.com

Lisa kommentaar