Efemerni volumeni s praćenjem kapaciteta pohrane: EmptyDir na steroidima

Efemerni volumeni s praćenjem kapaciteta pohrane: EmptyDir na steroidima

Neke aplikacije također trebaju pohranjivati ​​podatke, no sasvim su zadovoljni činjenicom da podaci neće biti spremljeni nakon ponovnog pokretanja.

Na primjer, usluge predmemoriranja ograničene su RAM-om, ali također mogu premjestiti podatke koji se rijetko koriste u pohranu koja je sporija od RAM-a, s malim utjecajem na ukupnu izvedbu. Ostale aplikacije moraju biti svjesne da u datotekama može postojati neki unos samo za čitanje, poput postavki ili tajnih ključeva.

Kubernetes već ima nekoliko vrsta efemerni svesci, ali njihova je funkcionalnost ograničena na ono što je implementirano u K8s.

Prolazno CSI svesci omogućio proširenje Kubernetesa s CSI upravljačkim programima za pružanje podrške za lagane lokalne jedinice. Na ovaj način moguće je koristiti proizvoljne strukture: postavke, tajne, identifikacijski podaci, varijable itd. CSI upravljački programi moraju se modificirati kako bi podržavali ovu Kubernetes značajku, budući da se pretpostavlja da obični standardizirani upravljački programi neće raditi - ali se pretpostavlja da se takvi volumeni mogu koristiti na bilo kojem čvoru odabranom za pod.

Ovo može biti problem za volumene koji troše značajne resurse glavnog računala ili za pohranu koja je dostupna samo na nekim glavnim računalima. Zato Kubernetes 1.19 uvodi dvije nove značajke volumena alfa testiranja koje su konceptualno slične volumenima EmptyDir:

  • efemerni svesci opće namjene;

  • CSI praćenje kapaciteta pohrane.

Prednosti novog pristupa:

  • pohrana može biti lokalna ili povezana putem mreže;

  • volumeni mogu imati određenu veličinu koju aplikacija ne može premašiti;

  • radi sa svim CSI upravljačkim programima koji podržavaju pružanje trajnih volumena i (za podršku praćenja kapaciteta) implementiraju poziv GetCapacity;

  • svezaci mogu imati neke početne podatke ovisno o upravljačkom programu i postavkama;

  • podržane su sve standardne operacije s volumenom (stvaranje snimke, promjena veličine itd.);

  • volumeni se mogu koristiti s bilo kojim aplikacijskim kontrolerom koji prihvaća specifikaciju modula ili volumena;

  • Kubernetes planer sam odabire prikladne čvorove, tako da više nema potrebe davati i konfigurirati proširenja planera ili mijenjati web-dojavnike.

Opcije aplikacije

Stoga su efemerni volumeni opće namjene prikladni za sljedeće slučajeve upotrebe:

Trajna memorija kao zamjena za RAM za memcached

Najnovija izdanja memcached-a dodatnu podršku korištenje trajne memorije (Intel Optane, itd., cca. prevoditelj) umjesto običnog RAM-a. Kada implementirate memcached putem kontrolera aplikacije, možete koristiti efemerne volumene opće namjene da biste zatražili da se volumen određene veličine dodijeli iz PMEM-a pomoću CSI drajvera, na primjer PMEM-CSI.

LVM lokalna pohrana kao radni prostor

Aplikacije koje rade s podacima koji su veći od RAM-a mogu zahtijevati lokalnu pohranu s metrikom veličine ili performansi koju obični EmptyDir volumeni iz Kubernetesa ne mogu pružiti. Na primjer, za ovu svrhu je napisano TopoLVM.

Pristup samo za čitanje za količine podataka

Dodjeljivanje volumena može rezultirati stvaranjem punog volumena kada:

Ovi se volumeni mogu montirati u načinu rada samo za čitanje.

Kako ovo radi

Efemerni svesci opće namjene

Ključna značajka efemernih svezaka opće namjene je novi izvor svezaka, EphemeralVolumeSource, koji sadrži sva polja za stvaranje zahtjeva za volumenom (povijesno nazvan trajni zahtjev za volumenom, PVC). Novi kontroler unutra kube-controller-manager gleda mahune koje stvaraju takav izvor volumena, a zatim stvara PVC za te mahune. Za CSI driver, ovaj zahtjev izgleda isto kao i ostali, tako da ovdje nije potrebna posebna podrška.

Sve dok takvi PVC-ovi postoje, mogu se koristiti kao i svi drugi zahtjevi na volumenu. Konkretno, na njih se može pozivati ​​kao na izvor podataka prilikom kopiranja volumena ili stvaranja snimke iz volumena. PVC objekt također sadrži trenutno stanje volumena.

Imena automatski kreiranih PVC-ova unaprijed su definirana: kombinacija su naziva modula i naziva volumena, odvojenih crticom. Unaprijed definirana imena olakšavaju interakciju s PVC-om jer ga ne morate tražiti ako znate naziv modula i naziv volumena. Nedostatak je to što je naziv možda već u upotrebi, što otkriva Kubernetes i kao rezultat toga blokira se pokretanje modula.

Kako bi osigurao brisanje volumena zajedno s modulom, kontroler šalje zahtjev volumenu pod vlasnikom. Kada se blok izbriše, radi standardni mehanizam za sakupljanje smeća, koji briše i zahtjev i volumen.

Zahtjeve usklađuje upravljački program za pohranu putem normalnog mehanizma klase pohrane. Iako su časovi s trenutnim i kasnim vezanjem (tj WaitForFirstConsumer) su podržani, za efemerne količine ima smisla koristiti WaitForFirstConsumer, tada planer može uzeti u obzir i korištenje čvora i dostupnost pohrane pri odabiru čvora. Ovdje se pojavljuje nova značajka.

Praćenje kapaciteta pohrane

Planer obično ne zna gdje će CSI upravljački program stvoriti volumen. Također ne postoji način da planer izravno kontaktira vozača kako bi zatražio te informacije. Stoga planer ispituje čvorove dok ne pronađe onaj na kojem se može pristupiti volumenima (kasno povezivanje) ili prepušta odabir lokacije u potpunosti upravljačkom programu (trenutačno vezanje).

Novi API CSIStorageCapacity, koji je u alfa fazi, omogućuje pohranjivanje potrebnih podataka u etcd tako da budu dostupni planeru. Za razliku od podrške za efemerne volumene opće namjene, kada implementirate upravljački program, morate omogućiti praćenje kapaciteta pohrane: external-provisioner treba objaviti podatke o kapacitetu primljene od vozača putem normalnog GetCapacity.

Ako planer treba odabrati čvor za pod s nevezanim volumenom koji koristi kasno vezanje, a upravljački program omogućio je ovu značajku tijekom implementacije postavljanjem oznake CSIDriver.storageCapacity, tada će čvorovi koji nemaju dovoljno kapaciteta za pohranu biti automatski odbačeni. Ovo funkcionira i za efemerne i za trajne volumene opće namjene, ali ne i za CSI efemerne volumene jer Kubernetes ne može čitati njihove parametre.

Kao i obično, neposredno povezani volumeni stvaraju se prije nego što se sklopovi zakažu, a njihov položaj odabire upravljački program za pohranu, tako da prilikom konfiguracije external-provisioner Prema zadanim postavkama, klase pohrane s trenutnim vezanjem su preskočene, budući da se ti podaci ionako neće koristiti.

Budući da je kubernetes planer prisiljen raditi s potencijalno zastarjelim informacijama, nema jamstva da će kapacitet biti dostupan u svakom slučaju kada se volumen stvori, no šanse da će se stvoriti bez ponovnih pokušaja svejedno su povećane.

NB Možete dobiti detaljnije informacije, kao i sigurno "vježbati na stajalištu za mačke", au slučaju potpuno neshvatljive situacije, dobiti kvalificiranu tehničku pomoć na intenzivnim tečajevima - Kubernetes baza održat će se 28. – 30. rujna, a za naprednije specijaliste Kubernetes Mega 14.–16. listopada.

sigurnosti

CSIStorageCapacity

CSIStorageCapacity objekti nalaze se u imenskim prostorima; prilikom pokretanja svakog CSI drajvera u vlastitom imenskom prostoru, preporučuje se ograničiti RBAC prava na CSIStorageCapacity u tom prostoru budući da je očito odakle dolaze podaci. Kubernetes to ionako ne provjerava i obično se upravljački programi stavljaju u isti prostor imena, tako da se na kraju očekuje da upravljački programi rade i ne objavljuju netočne podatke (i tu je moja kartica zakazala, cca. prevoditelj na temelju bradatog vica)

Efemerni svesci opće namjene

Ako korisnici imaju prava za stvaranje pod-a (izravno ili neizravno), oni će također moći stvoriti efemerne volumene opće namjene čak i ako nemaju prava za stvaranje zahtjeva na volumenu. To je zato što se provjere dopuštenja RBAC primjenjuju na kontroler koji stvara PVC, a ne na korisnika. Ovo je glavna promjena koju treba dodati na svoj račun, prije omogućavanja ove značajke na klasterima gdje nepouzdani korisnici ne bi trebali imati prava za stvaranje volumena.

Primjer

Odvojeno grana PMEM-CSI sadrži sve potrebne promjene za pokretanje Kubernetes 1.19 klastera unutar QEMU virtualnih strojeva sa svim značajkama u alfa fazi. Kod vozača nije promijenjen, samo se promijenila implementacija.

Na prikladnom stroju (Linux, običan korisnik može koristiti Lučki radnik, pogledaj ovdje detalji) ove naredbe će otvoriti klaster i instalirati PMEM-CSI upravljački program:

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

Nakon što sve radi, izlaz će sadržavati upute za korištenje:

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 nisu predviđeni za čitanje od strane ljudi, pa je potrebna obrada. Filtri predloška Golang prikazat će klase pohrane, ovaj primjer će pokazati naziv, topologiju i 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

Jedan objekt ima sljedeći sadržaj:

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

Pokušajmo stvoriti demo aplikaciju s jednim kratkotrajnim volumenom opće namjene. Sadržaj datoteke 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

Nakon izrade, kao što je prikazano u gornjim uputama, sada imamo dodatnu mahunu i 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 vlasnik - pod:

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

Očekivano ažurirane informacije za 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

Ako neka druga aplikacija treba više od 26620Mi, planer to neće uzeti u obzir pmem-csi-pmem-govm-worker1 u svakom slučaju.

Što je sljedeće?

Obje su značajke još uvijek u razvoju. Tijekom alfa testiranja otvoreno je nekoliko aplikacija. Veze prijedloga poboljšanja dokumentiraju rad koji je potrebno obaviti za prelazak na beta fazu, kao i koje su alternative već razmatrane i odbijene:

Izvor: www.habr.com

Dodajte komentar