Efemerne jedinice s praćenjem kapaciteta pohrane: EmptyDir na steroidima

Efemerne jedinice s praćenjem kapaciteta pohrane: EmptyDir na steroidima

Nekim aplikacijama također je potrebno pohraniti podatke, ali su dovoljno tolerantne prema tome da podaci neće biti sačuvani nakon ponovnog pokretanja.

Na primjer, servisi za keširanje su ograničeni po operativnoj memoriji, ali također mogu premještati podatke koji se rijetko koriste u pohranu koja radi sporije od operativne memorije, uz malo utjecaja na ukupne performanse. Drugim aplikacijama je potrebno znati da u datotekama mogu biti neki ulazni podaci samo za čitanje, poput postavki ili tajnih ključeva.

U Kubernetesu već postoji nekoliko tipova efemernih volumena, ali je njihova funkcionalnost ograničena onim što je implementirano u K8s.

Efemerni CSIvumi omogućuju širenje Kubernetesa pomoću CSI drajvera za podršku laganim lokalnim volumenima. Na taj način je moguće primijeniti bilo koje strukture: postavke, tajne, identifikacijske podatke, varijable i slično. CSI drajveri trebaju biti implementirani kako bi podržali ovu funkciju Kubernetesa, jer se pretpostavlja da standardizirani drajveri neće raditi — ali se očekuje da se takvi volumeni mogu koristiti na bilo kojem čvoru izabranom za pod.

To može predstavljati problem za volumene koji značajno koriste resurse čvora ili za pohranu dostupnu samo na nekim čvorovima. Stoga su u Kubernetesu 1.19 predstavljene dvije nove funkcije volumena za alpha testiranje, konceptualno slične volumenu EmptyDir:

  • efemerni volumeni opće namjene;

  • praćenje kapaciteta CSI pohrane.

Prednosti novog pristupa:

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

  • volumeni mogu imati zadanu veličinu koja ne može biti prekoračena od strane aplikacije;

  • radi s bilo kojim CSI drajverima koji podržavaju pružanje trajnih volumena i (za podršku praćenju kapaciteta) implementiraju poziv GetCapacity;

  • volumeni mogu imati neke početne podatke, ovisno o drajveru i parametrima;

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

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

  • Kubernetes planirnik sam bira odgovarajuće čvoriće, tako da više nije potrebno osiguravati i podešavati ekstenzije planirnika i menjati webhooks.

Primjene

Time efemerni volumeni opće namjene odgovaraju sljedećim primjenama:

Trajna memorija kao zamjena za radnu memoriju za memcached

Najnovija izdanja memcached-a dodali su podršku za korištenje trajne memorije (Intel Optane i slično, nap. prevoditelja) umjesto obične radne memorije. Pri implementaciji memcached-a putem kontrolera aplikacija moguće je koristiti efemerne volumene opće namjene za zahtjev za izdvajanje volumena određene veličine iz PMEM-a pomoću CSI drajvera, na primjer PMEM-CSI.

Lokalno skladište LVM kao radni prostor

Aplikacije koje rade s podacima čija veličina prelazi veličinu radne memorije mogu zahtijevati lokalno skladište s veličinom ili metriko performansi koje ne mogu pružiti obični EmptyDir volumeni iz Kubernetes-a. Na primjer, za tu svrhu napisan je TopoLVM.

Pristup samo za čitanje za volumene s podacima

Izdvajanje volumena može dovesti do stvaranja popunjenog volumena prilikom:

Ovi volumeni mogu biti montirani u režimu samo za čitanje.

Kako to funkcionira

Efemerni volumeni opće namjene

Ključna karakteristika efemernih volumena opće namjene je novi izvor volumena, EphemeralVolumeSource, koji sadrži sva polja za izradu zahtjeva za volumen (historijski se naziva zahtjev za trajnim volumenom, PVC). Novi kontroler u kube-controller-manager pretražuje podove koji stvaraju takav izvor volumena, a zatim stvara PVC za te podove. Za CSI drajver, ovaj zahtjev izgleda kao i ostali, tako da ovdje nije potrebna posebna podrška.

Dok takvi PVC postoje - mogu se koristiti kao i bilo koji drugi zahtjevi za volumen. Konkretno, mogu biti referenca kao izvor podataka prilikom kopiranja volumena ili stvaranja snimke s volumena. PVC objekt također sadrži trenutno stanje volumena.

Automatski generirana PVC imena su unaprijed određena: to je kombinacija imena pod-a i imena volumena, povezanih crticom. Ova unaprijed definirana imena olakšavaju interakciju s PVC-om, jer se ne mora tražiti ako znate ime pod-a i ime volumena. Nedostatak je taj što ime može već biti korišteno, što Kubernetes otkriva i, kao rezultat, pokretanje pod-a se blokira.

Da biste bili sigurni da se volumen uklanja zajedno s pod-om, kontroler postavlja pod kao vlasnika zahtjeva za volumenom. Kada se pod ukloni, aktivira se standardni mehanizam za čišćenje, koji uklanja i zahtjev i volumen.

Zahtjevima se dodjeljuje pohrambeni vozač kroz uobičajeni mehanizam klase pohrane. Iako se podupiru klase neposredne i kasnije povezanosti (one također WaitForFirstConsumer) za efemerne volumene, ima smisla koristiti WaitForFirstConsumer, tako da planirnik može uzeti u obzir i korištenje čvora i dostupnost pohrane pri odabiru čvora. Ovdje se pojavljuje nova funkcija.

Praćenje kapaciteta pohrane

Obično planirnik nema podatke o tome gdje će CSI vozač stvoriti volumen. Također, planirnik nema mogućnost izravno kontaktirati vozača za zahtjev tih informacija. Stoga planirnik ispituje čvorove dok ne pronađe onaj na kojem su volumeni dostupni (kasnije povezivanje), ili potpuno prepušta odabir mjesta vozaču (neposredno povezivanje).

Novi API CSIStorageCapacity, u alpha fazi, omogućava pohranu potrebnih podataka u etcd, tako da su dostupni planirniku. Za razliku od podrške za efemerne volumene opće namjene, prilikom implementacije vozača potrebno je uključiti praćenje kapaciteta pohrane: external-provisioner mora objaviti informacije o kapacitetu koje dobiva od vozača putem uobičajenog GetCapacity.

Ako planirniku treba odabrati čvor za pod s nepovezanim volumenom koji koristi kasnije povezivanje, a vozač je prilikom implementacije aktivirao ovu funkciju postavljanjem oznake CSIDriver.storageCapacity, automatski će biti isključeni čvorovi koji nemaju dostatnu pohranu. Ovo radi i za efemerne opće namjene, kao i za trajne volumene, ali ne za efemerne CSI volumene, budući da njihovi parametri ne mogu biti očitani od strane Kubernetesa.

Kao i obično, volumeni s neposrednim vezivanjem kreiraju se prije planiranja podova, a njihovo mjesto odabire vozač pohrane, tako da prilikom postavljanja external-provisioner po defaultu se propuštaju klase pohrane s neposrednim vezivanjem, jer ti podaci ionako neće biti korišteni.

Budući da Kubernetes planer mora raditi s potencijalno zastarjelim informacijama, nema jamstva da će kapacitet biti dostupan bilo kada kada se volumen kreira, no, u svakom slučaju, šanse da će biti kreiran bez ponovljenih pokušaja se povećavaju.

Napomena. Detaljnije informacije moći ćete dobiti, kao i sigurno 'vježbati na mačkama' na terenu, a u slučaju zaista nejasne situacije dobiti kvalificiranu pomoć tehničke podrške na intenzivima — Kubernetes Osnovna održat će se 28-30. rujna, a za naprednije stručnjake Kubernetes Mega 14–16. listopada.

Sigurnost

CSIStorageCapacity

CSIStorageCapacity objekti nalaze se u prostorima imena, prilikom instalacije svakog CSI vozača preporučuje se ograničiti RBAC prava za CSIStorageCapacity u tom prostoru, s obzirom na to odakle dolaze podaci. U svakom slučaju, Kubernetes to ne provjerava, a obično se vozači instaliraju u jednom prostoru imena, tako da se na kraju očekuje da će vozači raditi i neće objavljivati netočne podatke (i ovdje mi je karta ispala, napomena prevoditelja inspirirana starim vicem)

Efemerni volumeni opće namjene

Ako korisnici imaju prava za kreiranje poda (izravno ili neizravno) — također će moći kreirati ephemeral volumene opće namjene čak i ako nemaju prava za kreiranje zahtjeva za volumen. A sve to zato što se provjere RBAC prava primjenjuju na kontroler koji kreira PVC, a ne na korisnika. Ovo je osnovna promjena koju treba dodati računu, prije omogućavanja ove funkcije u klasterima, ako nepouzdani korisnici ne smiju imati prava na kreiranje volumena.

Primjer

Odvojena grana u PMEM-CSI sadrži sve potrebne promjene za pokretanje Kubernetes klastera 1.19 unutar QEMU virtualnih mašina sa svim funkcijama koje su u alpha fazi. Kod vozača nije mijenjan, samo se promijenila instalacija.

Na prikladnoj mašini (Linux, običan korisnik može koristiti Docker, pogledajte ovdje detalje) ove komande podignut će klaster i instalirati PMEM-CSI vozača:

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 proradi, ishod će sadržavati upute za korištenje:

Testna klaster je spremna. Prijavite se s [...]pmem-csi/_work/pmem-govm/ssh.0, pokrenite
kubectl nakon prijave. Alternativno, koristite kubectl izravno s
sljedećom varijablom okruženja:
   KUBECONFIG=[...]pmem-csi/_work/pmem-govm/kube.config

secret/pmem-csi-registry-secrets stvoren
secret/pmem-csi-node-secrets stvoren
serviceaccount/pmem-csi-controller stvoren
...
Da isprobate pmem-csi upravljač efemernih volumena:
   cat deploy/kubernetes-1.19/pmem-app-ephemeral.yaml |
   [...]pmem-csi/_work/pmem-govm/ssh.0 kubectl create -f -

Objekti CSIStorageCapacity nisu namijenjeni za ljudsko čitanje, pa je potrebna određena obrada. Korištenjem predložaka na Golangu bit će prikazane klase pohrane; u ovom primjeru prikazat će se ime, topologija 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:       
Annotations:  
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:

Pokušajmo stvoriti demonstracijsku 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 stvaranja, kao što je prikazano u uputama iznad, imali smo 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              
$ 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 je 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 je ažurirana informacija 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 bude potrebno više od 26620Mi, planer to neće uzeti u obzir pmem-csi-pmem-govm-worker1 u svakom slučaju.

Što dalje?

Obje funkcije su još u razvoju. Nekoliko prijava je otvoreno tijekom alpha testiranja. Dokumentira se rad koji treba obaviti kako bi se prešlo u beta fazu, kao i koje su alternative već razmatrane i odbijene:

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster