Efemeersed mahud salvestusmahu jÀlgimisega: EmptyDir steroidide peal

Efemeersed mahud salvestusmahu jÀlgimisega: EmptyDir steroidide peal

MÔned rakendused peavad samuti andmeid salvestama, kuid nad vÔtavad rahulikult, et andmeid ei salvestata pÀrast taaskÀivitamist.

NĂ€iteks vahemĂ€lu teenused on piiratud mĂ€luga, kuid vĂ”ivad ka liikuda andmed, mida harva kasutatakse, aeglasemasse salvestusse, millel on vĂ€ike mĂ”ju ĂŒldisele jĂ”udlusele. Teised rakendused peavad teadma, et failides vĂ”ivad olla teatud lugemisĂ”igusega andmed, nĂ€iteks seadistused vĂ”i salajased vĂ”tmed.

Kubernetesel on juba mitu tĂŒĂŒpi efemeerseid mahtu, kuid nende funktsionaalsus on piiratud sellega, mis on K8s-s rakendatud.

Efemeersed CSI mahud on vĂ”imaldanud Kubernetesel laiendada lĂ€bi CSI draiverite, et tagada kergete kohalike mahtude tugi. Selle meetodiga on vĂ”imalik rakendada millel on mistahes struktuur: seadistused, saladused, identifitseerimisandmed, muutujad jms. CSI draivereid tuleb tĂ€iustada, et toetada seda Kubernetes funktsiooni, kuna eeldatakse, et tavalised standardiseeritud draiverid ei toimi — kuid eeldatakse, et selliseid mahtusid saab kasutada igas sĂ”lmes, mida podi jaoks on valitud.

See vÔib olla probleem sÔlme tÀhtsaid ressursse tarbivate mahtude puhul vÔi salvestuste puhul, mis on saadaval ainult teatud sÔlmedes. Sel pÔhjusel tutvustatakse Kubernetes 1.19-s kahte uut mahufunktsiooni alfa-testimiseks, mis on kontseptuaalselt sarnased EmptyDir mahtudega:

  • ĂŒldotstarbelised efemeersed mahud;

  • CSI salvestuse mahtu jĂ€lgimine.

Uue lÀhenemise eelised:

  • salvestus vĂ”ib olla kohalik vĂ”i vĂ”rgupĂ”hine;

  • mahtudel vĂ”ivad olla mÀÀratud suurused, mida rakendus ei saa ĂŒletada;

  • toimib kĂ”ikide CSI draiveritega, mis toetavad pĂŒsivate mahtude pakkumist ja (salvestuse jĂ€lgimise toetamiseks) rakendavad kutset GetCapacity;

  • mahtudel vĂ”ivad olla mĂ”ned algandmed, mis sĂ”ltuvad draiverist ja parameetritest;

  • kĂ”ik mahuga seotud tĂŒĂŒpilised toimingud (oleku snapshot'i loomine, suuruse muutmine jne) on toetatud;

  • mahtu saab kasutada mis tahes rakenduste kontrollija abil, mis aktsepteerib mooduli vĂ”i mahu spetsifikatsiooni;

  • Kubernetes'i planeerija valib ise sobivad sĂ”lmed, seega ei ole enam vaja planeerija laiendusi seadistada ja webhooks'e muuta.

Rakenduse variandid

Seega sobivad ajutised ĂŒldkasutamiseks mĂ”eldud mahud jĂ€rgmisteks rakendusteks:

PĂŒsiv mĂ€lu memcached'i operatiivmĂ€lu asendajana

Viimased memcached'i vĂ€ljalasked lisavad toe pĂŒsiva mĂ€lu (nt Intel Optane) kasutamiseks tĂ”lkija mĂ€rkustavapĂ€rase operatiivmĂ€lu asemel. Memcached'i juurutamisel rakenduste juhtimisliidese kaudu saab ajutiste ĂŒldkasutamiseks mĂ”eldud mahude abil teha taotluse vĂ€ljatĂ”stmiseks mÀÀratud suurusega volumi jaoks PMEM'i kaudu CSI draiveri abil, nĂ€iteks PMEM-CSI.

Kohalik LVM-i salvestusruum tööruumina

Andmetega töötavad rakendused, mille andmete maht ĂŒletab operatiivmĂ€lu suuruse, saavad kĂŒsida kohalikku salvestust, mille suurus vĂ”i tulemuslikkuse mÔÔdikud ei pruugi tavalised Kubernetes'e EmptyDir mahud pakkuda. NĂ€iteks selle eesmĂ€rgi saavutamiseks on kirjutatud TopoLVM.

Ainult lugemiseks mÔeldud mahud andmete jaoks

MahuvÀlja andmine vÔib pÔhjustada tÀidetud mahu loomist, kui:

Ajutised ĂŒldkasutamiseks mĂ”eldud mahud

Kuidas see töötab

Ajutiste ĂŒldkasutuseks mĂ”eldud mahude peamine omadus on uus mahupĂ€ritolu,

EphemeralVolumeSource , mis sisaldab kĂ”iki vĂ€lju selle mahutaotluse loomiseks (ajalooliselt nimetatakse seda pideva mahu taotluseks, PVC). Uus kontrollerkube-controller-manager vaatab podid, mis loovad sellise mahupĂ€ritolu, ja loob nende podide jaoks PVC. CSI draiveri jaoks nĂ€eb see taotlus vĂ€lja nagu kĂ”ik teised, seega ei ole siin erilist tuge vajalik. Nii kaua, kui sellised PVC-d eksisteerivad – neid saab kasutada nagu kĂ”iki teisi mahutaotlusi. EelkĂ”ige vĂ”ivad need olla viidud andmeallikana mahu kopeerimisel vĂ”i mahu pildistamisel. PVC objekt sisaldab ka mahuhĂ€ire praegust olekut.

Kui sellised PVC-d eksisteerivad, vÔivad neid kasutada nagu kÔiki teisi mahtude pÀringuid. Ehkki nad vÔivad olla andmeallikaks mahu kopeerimisel vÔi mahu snapshot'i loomisel. PVC-objekt sisaldab ka mahu praegust olekut.

Automaatsete PVC-de nimed on eelnevalt mÀÀratud: need on podi nime ja mahtude nime kombinatsioonid, mis on eraldatud sidekriipsuga. Eelnevalt mÀÀratud nimed lihtsustavad PVC-de kasutamist, sest pole vaja otsida, kui podi ja mahu nimed on teada. Puuduseks on see, et nimi vÔib juba olla kasutusel, mille Kubernetes tuvastab ja mille tÔttu toimuva podi kÀivitamine takistatakse.

KĂ€skude tagamiseks, et maht kustutatakse koos podiga, teeb kontroller podi mahtude omaniku. Kui pod kustutatakse, aktiveeritakse tavapĂ€rane prĂŒgi koristamise mehhanism, mis kustutab nii nĂ”ude kui ka mahu.

NĂ”uetele vastatakse salvestusajami draiveri kaudu tavalise salvestusklassi mehhanismi abil. Kuigi koheselt ja hiljuti kohalike ĂŒhendustega (need on) WaitForFirstConsumer) on toetatud, on efemeersete mahtude puhul mĂ”ttekas kasutada WaitForFirstConsumer, et planeerija saaks arvesse vĂ”tta nii sĂ”lme kasutamist kui ka salvestusruumi kĂ€ttesaadavust sĂ”lme valimisel. Siin on lisandunud uus funktsioon.

Salvestusruumi jÀlgimine

Tavaliselt ei oma planeerija andmeid selle kohta, kus CSI draiver loob mahu. Samuti ei ole planeerijal vĂ”imalust otse draiveriga selle teabe pĂ€rimiseks ĂŒhendust vĂ”tta. SeetĂ”ttu kĂŒsib planeerija sĂ”lmedelt, kuni ta leiab sĂ”lme, kus mahud vĂ”ivad olla kĂ€ttesaadavad (hilinenud liitmine) vĂ”i jĂ€tab koha valiku tĂ€ielikult draiveri hooleks (kohene liitmine).

Uus API CSIStorageCapacity, mis on alpha faasis, vÔimaldab vajalike andmete salvestamist etcd-s, nii et need on planeerija jaoks kergesti kÀttesaadavad. Erinevalt efemeersete mahtude tavakasutuse toetusest peab draiveri kÀitamisel olema aktiveeritud salvestusruumi jÀlgimise tugi: external-provisioner peab avaldama kapatsiteedi teavet, mille ta on saanud draiverilt tavalise GetCapacity.

Kui planeerijal tuleb valida sĂ”lm podile, millel on kinnitamata maht, mis kasutab hilinenud liitmist, ja draiver aktiveeris selle funktsiooni jĂ€lgimist, seadistades lipu CSIDriver.storageCapacity, siis lĂŒkatakse automaatselt tagasi sĂ”lmed, millel ei ole piisavalt salvestusruumi. See töötab nii efemeersete tavakasutuse mahtude kui ka pĂŒsivate mahtude puhul, kuid mitte efemeersete CSI mahtude jaoks, kuna nende parameetreid ei saa Kubernetesest lugeda.

Nagu tavaliselt, luuakse otsetoetavad mahud enne podide planeerimist ning nende paigutuse valib salvestusjuht, seega seadistamise ajal external-provisioner vaadatakse vaikimisi ĂŒle salvestusklassid, mis pakuvad otsetoetust, kuna neid andmeid ei kasutata nagunii.

Kuna Kubernetes'i ajakava peab töötama potentsiaalselt aegunud teabega, ei ole garanteeritud, et maht on alati saadaval, kui mahtu luuakse, kuid samas on tÔenÀosus, et see luuakse ilma uuesti katsetamata, suurem.

MĂ€rkus. Lisainfot saate ning saate ohutult "katsetada katsetuskeskkonnas", ning kui olukord peaks olema tĂ€iesti arusaamatu, vĂ”ite saada kvalifitseeritud tehnikatoe abi intensiivkursustel — Kubernetes PĂ”hi mis toimuvad 28.-30. septembril, ning edasijĂ”udnud spetsialistide jaoks Kubernetes Mega 14–16 oktoobril.

Turvalisus

CSIStorageCapacity

CSIStorageCapacity objektid asuvad nimede ruumides. Iga CSI draiveri juurutamisel soovitatakse RBAC Ă”igusi piirata selles nimeserveris, et selgelt oleks aru, kust andmed pĂ€rinevad. Igal juhul Kubernetes seda ei kontrolli, ja tavaliselt paigaldatakse draiverid ĂŒhte nimede ruumi, nii et lĂ”puks oodatakse, et draiver töötaks ja ei avalikustaks valeandmeid (ja siin lĂ€ks mul kaart kĂ€ima, tĂ”lkija mĂ€rk: inspireeritud vanast anekdootist)

Ajutiste ĂŒldkasutuseks mĂ”eldud mahude peamine omadus on uus mahupĂ€ritolu,

Kui kasutajatel on Ă”igus luua poda (otseselt vĂ”i kaudselt) - saavad nad luua ka ajutisi ĂŒhiskasutatavaid mahte, isegi kui neil pole Ă”igust mahtu taotleda. See on seetĂ”ttu, et RBAC Ă”iguste kontrollid rakendatakse PVC loomise kontrollerile, mitte kasutajale. See on oluline muudatus, mida tuleb lisada kasutajakontole, enne selle funktsiooni aktiveerimist klastrites, kui usaldamatutel kasutajatel ei tohiks olla Ă”igust mahte luua.

NĂ€ide

Erinev teema PMEM-CSI-s sisaldab kÔiki vajalikke muudatusi Kubernetes 1.19 klastri kÀivitamiseks QEMU virtuaalamadest, kÔik funktsioonid on alpha staadiumis. Draiveri kood ei ole muutunud, on muutunud vaid juurutamine.

Sobivas masinas (Linux, tavaline kasutaja vĂ”ib kasutada Docker, vaadake siit detailid) need kĂ€sud tĂ”stavad ĂŒles klastrit ja paigaldavad 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 on töövalmis, sisaldab vÀljund kasutamiseks juhiseid:

Testiklastri on valmis. Logige sisse aadressiga [...] /pmem-csi/_work/pmem-govm/ssh.0, kÀivitage
kubectl pÀrast sisselogimist. Alternatiivselt kasutage kubectl otse jÀrgnevate keskkonnamuutujatega:
   KUBECONFIG=[...] /pmem-csi/_work/pmem-govm/kube.config

salajane/pmem-csi-registry-secrets loodud
salajane/pmem-csi-node-secrets loodud
teenusekonto/pmem-csi-controller loodud
...
Et proovida pmem-csi draiveri ajutisi mahuteid:
   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 inimeste poolt lugemiseks, seega on vajalik teatud töötlemine. GoLang'i mallifiltrite abil kuvatakse salvestusklassid, selles nÀites kuvatakse nimi, topoloogia ja maht:

$ 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 kaart[pmem-csi.intel.com/node:pmem-csi-pmem-govm-worker2] 30716Mi
csisc-sqdnt kaart[pmem-csi.intel.com/node:pmem-csi-pmem-govm-worker1] 30716Mi
csisc-ws4bv kaart[pmem-csi.intel.com/node:pmem-csi-pmem-govm-worker3] 30716Mi

Üksikobjektil on jĂ€rgmine sisu:

$ kubectl describe csistoragecapacities/csisc-6cw8j
Nimi:         csisc-sqdnt
Nimi ruum:    default
MĂ€rgid:       
MĂ€rkused:     
API versioon:  storage.k8s.io/v1alpha1
Maht:        30716Mi
TĂŒĂŒp:        CSIStorageCapacity
Metaandmed:
  Loomise ajatemperatuur:  2020-08-11T15:41:03Z
  Generaatori nimi:       csisc-
  Halduse vÀljad:
    ...
  Omaniku viidatud:
    API versioon:     apps/v1
    Kontroller:      true
    TĂŒĂŒp:            StatefulSet
    Nimi:            pmem-csi-controller
    UID:             590237f9-1eb4-4208-b37b-5f7eab4597d1
  Ressursi versioon:  2994
  Ise link:         /apis/storage.k8s.io/v1alpha1/namespaces/default/csistoragecapacities/csisc-sqdnt
  UID:               da36215b-3b9d-404a-a4c7-3f1c3502ab13
Node Topoloogia:
  Vastav mÀrgid:
    pmem-csi.intel.com/node:  pmem-csi-pmem-govm-worker1
Salvestusklassi nimi:           pmem-csi-sc-late-binding
SĂŒndmused:

Proovime luua demonstreerimise rakenduse, millel on ĂŒks ajutine mahuti ĂŒldiselt. 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 juhendis nĂ€idatud, on meil lisakonteiner ja PVC:

$ kubectl get pods/my-csi-app-inline-volume -o wide
NIMI                       VALMIS   OLEK    UUENDUSED   VANUS     IP          NODE                         NOMINEERITUD NODE   VALMIDUSE VÄRJAD
my-csi-app-inline-volume   1/1     KĂ€ivitatud   0          6m58s   10.36.0.2   pmem-csi-pmem-govm-worker1              
$ kubectl get pvc/my-csi-app-inline-volume-my-csi-volume
NIMI                                     OLEK   MAHT                                     MAHT       JURDUSMODID   SALVESTUSKLASS               VANUS
my-csi-app-inline-volume-my-csi-volume   Seotud    pvc-c11eb7ab-a4fa-46fe-b515-b366be908823   4Gi        RWO            pmem-csi-sc-late-binding   9m21s

PVC omanik — konteiner:

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

Oodatult uuendati teavet pmem-csi-pmem-govm-worker1:

csisc-2js6n kaarditamine[pmem-csi.intel.com/node:pmem-csi-pmem-govm-worker2] 30716Mi
csisc-sqdnt kaarditamine[pmem-csi.intel.com/node:pmem-csi-pmem-govm-worker1] 26620Mi
csisc-ws4bv kaarditamine[pmem-csi.intel.com/node:pmem-csi-pmem-govm-worker3] 30716Mi

Kui teisele rakendusele on vajalik rohkem kui 26620Mi, ei arvestata planeerija seda pmem-csi-pmem-govm-worker1 igal juhul.

Mis edasi?

MĂ”lemad funktsioonid on veel arenduses. Alpha-testimise kĂ€igus on avatud mitmeid taotlusi. Parendamise ettepanekutest loobumise linkide kaudu dokumenteeritakse töö, mida tuleb teha, et liikuda beta-etappi, ja samuti, milliseid alternatiive on juba kaalutud ja tagasi lĂŒkatud:

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster