Ephemeral Volumen mat Späicherkapazitéit Tracking: EmptyDir op Steroiden

Ephemeral Volumen mat Späicherkapazitéit Tracking: EmptyDir op Steroiden

E puer Applikatiounen mussen och Daten späicheren, awer si si ganz bequem mat der Tatsaach datt d'Donnéeën net no engem Neistart gespäichert ginn.

Zum Beispill, Caching Servicer sinn duerch RAM limitéiert, mee kann och Daten plënneren, datt selten ze Stockage benotzt ginn, datt méi lues ass wéi RAM, mat wéineg Impakt op allgemeng Leeschtung. Aner Applikatiounen musse sech bewosst sinn datt et e puer liesen-nëmmen Input an de Dateie ka sinn, wéi Astellungen oder geheime Schlësselen.

Kubernetes huet schonn e puer Zorte ephemeral Bänn, awer hir Funktionalitéit ass limitéiert op dat wat an de K8s implementéiert ass.

Ephemeral Den Handelsvolumen vun CSI erlaabt Kubernetes mat CSI Chauffeuren ze verlängeren fir Ënnerstëtzung fir liicht lokal Bänn ze bidden. Op dës Manéier ass et méiglech ze benotzen arbiträr Strukturen: Astellungen, Geheimnisser, Identifikatiounsdaten, Variabelen, etc. CSI Chauffeuren musse geännert ginn fir dës Kubernetes Feature z'ënnerstëtzen, well et gëtt ugeholl datt regelméisseg standardiséierte Chauffeuren net funktionnéieren - awer et gëtt ugeholl datt sou Volumen op all Node benotzt kënne ginn fir de Pod ausgewielt.

Dëst kann e Problem sinn fir Bänn déi bedeitend Hostressourcen verbrauchen oder fir Lagerung déi nëmmen op e puer Hosten verfügbar ass. Dofir stellt Kubernetes 1.19 zwee nei Alpha-Testvolumen Features vir, déi konzeptuell ähnlech wéi EmptyDir Volumen sinn:

  • allgemeng Zweck ephemeral Bänn;

  • CSI Späicherkapazitéit Tracking.

Virdeeler vun der neier Approche:

  • Stockage kann lokal oder via engem Netz verbonne ginn;

  • Bänn kënnen eng spezifizéiert Gréisst hunn déi net vun der Applikatioun iwwerschratt ka ginn;

  • schafft mat all CSI Treiber déi d'Bestëmmung vu persistent Volumen ënnerstëtzen an (fir Kapazitéit Tracking z'ënnerstëtzen) den Uruff implementéieren GetCapacity;

  • Bänn kënnen e puer initial Daten hunn ofhängeg vum Chauffer an Astellungen;

  • all Standardoperatioune mat engem Volume (e Snapshot erstellen, d'Gréisst änneren, etc.) ginn ënnerstëtzt;

  • Bänn kënne mat all Applikatioun Controller benotzt ginn, datt e Modul oder Volume Spezifizéierung acceptéiert;

  • De Kubernetes Scheduler wielt gëeegent Noden eleng, sou datt et net méi néideg ass fir Scheduler Extensiounen ze versuergen an ze konfiguréieren oder Webhooks z'änneren.

Applikatioun Optiounen

Dofir sinn allgemeng Zweck ephemeral Bänn gëeegent fir déi folgend Benotzungsfäll:

Bestänneg Erënnerung als Ersatz fir RAM fir memcached

Läscht Verëffentlechungen vun memcached dobäi Ënnerstëtzung benotzt persistent Erënnerung (Intel Optane, etc., ca. Iwwersetzer) amplaz regelméisseg RAM. Wann Dir memcached duerch en Applikatiounscontroller ofsetzt, kënnt Dir allgemeng Zweck ephemeral Bänn benotzen fir ze froen datt e Volume vun enger bestëmmter Gréisst vum PMEM mat dem CSI Chauffer zougewisen gëtt, zum Beispill PMEM-CSI.

LVM lokal Stockage als Aarbechtsberäich

Uwendungen, déi mat Daten schaffen, déi méi grouss sinn wéi RAM, kënnen lokal Späichere mat enger Gréisst oder Leeschtungsmetriken erfuerderen, déi regelméisseg EmptyDir Bänn vu Kubernetes net ubidden. Zum Beispill, fir dësen Zweck geschriwwen TopoLVM.

Lies-nëmmen Zougang fir Daten Bänn

D'Allokatioun vun engem Volume kann zu der Schafung vun engem vollen Volume resultéieren wann:

Dës Bänn kënnen am Liesmodus montéiert ginn.

Wéi heescht dat Aarbecht

Allgemeng Zweck Ephemeral Bänn

Eng Schlëssel Feature vun allgemeng Zweck ephemeral Bänn ass déi nei Volumenquell, EphemeralVolumeSource, déi all Felder enthält fir eng Volumen Ufro ze kreéieren (historesch eng persistent Volumen Ufro genannt, PVC). Neie Controller an kube-controller-manager kuckt op d'Pods, déi sou eng Volumenquell kreéieren, a kreéiert dann e PVC fir dës Pods. Fir den CSI Chauffer gesäit dës Ufro d'selwecht aus wéi déi aner, sou datt hei keng speziell Ënnerstëtzung gebraucht gëtt.

Soulaang esou PVCs existéieren, kënne se wéi all aner Ufroen op de Volume benotzt ginn. Besonnesch kënne se als Datenquell referenzéiert ginn wann Dir e Volume kopéiert oder e Snapshot aus engem Volume erstellt. De PVC Objet enthält och den aktuellen Zoustand vum Volume.

D'Nimm vun automatesch erstallt PVCs sinn virdefinéiert: si sinn eng Kombinatioun vum Podnumm an dem Volumennumm, getrennt vun engem Bindestrich. Virdefinéiert Nimm maachen et méi einfach mat der PVC ze interagéieren, well Dir musst net no kucken wann Dir de Podnumm a Volumennumm kennt. De Nodeel ass datt den Numm scho ka benotzt ginn, wat vu Kubernetes festgestallt gëtt an als Resultat ass de Pod blockéiert fir ze starten.

Fir sécherzestellen datt de Volume zesumme mam Pod geläscht gëtt, mécht de Controller eng Ufro un de Volume ënner dem Besëtzer. Wann de Pod geläscht gëtt, funktionnéiert de Standard Drecksammlungsmechanismus, deen souwuel d'Ufro an de Volume läscht.

Ufroe gi vum Stockage Chauffer duerch den normale Mechanismus vun der Späicherklass ugepasst. Och wann Klassen mat direkter a spéider Bindung (aka WaitForFirstConsumer) ënnerstëtzt ginn, fir ephemeral Bänn mécht et Sënn fir ze benotzen WaitForFirstConsumer, da kann de Scheduler souwuel d'Nodeverbrauch wéi och d'Späicherverfügbarkeet berücksichtegen wann Dir en Node auswielt. Eng nei Feature erschéngt hei.

Stockage Kapazitéit Tracking

Typesch huet de Scheduler kee Wëssen iwwer wou den CSI Chauffer de Volume erstellt. Et gëtt och kee Wee fir de Scheduler de Chauffer direkt ze kontaktéieren fir dës Informatioun ze froen. Dofir pollt de Scheduler Node bis en fënnt een op deem Volumen zougänglech sinn (spéit Bindung) oder léisst d'Wiel vun der Plaz ganz un de Chauffer (direkt Bindung).

Nei API CSIStorageCapacity, déi an der Alpha-Bühn ass, erlaabt déi néideg Donnéeën an etcd ze späicheren, sou datt et dem Scheduler verfügbar ass. Am Géigesaz zu der Ënnerstëtzung fir allgemeng Zweck ephemeral Bänn, wann Dir de Chauffer ofsetzt, musst Dir d'Späicherkapazitéit Tracking aktivéieren: external-provisioner soll d'Kapazitéit Informatioune vum Chauffer iwwer normal publizéieren GetCapacity.

Wann de Scheduler e Node fir e Pod mat engem ongebonnene Volumen auswielen muss, deen spéider Bindung benotzt, an de Chauffer huet dës Fonktioun wärend der Deployment aktivéiert andeems de Fändel setzt. CSIDriver.storageCapacity, dann Noden déi net genuch Späicherkapazitéit hunn, ginn automatesch verworf. Dëst funktionnéiert souwuel fir allgemeng Zweck ephemeral a persistent Bänn, awer net fir CSI ephemeral Bänn well hir Parameteren net vu Kubernetes gelies kënne ginn.

Wéi gewinnt ginn direkt verlinkte Bänn erstallt ier Pods geplangt sinn, an hir Plazéierung gëtt vum Späichertreiber gewielt, also wann Dir konfiguréiert external-provisioner Par défaut gi Späicherklassen mat direkter Bindung iwwersprangen, well dës Donnéeë souwisou net benotzt ginn.

Zënter datt de kubernetes Scheduler gezwongen ass mat potenziell verréckten Informatioun ze schaffen, gëtt et keng Garantie datt d'Kapazitéit an all Fall verfügbar ass wann de Volume erstallt gëtt, awer d'Chancen datt et ouni Neiversicht erstallt gëtt, ginn awer erop.

NB Dir kënnt méi detailléiert Informatiounen kréien, wéi och sécher "Praxis op der Kazen Stand", an am Fall vun enger komplett onverständlech Situatioun, qualifizéiert technesch Ënnerstëtzung Hëllef op intensiv Coursen kréien - Kubernetes Base wäert ofgehale ginn 28-30 September, a fir méi fortgeschratt Spezialisten Kubernetes Mega 14-16 Oktober.

Sécherheet

CSIStorageCapacity

CSIStorageCapacity Objekter wunnen an Nummraim; wann Dir all CSI Chauffer a sengem eegene Nummraum ausrollt, ass et recommandéiert d'RBAC Rechter op d'CSIStorageCapacity an deem Raum ze beschränken, well et offensichtlech ass wou d'Daten hierkommen. Kubernetes kontrolléiert dat souwisou net, a meeschtens ginn d'Treiber an dee selwechte Nummraum gesat, sou datt schlussendlech d'Chauffeuren erwaart ginn ze schaffen an net falsch Donnéeën ze publizéieren (an dat ass wou meng Kaart gescheitert ass, ca. Iwwersetzer baséiert op engem bäertege Witz)

Allgemeng Zweck Ephemeral Bänn

Wann d'Benotzer Rechter hunn fir e Pod ze kreéieren (direkt oder indirekt), kënne se och allgemeng Zweck ephemeral Bänn erstellen, och wa se keng Rechter hunn fir eng Ufro op de Volume ze kreéieren. Dëst ass well RBAC Erlaabniskontrollen op de Controller applizéiert ginn deen de PVC erstellt, net fir de Benotzer. Dëst ass d'Haaptännerung fir ze addéieren op Äre Kont, ier Dir dës Fonktioun op Cluster aktivéiert, wou net vertraute Benotzer keng Rechter hunn fir Bänn ze kreéieren.

Beispill:

Trennen Zweck PMEM-CSI enthält all déi néideg Ännerungen fir e Kubernetes 1.19 Cluster bannent QEMU virtuelle Maschinnen mat all de Fonctiounen an der Alpha Etapp ze lafen. De Chauffercode ass net geännert, nëmmen d'Deployment ass geännert.

Op enger gëeegenter Maschinn (Linux, kann en normale Benotzer benotzen Docker, kucken hei Detailer) dës Befehle bréngen de Cluster op an installéiert den PMEM-CSI Treiber:

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

Nodeems alles funktionnéiert, enthält d'Ausgab d'Benotzungsinstruktiounen:

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 Objekter sinn net geduecht fir vu Mënschen gelies ze ginn, sou datt e puer Veraarbechtung erfuerderlech ass. Golang Templatefilter weisen d'Späicherklassen, dëst Beispill weist den Numm, Topologie a Kapazitéit:

$ 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

Een eenzegen Objet huet de folgenden Inhalt:

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

Loosst eis probéieren eng Demo-Applikatioun mat engem eenzegen allgemengen Zweck ephemeral Volumen ze kreéieren. Datei Inhalt 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

No der Schafung, wéi an den Instruktiounen uewen gewisen, hu mir elo en zousätzleche Pod a 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 Besëtzer - ënner:

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

Erwaart aktualiséiert Informatiounen fir 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

Wann eng aner Applikatioun méi brauch wéi 26620Mi, gëtt de Scheduler net berücksichtegt pmem-csi-pmem-govm-worker1 op jiddfer Fall.

Wat d'nächst?

Béid Feature sinn nach ëmmer an der Entwécklung. Verschidde Applikatiounen goufen während Alpha Testen opgemaach. D'Verbesserungsvirschlag Linken dokumentéieren d'Aarbecht déi muss gemaach ginn fir op d'Beta-Bühn ze goen, souwéi wéi eng Alternativen scho berücksichtegt a verworf goufen:

Source: will.com

Setzt e Commentaire