ÄŖslaicÄ«gi apjomi ar krātuves ietilpÄ«bas izsekoÅ”anu: EmptyDir uz steroÄ«diem

ÄŖslaicÄ«gi apjomi ar krātuves ietilpÄ«bas izsekoÅ”anu: EmptyDir uz steroÄ«diem

Dažām lietojumprogrammām arÄ« ir jāglabā dati, taču tās ir diezgan apmierinātas ar to, ka pēc restartÄ“Å”anas dati netiks saglabāti.

Piemēram, keÅ”atmiņas pakalpojumus ierobežo RAM, taču tie var arÄ« pārvietot reti izmantotos datus uz krātuvi, kas ir lēnāka nekā RAM, maz ietekmējot kopējo veiktspēju. Citām lietojumprogrammām ir jāņem vērā, ka failos var bÅ«t tikai lasāma ievade, piemēram, iestatÄ«jumi vai slepenās atslēgas.

Kubernetes jau ir vairāki veidi īslaicīgi sējumi, taču to funkcionalitāte ir ierobežota ar to, kas ir ieviests K8s.

ÄŖslaicÄ«ga CSI apjomi ļāva Kubernetes paplaÅ”ināt ar CSI draiveriem, lai nodroÅ”inātu atbalstu vieglajiem vietējiem sējumiem. Tādā veidā ir iespējams izmantot patvaļīgas struktÅ«ras: iestatÄ«jumi, noslēpumi, identifikācijas dati, mainÄ«gie un tā tālāk. CSI draiveri ir jāmaina, lai atbalstÄ«tu Å”o Kubernetes lÄ«dzekli, jo tiek pieņemts, ka parastie standartizētie draiveri nedarbosies, taču tiek pieņemts, ka Ŕādus apjomus var izmantot jebkurā podam atlasÄ«tajā mezglā.

Tā var bÅ«t problēma sējumiem, kas patērē ievērojamus resursdatora resursus, vai krātuvei, kas ir pieejama tikai dažos resursdatoros. Tāpēc Kubernetes 1.19 ievieÅ” divus jaunus alfa testÄ“Å”anas apjoma lÄ«dzekļus, kas konceptuāli ir lÄ«dzÄ«gi EmptyDir sējumiem:

  • vispārējas nozÄ«mes Ä«slaicÄ«gi sējumi;

  • CSI krātuves jaudas izsekoÅ”ana.

Jaunās pieejas priekŔrocības:

  • krātuve var bÅ«t lokāla vai savienota ar tÄ«klu;

  • apjomiem var bÅ«t noteikts izmērs, ko pieteikums nevar pārsniegt;

  • darbojas ar visiem CSI draiveriem, kas atbalsta pastāvÄ«gu sējumu nodroÅ”ināŔanu un (lai atbalstÄ«tu jaudas izsekoÅ”anu) ievieÅ” zvanu GetCapacity;

  • sējumos var bÅ«t daži sākotnējie dati atkarÄ«bā no draivera un iestatÄ«jumiem;

  • tiek atbalstÄ«tas visas standarta darbÄ«bas ar apjomu (momentuzņēmuma izveide, izmēru maiņa utt.);

  • sējumus var izmantot ar jebkuru lietojumprogrammu kontrolleri, kas pieņem moduļa vai apjoma specifikāciju;

  • Kubernetes plānotājs pats atlasa piemērotus mezglus, tāpēc vairs nav nepiecieÅ”ams nodroÅ”ināt un konfigurēt plānotāja paplaÅ”inājumus vai modificēt tÄ«mekļa aizÄ·eres.

Lietojumprogrammas

Tāpēc vispārējas nozÄ«mes Ä«slaicÄ«gie sējumi ir piemēroti Ŕādiem lietoÅ”anas gadÄ«jumiem:

Pastāvīgā atmiņa kā RAM aizstājējs atmiņā saglabātajam

Jaunākie memcached laidieni pievienots atbalsts izmantojot pastāvÄ«go atmiņu (Intel Optane utt., apm. tulkotājs) parastās RAM vietā. Izvietojot memcached, izmantojot lietojumprogrammu kontrolleri, varat izmantot vispārējas nozÄ«mes Ä«slaicÄ«gus sējumus, lai pieprasÄ«tu, lai no PMEM tiktu pieŔķirts noteikta lieluma apjoms, izmantojot CSI draiveri, piemēram, PMEM-CSI.

LVM lokālā krātuve kā darbvieta

Lietojumprogrammām, kas strādā ar datiem, kas ir lielāki par operatÄ«vo atmiņu, var bÅ«t nepiecieÅ”ama vietējā krātuve ar tādu izmēru vai veiktspējas metriku, kādu nevar nodroÅ”ināt parastie Kubernetes EmptyDir sējumi. Piemēram, Å”im nolÅ«kam tika rakstÄ«ts TopoLVM.

Tikai lasīŔanas piekļuve datu apjomiem

Sējuma pieŔķirÅ”anas rezultātā var izveidot pilnu sējumu, ja:

Å os sējumus var uzstādÄ«t tikai lasÄ«Å”anas režīmā.

Kā tas darbojas

Vispārējas nozīmes īslaicīgi sējumi

Vispārēja pielietojuma Ä«slaicÄ«gu sējumu galvenā iezÄ«me ir jaunais apjoma avots, EphemeralVolumeSource, kurā ir visi lauki, lai izveidotu apjoma pieprasÄ«jumu (vēsturiski saukts par pastāvÄ«gu apjoma pieprasÄ«jumu, PVC). Jauns kontrolieris kube-controller-manager apskata pākstis, kas rada Ŕādu apjoma avotu, un pēc tam izveido Ŕīm pākstÄ«m PVC. CSI draiverim Å”is pieprasÄ«jums izskatās tāpat kā citi, tāpēc Å”eit nav nepiecieÅ”ams Ä«paÅ”s atbalsts.

Kamēr pastāv Ŕādi PVC, tos var izmantot tāpat kā jebkurus citus skaļuma pieprasÄ«jumus. Konkrēti, uz tiem var atsaukties kā uz datu avotu, kopējot sējumu vai veidojot momentuzņēmumu no sējuma. PVC objekts satur arÄ« paÅ”reizējo tilpuma stāvokli.

Automātiski izveidoto PVC nosaukumi ir iepriekÅ” definēti: tie ir apgabala nosaukuma un sējuma nosaukuma kombinācija, kas atdalÄ«ta ar defisi. IepriekÅ” definēti nosaukumi atvieglo mijiedarbÄ«bu ar PVC, jo jums tas nav jāmeklē, ja zināt aplikuma nosaukumu un sējuma nosaukumu. NegatÄ«vā puse ir tāda, ka nosaukums jau var tikt izmantots, ko Kubernetes atklāj un rezultātā pods tiek bloķēts.

Lai nodroÅ”inātu, ka sējums tiek dzēsts kopā ar podziņu, kontrolleris iesniedz pieprasÄ«jumu Ä«paÅ”niekam piederoÅ”ajam sējumam. Kad pods tiek dzēsts, darbojas standarta atkritumu savākÅ”anas mehānisms, kas dzÄ“Å” gan pieprasÄ«jumu, gan sējumu.

PieprasÄ«jumus saskaņo krātuves draiveris, izmantojot parasto krātuves klases mehānismu. Lai gan nodarbÄ«bas ar tÅ«lÄ«tēju un vēlu iesieÅ”anu (aka WaitForFirstConsumer) tiek atbalstÄ«ti, Ä«slaicÄ«giem sējumiem ir jēga izmantot WaitForFirstConsumer, tad plānotājs, atlasot mezglu, var ņemt vērā gan mezgla lietojumu, gan krātuves pieejamÄ«bu. Å eit parādās jauna funkcija.

Krātuves ietilpības izsekoŔana

Parasti plānotājs nezina, kur CSI draiveris izveidos sējumu. Plānotājs arÄ« nevar tieÅ”i sazināties ar vadÄ«tāju, lai pieprasÄ«tu Å”o informāciju. Tāpēc plānotājs aptaujā mezglus, lÄ«dz atrod tādu, kurā var piekļūt sējumiem (vēlÄ«na saistÄ«Å”ana), vai atstāj atraÅ”anās vietas izvēli pilnÄ«bā draivera ziņā (tÅ«lÄ«tēja saistÄ«Å”ana).

Jauns API CSIStorageCapacity, kas atrodas alfa stadijā, ļauj nepiecieÅ”amos datus saglabāt etcd, lai tie bÅ«tu pieejami plānotājam. AtŔķirÄ«bā no atbalsta vispārÄ«giem Ä«slaicÄ«giem sējumiem, izvietojot draiveri, ir jāiespējo krātuves ietilpÄ«bas izsekoÅ”ana: external-provisioner jāpublicē jaudas informācija, kas saņemta no vadÄ«tāja, izmantojot parasto GetCapacity.

Ja plānotājam ir jāatlasa mezgls podam ar nesaistÄ«tu sējumu, kas izmanto vēlu saistÄ«Å”anu, un draiveris ir iespējojis Å”o lÄ«dzekli izvietoÅ”anas laikā, iestatot karogu CSIDriver.storageCapacity, tad mezgli, kuriem nav pietiekami daudz krātuves, tiks automātiski izmesti. Tas darbojas gan vispārÄ«giem Ä«slaicÄ«giem, gan pastāvÄ«giem sējumiem, bet ne CSI Ä«slaicÄ«gajiem sējumiem, jo ā€‹ā€‹Kubernetes nevar nolasÄ«t to parametrus.

Kā parasti, uzreiz saistÄ«tie sējumi tiek izveidoti pirms aplikumu plānoÅ”anas, un to izvietojumu izvēlas krātuves draiveris, tāpēc konfigurējot external-provisioner Pēc noklusējuma krātuves klases ar tÅ«lÄ«tēju saistÄ«Å”anu tiek izlaistas, jo Å”ie dati tik un tā netiks izmantoti.

Tā kā kubernetes plānotājs ir spiests strādāt ar potenciāli novecojuÅ”u informāciju, nav garantijas, ka jauda bÅ«s pieejama ikvienā gadÄ«jumā, kad tiks izveidots sējums, taču iespēja, ka tā tiks izveidota bez atkārtojumiem, tomēr palielinās.

NB SÄ«kāku informāciju var iegÅ«t, kā arÄ« droÅ”i ā€œtrenēties kaÄ·u stendāā€, un pavisam nesaprotamas situācijas gadÄ«jumā saņemt kvalificētu tehniskā atbalsta palÄ«dzÄ«bu intensÄ«vajos kursos - Kubernetes bāze notiks 28.-30.septembrÄ«, un progresÄ«vākiem speciālistiem Kubernetes Mega 14.ā€“16.oktobris.

DroŔība

CSIStorageCapacity

CSIStorageCapacity objekti atrodas nosaukumvietās; izlaižot katru CSI draiveri savā nosaukumvietā, ieteicams ierobežot RBAC tiesÄ«bas uz CSIStorageCapacity Å”ajā telpā, jo ir skaidrs, no kurienes tiek iegÅ«ti dati. Kubernetes tik un tā nepārbauda, ā€‹ā€‹un parasti draiveri tiek ievietoti vienā nosaukumvietā, tāpēc galu galā ir paredzēts, ka draiveri darbosies un nepublicēs nepareizus datus (un Å”eit mana karte neizdevās, apm. tulkotājs, pamatojoties uz bārdainu joku)

Vispārējas nozīmes īslaicīgi sējumi

Ja lietotājiem ir tiesÄ«bas izveidot aplikumu (tieÅ”i vai netieÅ”i), viņi varēs izveidot arÄ« vispārējas nozÄ«mes Ä«slaicÄ«gus sējumus, pat ja viņiem nav tiesÄ«bu izveidot pieprasÄ«jumu par sējumu. Tas ir tāpēc, ka RBAC atļauju pārbaudes tiek piemērotas kontrolierim, kas izveido PVC, nevis lietotājam. Å Ä«s ir galvenās izmaiņas, kas jāpievieno uz jÅ«su kontu, pirms Ŕīs funkcijas iespējoÅ”anas klasteros, kur neuzticamiem lietotājiem nevajadzētu bÅ«t tiesÄ«bām izveidot sējumus.

Piemērs

AtseviŔķi zars PMEM-CSI satur visas nepiecieÅ”amās izmaiņas, lai palaistu Kubernetes 1.19 klasteru QEMU virtuālajās maŔīnās ar visām alfa stadijā esoÅ”ajām funkcijām. VadÄ«tāja kods nav mainÄ«jies, ir mainÄ«jusies tikai izvietoÅ”ana.

Piemērotā datorā (Linux, parasts lietotājs var izmantot dokers, Skaties Å”eit detaļas), Ŕīs komandas parādÄ«s klasteru un instalēs 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

Kad viss darbosies, izvadā būs lietoŔanas instrukcijas:

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 objekti nav paredzēti cilvēku lasÄ«Å”anai, tāpēc ir nepiecieÅ”ama apstrāde. Golang veidņu filtri parādÄ«s krātuves klases, Å”ajā piemērā tiks parādÄ«ts nosaukums, topoloÄ£ija un ietilpÄ«ba:

$ 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

Vienam objektam ir Ŕāds saturs:

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

Mēģināsim izveidot demonstrācijas lietojumprogrammu ar vienu vispārējas nozīmes īslaicīgu sējumu. Faila saturs 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ēc izveidoÅ”anas, kā parādÄ«ts iepriekÅ” sniegtajos norādÄ«jumos, mums tagad ir papildu pods un 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 Ä«paÅ”nieks ā€“ zem:

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

Paredzams atjaunināta informācija par 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

Ja citai lietojumprogrammai ir nepiecieÅ”ams vairāk nekā 26620Mi, plānotājs neņems vērā pmem-csi-pmem-govm-worker1 jebkurā gadÄ«jumā.

Ko tālāk?

Abas funkcijas joprojām tiek izstrādātas. Alfa testÄ“Å”anas laikā tika atvērtas vairākas lietojumprogrammas. Uzlabojumu priekÅ”likuma saitēs ir dokumentēts darbs, kas jāpaveic, lai pārietu uz beta stadiju, kā arÄ« tas, kuras alternatÄ«vas jau ir izskatÄ«tas un noraidÄ«tas:

Avots: www.habr.com

Pievieno komentāru