Komèsan efemèr ak Suivi Kapasite Depo: EmptyDir sou Estewoyid

Komèsan efemèr ak Suivi Kapasite Depo: EmptyDir sou Estewoyid

Gen kèk aplikasyon tou ki bezwen estoke done, men yo byen konfòtab ak lefèt ke done yo pa pral sove apre yon rekòmanse.

Pou egzanp, sèvis kachèt yo limite pa RAM, men yo ka deplase tou done ki raman itilize nan depo ki pi dousman pase RAM, ak ti enpak sou pèfòmans jeneral. Lòt aplikasyon yo dwe konnen ke ka gen kèk D 'sèlman lekti nan dosye yo, tankou anviwònman oswa kle sekrè.

Kubernetes deja gen plizyè kalite volim efemèr, men fonksyonalite yo limite a sa ki aplike nan K8 yo.

Efemèr Komèsan CSI pèmèt Kubernetes pwolonje ak chofè CSI pou bay sipò pou volim lokal ki lejè. Nan fason sa a li posib pou itilize estrikti abitrè: anviwònman, sekrè, done idantifikasyon, varyab, ak sou sa. Chofè CSI yo dwe modifye pou sipòte karakteristik Kubernetes sa a, paske yo sipoze ke chofè regilye ofisyèl yo pa pral travay - men li sipoze ke volim sa yo ka itilize sou nenpòt node chwazi pou gous la.

Sa a ka yon pwoblèm pou volim ki konsome resous lame enpòtan oswa pou depo ki disponib sèlman sou kèk lame. Se poutèt sa Kubernetes 1.19 prezante de nouvo karakteristik volim tès alfa ki konseptyèlman sanble ak komèsan EmptyDir:

  • volim efemèr objektif jeneral;

  • Suivi kapasite depo CSI.

Avantaj nan nouvo apwòch la:

  • depo ka lokal oswa konekte atravè yon rezo;

  • volim yo ka gen yon gwosè espesifik ki pa ka depase pa aplikasyon an;

  • travay ak nenpòt chofè CSI ki sipòte pwovizyon volim ki pèsistan epi (pou sipòte swivi kapasite) aplike apèl la GetCapacity;

  • volim yo ka gen kèk premye done depann sou chofè a ak anviwònman;

  • tout operasyon estanda ak yon volim (kreye yon snapshot, redimensionnement, elatriye) yo sipòte;

  • volim yo ka itilize ak nenpòt kontwolè aplikasyon ki aksepte yon modil oswa spesifikasyon volim;

  • Planifikatè Kubernetes chwazi nœuds apwopriye poukont li, kidonk pa gen okenn nesesite ankò pou pwovizyon ak konfigirasyon ekstansyon orè oswa modifye webhooks.

Opsyon aplikasyon yo

Se poutèt sa, volim efemèr objektif jeneral yo apwopriye pou ka itilizasyon sa yo:

Memwa ki pèsistan kòm yon ranplasman pou RAM pou memcached

Dènye degaje memcached te ajoute sipò lè l sèvi avèk memwa ki pèsistan (Intel Optane, elatriye, approx. tradiktè) olye de RAM regilye. Lè w ap deplwaye memcached atravè yon kontwolè aplikasyon, ou ka sèvi ak volim efemèr bi jeneral pou mande pou PMEM bay yon volim nan yon gwosè bay lè l sèvi avèk chofè CSI la, pa egzanp. PMEM-CSI.

LVM lokal depo kòm yon espas travay

Aplikasyon ki travay ak done ki pi gwo pase RAM ka mande pou depo lokal ak yon gwosè oswa mezi pèfòmans ke volim EmptyDir regilye soti nan Kubernetes pa ka bay. Pou egzanp, pou objektif sa a li te ekri TopoLVM.

Aksè lekti sèlman pou volim done

Alokasyon yon volim ka lakòz kreyasyon yon volim konplè lè:

Volim sa yo ka monte nan mòd lekti sèlman.

Kijan travay sa a

Objektif jeneral volim efemèr

Yon karakteristik kle nan volim efemèr objektif jeneral se nouvo sous volim, EphemeralVolumeSource, ki gen tout jaden yo kreye yon demann volim (istorikman yo rele yon demann volim ki pèsistan, PVC). Nouvo kontwolè nan kube-controller-manager gade gous yo ki kreye tankou yon sous volim, ak Lè sa a, kreye yon PVC pou gous sa yo. Pou chofè CSI a, demann sa a sanble menm jan ak lòt yo, kidonk pa gen okenn sipò espesyal ki nesesè isit la.

Osi lontan ke PVC sa yo egziste, yo ka itilize tankou nenpòt lòt demann sou volim la. An patikilye, yo ka referans kòm yon sous done lè yo kopye yon volim oswa kreye yon snapshot soti nan yon volim. Objè PVC a gen ladan tou eta aktyèl volim la.

Non PVC otomatikman kreye yo predefini: yo se yon konbinezon non gous la ak non volim, separe pa yon tire. Non prédéfinis fè li pi fasil pou kominike ak PVC a paske ou pa gen pou chèche pou li si ou konnen gous non ak non volim. Inconvénient la se ke non an ka deja itilize, ki se detekte pa Kubernetes ak kòm yon rezilta gous la bloke soti nan kòmanse.

Pou asire ke volim la efase ansanm ak gous la, kontwolè a fè yon demann nan volim ki anba pwopriyetè a. Lè gous la efase, mekanis estanda koleksyon fatra a ap travay, ki efase tou de demann lan ak volim la.

Demann yo matche pa chofè depo a atravè mekanis nòmal klas depo a. Malgre ke klas ak imedya ak an reta obligatwa (aka WaitForFirstConsumer) yo sipòte, pou volim efemèr li fè sans pou itilize WaitForFirstConsumer, Lè sa a, pwogramè a ka konsidere tou de itilizasyon ne ak disponiblite depo lè w ap chwazi yon ne. Yon nouvo karakteristik parèt isit la.

Tracking Kapasite Depo

Tipikman pwogramè a pa gen okenn konesans sou kote chofè CSI a pral kreye volim nan. Pa gen okenn fason tou pou pwogramè a kontakte chofè a dirèkteman pou mande enfòmasyon sa a. Se poutèt sa, pwogramè a sondaj nœuds jiskaske li jwenn youn sou ki komèsan yo ka jwenn aksè (anreta obligatwa) oswa kite chwa a nan kote antyèman nan chofè a (imedya obligatwa).

New API CSIStorageCapacity, ki se nan etap alfa a, pèmèt done ki nesesè yo dwe estoke nan etcd pou ke li disponib nan orè a. Kontrèman ak sipò pou volim efemèr bi jeneral, lè ou deplwaye chofè a, ou dwe pèmèt swiv kapasite depo: external-provisioner ta dwe pibliye enfòmasyon sou kapasite yo resevwa nan men chofè a atravè nòmal GetCapacity.

Si planifikatè a bezwen chwazi yon ne pou yon gous ki gen yon volim dekonekte ki itilize an reta, epi chofè a te pèmèt karakteristik sa a pandan deplwaman lè li mete drapo a. CSIDriver.storageCapacity, Lè sa a, nœuds ki pa gen ase kapasite depo yo pral otomatikman jete. Sa a travay pou tou de volim efemèr ak pèsistan objektif jeneral, men se pa pou volim efemèr CSI paske paramèt yo pa ka li pa Kubernetes.

Kòm dabitid, volim ki lye imedyatman yo kreye anvan gous yo pwograme, epi chofè depo a chwazi plasman yo, kidonk lè w ap konfigirasyon. external-provisioner Pa defo, klas depo ak obligatwa imedya yo sote, paske done sa yo pa pral itilize de tout fason.

Piske pwogramasyon kubernetes fòse yo travay ak enfòmasyon ki kapab demode, pa gen okenn garanti ke kapasite yo ap disponib nan chak ka lè yo kreye volim la, men chans pou yo kreye li san nou pa eseye ankò ap ogmante.

NB Ou ka jwenn plis enfòmasyon detaye, osi byen ke san danje "pratik sou kanpe chat la", epi nan ka yon sitiyasyon konplètman enkonpreyansib, resevwa asistans sipò teknik kalifye nan kou entansif - Kubernetes baz ap fèt sou 28-30 septanm, ak pou espesyalis ki pi avanse Kubernetes Mega 14–16 oktòb.

Безопасность

CSIStorageCapacity

Objè CSIStorageCapacity abite nan espas non lè yo ap woule chak chofè CSI nan espas non pa yo, li rekòmande pou limite dwa RBAC sou CSIStorageCapacity nan espas sa a paske li evidan kote done yo soti. Kubernetes pa tcheke pou sa de tout fason, epi anjeneral chofè yo mete nan menm espas non an, kidonk finalman chofè yo espere travay epi yo pa pibliye done ki pa kòrèk (e sa a se kote kat mwen an echwe, approx. tradiktè ki baze sou yon blag bab)

Objektif jeneral volim efemèr

Si itilizatè yo gen dwa pou kreye yon gous (dirèkteman oswa endirèkteman), yo pral kapab tou kreye volim efemèr pou objektif jeneral menm si yo pa gen dwa pou kreye yon demann sou volim nan. Sa a se paske chèk pèmisyon RBAC yo aplike nan kontwolè a ki kreye PVC a, pa nan itilizatè a. Sa a se chanjman prensipal la ajoute sou kont ou, anvan yo pèmèt karakteristik sa a sou grap kote itilizatè ki pa fè konfyans pa ta dwe gen dwa pou kreye volim.

Egzanp

Separe branch PMEM-CSI gen tout chanjman ki nesesè pou kouri yon gwoup Kubernetes 1.19 andedan machin vityèl QEMU ak tout karakteristik yo nan etap alfa. Kòd chofè a pa chanje, sèlman deplwaman an chanje.

Sou yon machin apwopriye (Linux, yon itilizatè nòmal ka itilize Koupre, gade isit la detay) kòmandman sa yo pral pote gwoup la epi enstale chofè PMEM-CSI la:

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

Apre tout bagay ap travay, pwodiksyon an ap gen enstriksyon pou itilize:

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 -

Objè CSIStorageCapacity yo pa vle di ke moun dwe li, kidonk gen kèk pwosesis obligatwa. Filtè modèl Golang pral montre klas depo yo, egzanp sa a pral montre non, topoloji ak kapasite:

$ 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

Yon sèl objè gen kontni sa a:

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

Ann eseye kreye yon aplikasyon Demo ak yon sèl volim efemèr objektif jeneral. Fichye kontni 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

Apre nou fin kreye, jan yo montre nan enstriksyon ki anwo yo, kounye a nou gen yon gous adisyonèl ak 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

Pwopriyetè PVC - anba:

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

Enfòmasyon yo espere mete ajou pou 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

Si yon lòt aplikasyon bezwen plis pase 26620Mi, orè a pa pral pran an kont pmem-csi-pmem-govm-worker1 nan nenpòt ka.

Ki sa ki nan pwochen?

Tou de karakteristik yo toujou nan devlopman. Plizyè aplikasyon yo te louvri pandan tès alfa. Lyen pwopozisyon amelyorasyon yo dokimante travay ki bezwen fè pou ale nan etap beta a, ansanm ak ki altènativ yo te deja konsidere ak rejte:

Sous: www.habr.com

Add nouvo kòmantè