Trumpalaikiai tūriai su saugojimo talpos stebėjimu: EmptyDir steroiduose

Trumpalaikiai tūriai su saugojimo talpos stebėjimu: EmptyDir steroiduose

Kai kurioms programoms taip pat reikia saugoti duomenis, tačiau joms gana patogu, kad paleidus iš naujo duomenys nebus išsaugoti.

Pavyzdžiui, talpyklos paslaugas riboja RAM, tačiau retai naudojami duomenys taip pat gali būti perkelti į lėtesnę nei RAM saugyklą, o tai turi mažai įtakos bendram našumui. Kitos programos turi žinoti, kad failuose gali būti tik skaitymo įvestis, pvz., nustatymai ar slaptieji raktai.

Kubernetes jau turi keletą tipų efemeriški tomai, tačiau jų funkcionalumas apsiriboja tuo, kas įdiegta K8.

Efemeriškas CSI apimtis leido „Kubernetes“ išplėsti naudojant CSI tvarkykles, kad būtų galima palaikyti lengvus vietinius tomus. Tokiu būdu galima pasinaudoti savavališkos struktūros: nustatymai, paslaptys, identifikavimo duomenys, kintamieji ir pan. CSI tvarkyklės turi būti modifikuotos, kad palaikytų šią „Kubernetes“ funkciją, nes daroma prielaida, kad įprastos standartizuotos tvarkyklės neveiks, tačiau daroma prielaida, kad tokius tomus galima naudoti bet kuriame blokui pasirinktame mazge.

Tai gali kilti problema dėl tomų, kurie sunaudoja daug pagrindinio kompiuterio išteklių, arba saugykloje, kuri pasiekiama tik kai kuriuose kompiuteriuose. Štai kodėl „Kubernetes 1.19“ pristato dvi naujas alfa testavimo apimties funkcijas, kurios iš esmės yra panašios į „EmptyDir“ tomus:

  • bendrosios paskirties trumpalaikiai tomai;

  • CSI atminties talpos stebėjimas.

Naujo požiūrio pranašumai:

  • saugykla gali būti vietinė arba prijungta per tinklą;

  • apimtys gali būti nurodyto dydžio, kurio programa negali viršyti;

  • veikia su bet kokiomis CSI tvarkyklėmis, kurios palaiko nuolatinių tomų aprūpinimą ir (kad palaikytų pajėgumų sekimą) įgyvendina iškvietimą GetCapacity;

  • tomai gali turėti tam tikrų pradinių duomenų, priklausomai nuo tvarkyklės ir nustatymų;

  • palaikomos visos standartinės operacijos su apimtimi (momentinės nuotraukos kūrimas, dydžio keitimas ir pan.);

  • tomai gali būti naudojami su bet kokiu programos valdikliu, kuris priima modulio arba apimties specifikaciją;

  • „Kubernetes“ planuoklis pats pasirenka tinkamus mazgus, todėl nebereikia teikti ir konfigūruoti planavimo priemonės plėtinių ar keisti žiniatinklio kabliukų.

Taikymo parinktys

Todėl bendrosios paskirties trumpalaikiai tomai yra tinkami šiais atvejais:

Nuolatinė atmintis kaip RAM pakaitalas talpykloje

Naujausios „memcached“ versijos pridėta parama naudojant nuolatinę atmintį („Intel Optane“ ir kt., apytiksliai vertėjas) vietoj įprastos RAM. Diegdami atminties talpyklą naudodami programos valdiklį, galite naudoti bendrosios paskirties trumpalaikius tomus, kad paprašytumėte, kad tam tikro dydžio tūris būtų priskirtas iš PMEM naudojant CSI tvarkyklę, pvz. PMEM-CSI.

LVM vietinė saugykla kaip darbo vieta

Programoms, kurios dirba su duomenimis, didesniais nei RAM, gali prireikti vietinės saugyklos, kurios dydis arba našumo metrika negali užtikrinti įprastiniai „Kubernetes“ „EmptyDir“ tomai. Pavyzdžiui, šiam tikslui buvo parašyta TopoLVM.

Tik skaitymo prieiga prie duomenų apimties

Paskyrus tomą, visas tomas gali būti sukurtas, kai:

Šiuos tomus galima montuoti tik skaitymo režimu.

Kaip tai veikia

Bendrosios paskirties trumpalaikiai tomai

Pagrindinė bendrosios paskirties trumpalaikių tomų savybė yra naujas tomo šaltinis, EphemeralVolumeSource, kuriame yra visi laukai, skirti sukurti apimties užklausą (istoriškai vadinama nuolatine apimties užklausa, PVC). Naujas valdiklis kube-controller-manager žiūri į ankštis, kurios sukuria tokį tūrio šaltinį, o tada sukuria tų ankščių PVC. CSI tvarkyklei ši užklausa atrodo taip pat, kaip ir kitos, todėl čia nereikia jokio specialaus palaikymo.

Kol tokie PVC yra, juos galima naudoti kaip ir bet kokius kitus tomo prašymus. Visų pirma, juos galima nurodyti kaip duomenų šaltinį kopijuojant tomą arba iš tomo kuriant momentinę nuotrauką. PVC objekte taip pat yra esama tūrio būsena.

Automatiškai sukurtų PVC pavadinimai yra iš anksto apibrėžti: jie yra grupės pavadinimo ir tomo pavadinimo derinys, atskirtas brūkšneliu. Iš anksto nustatyti pavadinimai palengvina sąveiką su PVC, nes jums nereikės jo ieškoti, jei žinote grupės pavadinimą ir tomo pavadinimą. Neigiama yra tai, kad pavadinimas jau gali būti naudojamas, kurį aptinka Kubernetes ir dėl to blokuojamas podelio paleidimas.

Siekdamas užtikrinti, kad tomas būtų ištrintas kartu su bloku, valdiklis pateikia užklausą savininkui priklausančiam tomui. Ištrynus podą, veikia standartinis šiukšlių surinkimo mechanizmas, kuris ištrina ir užklausą, ir tomą.

Užklausas atitinka saugyklos tvarkyklė, naudodama įprastą saugyklos klasės mechanizmą. Nors pamokos su tiesioginiu ir vėlyvu įrišimu (dar žinomas kaip WaitForFirstConsumer) yra palaikomi, efemeriškiems tomams tikslinga naudoti WaitForFirstConsumer, tada planuoklis, pasirinkdamas mazgą, gali atsižvelgti ir į mazgo naudojimą, ir į saugyklos prieinamumą. Čia pasirodo nauja funkcija.

Saugyklos talpos stebėjimas

Paprastai planuotojas nežino, kur CSI tvarkyklė sukurs tomą. Taip pat planuotojas negali tiesiogiai susisiekti su vairuotoju ir paprašyti šios informacijos. Todėl planuoklis apklausia mazgus, kol randa tokį, kuriame galima pasiekti tomus (vėlyvas surišimas), arba palieka vietos pasirinkimą tik tvarkyklei (neatidėliotinas susiejimas).

Naujas API CSIStorageCapacity, kuri yra alfa stadijoje, leidžia būtinus duomenis saugoti etcd, kad jie būtų prieinami planuokliui. Skirtingai nuo bendrosios paskirties trumpalaikių tomų palaikymo, kai įdiegiate tvarkyklę, turite įjungti saugyklos talpos stebėjimą: external-provisioner turėtų paskelbti talpos informaciją, gautą iš vairuotojo per įprastą GetCapacity.

Jei planuokliui reikia pasirinkti mazgą blokui su nesurištu tomu, kuris naudoja vėlyvą susiejimą, o tvarkyklė įgalino šią funkciją diegimo metu nustatydama vėliavėlę CSIDriver.storageCapacity, tada mazgai, kuriuose nepakanka atminties talpos, bus automatiškai atmesti. Tai veikia tiek bendrosios paskirties trumpalaikiams, tiek nuolatiniams tomams, bet ne CSI trumpalaikiams tomams, nes Kubernetes negali nuskaityti jų parametrų.

Kaip įprasta, iš karto susieti tomai sukuriami prieš suplanuojant rinkinius, o jų vietą pasirenka saugyklos tvarkyklė, todėl konfigūruojant external-provisioner Pagal numatytuosius nustatymus saugojimo klasės su tiesioginiu susiejimu praleidžiamos, nes šie duomenys vis tiek nebus naudojami.

Kadangi kubernetes planavimo priemonė yra priversta dirbti su galimai pasenusia informacija, nėra garantijos, kad talpa bus prieinama kiekvienu atveju, kai bus sukurtas tomas, tačiau tikimybė, kad ji bus sukurta be pakartotinių bandymų, vis tiek padidėja.

NB Išsamesnę informaciją galite gauti, taip pat saugiai „treniruotis ant kačių stendo“, o susidarius visiškai nesuprantamai situacijai gauti kvalifikuotą techninės pagalbos pagalbą intensyviuose kursuose - Kubernetes bazė vyks rugsėjo 28-30 d., o labiau pažengusiems specialistams Kubernetes Mega spalio 14–16 d.

saugumas

CSIStorageCapacity

CSIStorageCapacity objektai yra vardų erdvėse, kai kiekviena CSI tvarkyklė išleidžiama į savo vardų sritį, rekomenduojama apriboti RBAC teises į CSIStorageCapacity, nes akivaizdu, iš kur gaunami duomenys. „Kubernetes“ vis tiek to netikrina, o tvarkyklės paprastai dedamos į tą pačią vardų erdvę, todėl galiausiai tikimasi, kad tvarkyklės veiks ir neskels neteisingų duomenų (ir čia sugedo mano kortelė, apytiksliai vertėjas pagal barzdotą pokštą)

Bendrosios paskirties trumpalaikiai tomai

Jei naudotojai turi teises sukurti rinkinį (tiesiogiai arba netiesiogiai), jie taip pat galės kurti bendrosios paskirties trumpalaikius tomus, net jei neturi teisės sukurti tomo užklausos. Taip yra todėl, kad RBAC leidimų patikros taikomos valdikliui, kuris sukuria PVC, o ne vartotojui. Tai yra pagrindinis pakeitimas, kurį reikia pridėti į savo sąskaitą, prieš įjungdami šią funkciją grupėse, kuriose nepatikimi vartotojai neturėtų turėti teisių kurti tomų.

Pavyzdys

Atskirai šakelė PMEM-CSI yra visi būtini pakeitimai, norint paleisti Kubernetes 1.19 klasterį QEMU virtualiose mašinose su visomis alfa stadijos funkcijomis. Vairuotojo kodas nepasikeitė, pasikeitė tik diegimas.

Tinkamame kompiuteryje („Linux“, įprastas vartotojas gali naudoti dokininkas, žiūrėk čia išsami informacija) šios komandos parodys klasterį ir įdiegs PMEM-CSI tvarkyklę:

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

Kai viskas veiks, išvestyje bus naudojimo instrukcijos:

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 objektai nėra skirti žmonėms skaityti, todėl reikia atlikti tam tikrą apdorojimą. Golang šablonų filtrai parodys saugojimo klases, šiame pavyzdyje bus rodomas pavadinimas, topologija ir talpa:

$ 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

Vienas objektas turi tokį turinį:

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

Pabandykime sukurti demonstracinę programą su vienu bendrosios paskirties trumpalaikiu tomu. Failo turinys 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

Sukūrę, kaip parodyta aukščiau pateiktose instrukcijose, dabar turime papildomą dėklą ir 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 savininkas – pagal:

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

Tikimasi atnaujinta informacija apie 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

Jei kitai programai reikia daugiau nei 26620Mi, planuotojas neatsižvelgs pmem-csi-pmem-govm-worker1 bet kuriuo atveju.

Kas toliau?

Abi funkcijos vis dar kuriamos. Alfa testavimo metu buvo atidarytos kelios programos. Tobulinimo pasiūlymo nuorodose dokumentuojami darbai, kuriuos reikia atlikti norint pereiti į beta stadiją, taip pat kokios alternatyvos jau buvo apsvarstytos ir atmestos:

Šaltinis: www.habr.com

Добавить комментарий