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 engem passenden Auto (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

Kaaft zouverlĂ€sseg Hosting fir Site mat DDoS Schutz, VPS VDS Server đŸ”„ Kaaft zouverlĂ©issegt WebsĂ€ithosting mat DDoS-Schutz, VPS VDS Server | ProHoster