Efemerne količine s praćenjem kapaciteta pohrane: EmptyDir na steroidima

Efemerne količine s praćenjem kapaciteta pohrane: EmptyDir na steroidima

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

Na primjer, usluge keširanja su ograničene RAM-om, ali također mogu premjestiti podatke koji se rijetko koriste u pohranu koja je sporija od RAM-a, s malim utjecajem na ukupne performanse. Druge aplikacije moraju biti svjesne da u datotekama može postojati neki unos samo za čitanje, kao što su postavke ili tajni ključevi.

Kubernetes već ima nekoliko tipova efemerne količine, ali njihova funkcionalnost je ograničena na ono što je implementirano u K8s.

Efemerno CSI volumes omogućio je da Kubernetes bude proširen CSI drajverima kako bi se pružila podrška za lake lokalne volumene. Na ovaj način je moguće koristiti proizvoljne strukture: postavke, tajne, identifikacijski podaci, varijable, itd. CSI drajveri moraju biti modifikovani da podržavaju ovu Kubernetes funkciju, pošto se pretpostavlja da obični standardizovani drajveri neće raditi - ali se pretpostavlja da se takvi volumeni mogu koristiti na bilo kom čvoru izabranom za pod.

Ovo može biti problem za volumene koji troše značajne resurse hosta ili za pohranu koja je dostupna samo na nekim hostovima. Zato Kubernetes 1.19 uvodi dvije nove funkcije volumena za alfa testiranje koje su konceptualno slične volumenima EmptyDir:

  • efemerni volumeni opće namjene;

  • CSI praćenje kapaciteta skladištenja.

Prednosti novog pristupa:

  • skladište može biti lokalno ili povezano putem mreže;

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

  • radi sa svim CSI drajverima koji podržavaju obezbjeđivanje trajnih volumena i (za podršku praćenja kapaciteta) implementiraju poziv GetCapacity;

  • volumeni mogu imati neke početne podatke u zavisnosti od drajvera i postavki;

  • sve standardne operacije sa volumenom (kreiranje snimka, promjena veličine, itd.) su podržane;

  • volumeni se mogu koristiti sa bilo kojim aplikacijskim kontrolerom koji prihvata specifikaciju modula ili volumena;

  • Kubernetes planer sam odabire odgovarajuće čvorove, tako da više nema potrebe za obezbjeđivanjem i konfiguriranjem ekstenzija planera ili modificiranjem web-huktova.

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 dodata podrška koristeći trajnu memoriju (Intel Optane, itd., cca. prevodilac) umjesto obične RAM memorije. Prilikom postavljanja memcached-a putem kontrolera aplikacije, možete koristiti efemerne volumene opće namjene kako biste zatražili da se volumen određene veličine dodijeli od 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 veličinom ili metrikom performansi koju obični EmptyDir volumeni iz Kubernetesa ne mogu pružiti. Na primjer, u tu svrhu je napisano TopoLVM.

Pristup samo za čitanje za količine podataka

Dodjela volumena može rezultirati stvaranjem punog volumena kada:

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

Kako ovo radi

Efemerne sveske opće namjene

Ključna karakteristika efemernih volumena opće namjene je novi izvor volumena, EphemeralVolumeSource, koji sadrži sva polja za kreiranje zahtjeva za volumen (povijesno nazvan zahtjev za trajnim volumenom, PVC). Novi kontroler unutra kube-controller-manager gleda podove koji stvaraju takav izvor volumena, a zatim kreira PVC za te podove. Za CSI drajver, 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, oni se mogu referencirati kao izvor podataka prilikom kopiranja volumena ili kreiranja snimka iz volumena. PVC objekat takođe sadrži trenutno stanje volumena.

Imena automatski kreiranih PVC-ova su unapred definisana: oni su kombinacija naziva pod i naziva volumena, odvojeni crticom. Unaprijed definirana imena olakšavaju interakciju s PVC-om jer ga ne morate tražiti ako znate naziv pod i naziv volumena. Loša strana je u tome što je ime možda već u upotrebi, što Kubernetes detektuje i kao rezultat toga pod blokira pokretanje.

Kako bi osigurao da se volumen briše zajedno sa podom, kontroler šalje zahtjev volumenu koji je pod vlasnikom. Kada se pod izbriše, radi standardni mehanizam prikupljanja smeća, koji briše i zahtjev i volumen.

Zahtjevi su usklađeni od strane drajvera za skladištenje putem normalnog mehanizma klase skladištenja. Iako su časovi sa trenutnim i kasnim uvezivanjem (aka WaitForFirstConsumer) su podržani, za efemerne volumene ima smisla koristiti WaitForFirstConsumer, tada planer može uzeti u obzir i korištenje čvora i dostupnost memorije prilikom odabira čvora. Ovdje se pojavljuje nova funkcija.

Praćenje kapaciteta pohrane

Obično planer nema znanja o tome gdje će CSI drajver kreirati volumen. Takođe ne postoji način da planer direktno kontaktira vozača kako bi zatražio ove informacije. Stoga planer ispituje čvorove sve dok ne pronađe onaj na kojem se volumenima može pristupiti (kasno povezivanje) ili prepusti izbor lokacije u potpunosti drajveru (trenutno povezivanje).

Novo API CSIStorageCapacity, koji je u alfa fazi, omogućava da se potrebni podaci pohrane u etcd tako da budu dostupni planeru. Za razliku od podrške za efemerne volumene opće namjene, kada implementirate drajver, morate omogućiti praćenje kapaciteta pohrane: external-provisioner treba objaviti informacije o kapacitetu primljene od vozača putem normalnog GetCapacity.

Ako planer treba da izabere čvor za pod sa nevezanim volumenom koji koristi kasno povezivanje, a upravljački program je omogućio ovu funkciju tokom implementacije postavljanjem zastavice CSIDriver.storageCapacity, tada će čvorovi koji nemaju dovoljno skladišnog kapaciteta biti automatski odbačeni. Ovo radi i za efemerne i trajne volumene opšte namjene, ali ne i za CSI efemerne volumene jer Kubernetes ne može pročitati njihove parametre.

Kao i obično, odmah povezani volumeni se kreiraju prije zakazivanja podova, a njihov smještaj bira drajver za pohranu, tako da prilikom konfiguriranja external-provisioner Prema zadanim postavkama, klase skladištenja s trenutnim povezivanjem se preskaču, jer se ovi podaci ionako neće koristiti.

Pošto je kubernetes planer primoran da radi s potencijalno zastarjelim informacijama, nema garancije da će kapacitet biti dostupan u svakom slučaju kada se volumen kreira, ali su šanse da će biti kreiran bez ponovnih pokušaja ipak povećane.

NB Možete dobiti detaljnije informacije, kao i bezbedno „vežbati na štandu za mačke“, a u slučaju potpuno neshvatljive situacije dobiti kvalifikovanu tehničku podršku na intenzivnim kursevima - Kubernetes Base održaće se od 28. do 30. septembra, a za naprednije specijaliste Kubernetes Mega 14–16. oktobar.

Sigurnost

CSIStorageCapacity

Objekti CSIStorageCapacity nalaze se u imenskim prostorima; kada se svaki CSI drajver postavlja u vlastitom imenskom prostoru, preporučuje se ograničiti RBAC prava na CSIStorageCapacity u tom prostoru jer je očigledno odakle podaci dolaze. Kubernetes ionako ne provjerava ovo, a drajveri se obično stavljaju u isti imenski prostor, tako da se na kraju očekuje da drajveri rade i ne objavljuju netačne podatke (i tu je moja kartica otkazala, cca. prevodilac na osnovu šale sa bradom)

Efemerne sveske opće namjene

Ako korisnici imaju prava da kreiraju pod (direktno ili indirektno), oni će takođe moći da kreiraju efemerne volumene opšte namene čak i ako nemaju prava da kreiraju zahtev na tom volumenu. To je zato što se RBAC provjere dozvola primjenjuju na kontroler koji kreira PVC, a ne na korisnika. Ovo je glavna promjena koju treba dodati na svoj račun, prije omogućavanja ove funkcije na klasterima u kojima nepouzdani korisnici ne bi trebali imati prava za kreiranje volumena.

Primjer:

Odvojite se twig PMEM-CSI sadrži sve potrebne promjene za pokretanje Kubernetes 1.19 klastera unutar QEMU virtuelnih mašina sa svim funkcijama u alfa fazi. Šifra drajvera se nije promijenila, samo je promijenjena implementacija.

Na odgovarajućoj mašini (Linux, običan korisnik može da koristi doker, pogledaj ovdje detalji) ove naredbe će pokrenuti klaster i instalirati drajver PMEM-CSI:

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 upotrebu:

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 -

Objekti CSIStorageCapacity nisu namijenjeni da ih čitaju ljudi, pa je potrebna određena obrada. Filtri predložaka Golang će pokazati klase skladištenja, 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 objekat 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 kreirati demo aplikaciju s jednim efemernim 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 kreiranja, kao što je prikazano u gornjim uputama, sada imamo dodatni pod 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

Vlasnik PVC-a - ispod:

$ 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 drugoj aplikaciji treba više od 26620Mi, planer neće uzeti u obzir pmem-csi-pmem-govm-worker1 u svakom slučaju.

Što je sljedeće?

Obje karakteristike su još u razvoju. Nekoliko aplikacija je otvoreno tokom alfa testiranja. Linkovi predloga poboljšanja dokumentuju posao koji treba da se uradi da bi se prešlo u beta fazu, kao i koje su alternative već razmotrene i odbijene:

izvor: www.habr.com

Dodajte komentar