Volumên Efemeral Bi Şopandina Kapasîteya Hilberînê: EmptyDir li ser Steroids

Volumên Efemeral Bi Şopandina Kapasîteya Hilberînê: EmptyDir li ser Steroids

Hin serîlêdan jî hewce ne ku daneyan hilînin, lê ew ji vê yekê rehet in ku dê piştî destpêkirina nûvekirinê dane neyên hilanîn.

Mînakî, karûbarên caching ji hêla RAM-ê ve têne sînorkirin, lê di heman demê de dikare daneyên ku kêm kêm têne bikar anîn ji bo hilanîna ku ji RAM-ê hêdîtir e, bi bandorek hindik li ser performansa giştî veguhezîne. Pêdivî ye ku serîlêdanên din zanibin ku dibe ku di pelan de hin têketinek tenê-xwendewar hebe, wek mîheng an bişkojkên veşartî.

Kubernetes jixwe çend celeb hene cildên efemeral, lê fonksiyona wan bi ya ku di K8-an de tête bicîh kirin sînorkirî ye.

Ephemeral cildên CSI destûr da ku Kubernetes bi ajokarên CSI re were dirêj kirin da ku piştgirî ji cildên herêmî yên sivik re peyda bike. Bi vî awayî ew gengaz e ku bikar bînin strukturên keyfî: mîheng, raz, daneyên nasnameyê, guherbar û hwd. Pêdivî ye ku ajokarên CSI werin guheztin da ku piştgirî bidin vê taybetmendiya Kubernetes, ji ber ku tê texmîn kirin ku ajokarên standardkirî yên birêkûpêk dê nexebitin - lê tê texmîn kirin ku cildên weha dikarin li ser her girêkek ku ji bo podê hatî hilbijartin were bikar anîn.

Dibe ku ev ji bo cildên ku çavkaniyên mêvandar ên girîng dixwe an ji bo hilanîna ku tenê li ser hin mêvandaran peyda dibe pirsgirêkek be. Ji ber vê yekê Kubernetes 1.19 du taybetmendiyên nû yên voltaja ceribandina alpha ku ji hêla têgînî ve dişibin cildên EmptyDir de destnîşan dike:

  • cildên efemeral armanca giştî;

  • şopandina kapasîteya hilanînê CSI.

Avantajên rêbaza nû:

  • hilanîn dikare herêmî be an bi torê ve girêdayî be;

  • cild dikarin xwedan mezinahiyek diyarkirî bin ku ji hêla serîlêdanê ve nayê derbas kirin;

  • bi her ajokarên CSI re dixebite ku piştgirî dide dabînkirina cildên domdar û (ji bo piştgirîkirina şopandina kapasîteyê) bangê bicîh tîne GetCapacity;

  • cild dikarin hin daneyên destpêkê li gorî ajoker û mîhengan hebin;

  • Hemî operasyonên standard ên bi dengek (çêkirina wêneyek, mezinahî, hwd.) têne piştgirî kirin;

  • cild dikare bi her kontrolkerek serîlêdanê ya ku modulek an taybetmendiyek volgê qebûl dike were bikar anîn;

  • Plansazker Kubernetes bi serê xwe girêkên guncan hildibijêre, ji ber vê yekê êdî hewcedarî bi peydakirin û mîhengkirina pêvekên plansazker an jî guheztina webhookan nîne.

Vebijarkên serlêdanê

Ji ber vê yekê, cildên efemeral ên gelemperî ji bo rewşên karanîna jêrîn maqûl in:

Bîra domdar wekî şûna RAM-ê ji bo memcached

Daxuyaniyên herî dawî yên memcached piştgirî zêde kirin bikaranîna bîranîna domdar (Intel Optane, hwd., approx. wergêr) li şûna RAM-a birêkûpêk. Dema ku memcached bi navgîniya kontrolkerek serîlêdanê ve tê veqetandin, hûn dikarin cildên domdar ên mebesta gelemperî bikar bînin da ku daxwaz bikin ku cildek bi pîvanek diyarkirî ji PMEM-ê bi karanîna ajokera CSI-ê veqetînin, mînakî PMEM-CSI.

Hilberîna herêmî ya LVM wekî cîhek xebatê

Serlêdanên ku bi daneya ku ji RAM-ê mezintir e dixebitin dibe ku hilanîna herêmî bi pîvanek an pîvanek performansê hewce bike ku cildên birêkûpêk EmptyDir ji Kubernetes nekarin peyda bikin. Mînak ji bo vê armancê hatiye nivîsandin TopoLVM.

Gihîştina tenê-xwendin ji bo cildên daneyê

Veqetandina cildê dikare bibe sedema afirandina cildek tije dema ku:

Van cild dikarin di moda tenê-xwendinê de werin danîn.

Çawa ev karê

Cildên Ephemeral Armanca Giştî

Taybetmendiyek bingehîn a cildên demkî yên mebesta gelemperî çavkaniya cildê nû ye, EphemeralVolumeSource, hemî qadan dihewîne da ku daxwazek voltê biafirîne (ji hêla dîrokî ve jê re daxwazek volume ya domdar, PVC tê gotin). Kontrolkerek nû tê de kube-controller-manager li pêlên ku çavkaniyek bi vî rengî ya volume diafirînin dinêre, û dûv re ji bo wan potan PVC diafirîne. Ji bo ajokerê CSI, ev daxwaz wekî yên din xuya dike, ji ber vê yekê li vir piştgiriyek taybetî hewce nake.

Heya ku PVCyên wusa hebin, ew dikarin mîna daxwazên din ên li ser dengdanê werin bikar anîn. Bi taybetî, ew dikarin wekî çavkaniyek daneyê dema ku cildek kopî dikin an wêneyek ji cildekê çêbikin têne referans kirin. Tişta PVC di heman demê de rewşa heyî ya volume jî dihewîne.

Navên PVC-yên ku bixweber têne afirandin ji pêş de têne diyar kirin: ew berhevokek navê pod û navê volumê ne, ku bi xêzikek veqetandî ne. Navên pêşwext danûstendina bi PVC-ê re hêsantir dike ji ber ku hûn ne hewce ne ku hûn lê bigerin ger hûn navê pod û navê cildê zanibin. Nerazîbûn ev e ku dibe ku nav jixwe tê bikar anîn, ku ji hêla Kubernetes ve tê tespît kirin û di encamê de pod ji destpêkirinê tê asteng kirin.

Ji bo ku pê ewle bibe ku cild bi podê re were jêbirin, kontrolker daxwazek ji cildê di binê xwedan de dike. Dema ku pod tê jêbirin, mekanîzmaya berhevkirina çopê ya standard dixebite, ku hem daxwaz û hem jî deng jêbirin.

Daxwaz ji hêla ajokerê hilanînê ve bi mekanîzmaya normal a çîna hilanînê ve têne hev kirin. Her çend dersên bi girêdana tavil û dereng (aka WaitForFirstConsumer) têne piştgirî kirin, ji bo cildên efemeral karanîna wê watedar e WaitForFirstConsumer, wê hingê plansaz dikare hem karanîna girêk û hem jî hebûna hilanînê dema ku girêkek hilbijêrin bihesibîne. Taybetmendiyek nû li vir xuya dike.

Şopandina Kapasîteya Storage

Bi gelemperî plansazker haya wê tune ku ajokarê CSI-ê li ku derê dê deng biafirîne. Di heman demê de rêyek tune ku plansazker rasterast bi ajokerê re têkilî dayne da ku vê agahiyê bixwaze. Ji ber vê yekê, plansazker li ser girêkan dipirse heya ku yek bibîne ku tê de cild dikarin werin gihîştin (girêdana dereng) an jî bijartina cîhê bi tevahî ji ajokerê re dihêle (girêdana tavilê).

API CSIStorageCapacity, ku di qonaxa alpha de ye, dihêle ku daneyên pêwîst di etcd de bêne hilanîn da ku ew ji plansazker re peyda bibe. Berevajî piştgirîya ji bo cildên demkî yên gelemperî, gava ku hûn ajokerê bicîh dikin, divê hûn şopandina kapasîteya hilanînê çalak bikin: external-provisioner divê agahdariya kapasîteya ku ji ajokerê hatî wergirtin bi riya normal biweşîne GetCapacity.

Ger plansaz hewce bike ku girêkek ji bo podek bi dengek negirêdayî ya ku girêdana dereng bikar tîne hilbijêre, û ajokar bi danîna ala vê taybetmendiyê di dema danînê de çalak kir. CSIDriver.storageCapacity, wê gavê girêkên ku têra wan kapasîteya hilanînê nîne dê bixweber werin avêtin. Ev hem ji bo cildên domdar û hem jî yên domdar ên mebesta gelemperî dixebite, lê ne ji bo cildên domdar ên CSI ji ber ku parametreyên wan ji hêla Kubernetes ve nayên xwendin.

Wekî gelemperî, cildên tavilê yên girêdayî berî ku pod werin plansaz kirin têne afirandin, û cîhkirina wan ji hêla ajokera hilanînê ve tê hilbijartin, ji ber vê yekê dema ku mîheng bikin external-provisioner Ji hêla xwerû ve, dersên hilanînê yên bi girêdana tavilê têne paşguh kirin, ji ber ku ev dane dê her weha neyê bikar anîn.

Ji ber ku plansazkerê kubernetes neçar e ku bi agahdariya potansiyel-ji-rojê re bixebite, garantî tune ku dema ku cild were afirandin dê kapasîteyê di her rewşê de peyda bibe, lê dîsa jî şansê ku ew ê bêyî ceribandinan were afirandin zêde dibe.

NB Hûn dikarin agahdariya berfirehtir bistînin, û hem jî bi ewlehî "li ser rawestgeha pisîkan pratîk bikin", û di rewşek bi tevahî nefêmkirî de, di qursên zirav de arîkariya piştgiriya teknîkî ya jêhatî bistînin - Bingeha Kubernetes dê di 28-30 îlonê de, û ji bo pisporên bêtir pêşkeftî pêk were Kubernetes Mega 14-16 Cotmehê.

Ewlekariyê

CSIStorageCapacity

Tiştên CSIStorageCapacity di nav cîhên navan de dimînin, dema ku her ajokerek CSI di cîhê navên xwe de vedihewîne, tê pêşniyar kirin ku mafên RBAC li ser CSIStorageCapacity li wê cîhê sînordar bikin ji ber ku eşkere ye ku dane ji ku tê. Kubernetes bi her awayî vê yekê kontrol nake, û bi gelemperî ajokar di heman navan de têne danîn, ji ber vê yekê di dawiyê de tê hêvîkirin ku ajokar bixebitin û daneyên xelet neweşînin (û li vir qerta min têk çû, approx. wergêr li ser henekeke rih)

Cildên Ephemeral Armanca Giştî

Ger bikarhêner xwedî mafên afirandina podek (rasterast an nerasterast) bin, ew ê di heman demê de nikaribin cildên efemeral ên gelemperî biafirînin jî heke mafên wan tunebin ku daxwazek li ser cildê biafirînin. Ev ji ber ku kontrolên destûra RBAC li ser kontrolkerê ku PVC diafirîne, ne ji bikarhêner re têne sepandin. Ev guhertina sereke ye ku lê zêde bike hesabê we, berî çalakkirina vê taybetmendiyê li ser komên ku divê bikarhênerên nebawer ne xwediyê mafên afirandina cildan bin.

Nimûne:

Veqetî liq PMEM-CSI hemî guheztinên pêwîst dihewîne da ku komek Kubernetes 1.19 di hundurê makîneyên virtual QEMU bi hemî taybetmendiyên di qonaxa alpha de bimeşîne. Koda ajokerê nehatiye guhertin, tenê veqetandin hatiye guhertin.

Li ser makîneyek maqûl (Linux, bikarhênerek normal dikare bikar bîne Docker, binêre vir hûrgulî) ev ferman dê komê derxînin û ajokera PMEM-CSI saz bikin:

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

Piştî ku her tişt kar dike, encam dê rêwerzên ji bo bikaranînê hebe:

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 -

Tiştên CSIStorageCapacity nayên xwestin ku ji hêla mirovan ve werin xwendin, ji ber vê yekê hin pêvajoyek pêdivî ye. Parzûnên şablonê Golang dê dersên hilanînê nîşan bidin, ev mînak dê nav, topolojî û kapasîteyê nîşan bide:

$ 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

Tiştek yekane naveroka jêrîn heye:

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

Ka em biceribînin ku serîlêdanek demo bi yek volgayek efemeral a armanca gelemperî biafirînin. Naveroka pelê 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

Piştî afirandinê, wekî ku di rêwerzên li jor de hatî destnîşan kirin, me naha pêvek û PVC-ya zêde heye:

$ 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

Xwediyê PVC - li jêr:

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

Ji bo agahdariya nûvekirî ya hêvîkirî 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

Ger serîlêdanek din ji 26620Mi zêdetir hewce bike, plansaz dê hesab neke pmem-csi-pmem-govm-worker1 di her rewşê de.

Çi ye?

Her du taybetmendî hîn di pêşveçûnê de ne. Di dema ceribandina alpha de gelek serîlêdan hatin vekirin. Zencîreyên pêşnûmeya çêtirkirinê xebata ku divê were kirin da ku derbasî qonaxa betayê bibe, û her weha kîjan alternatîf berê hatine hesibandin û red kirin belge dikin:

Source: www.habr.com

Add a comment