Ժամանակավոր ծավալներ՝ պահպանման հզորության հետագծմամբ. EmptyDir ստերոիդների վրա

Ժամանակավոր ծավալներ՝ պահպանման հզորության հետագծմամբ. EmptyDir ստերոիդների վրա

Որոշ հավելվածներ նույնպես պետք է պահեն տվյալներ, բայց նրանց համար բավականին հարմար է այն փաստը, որ տվյալները չեն պահպանվի վերագործարկումից հետո:

Օրինակ, քեշավորման ծառայությունները սահմանափակված են RAM-ով, բայց կարող են նաև տեղափոխել այն տվյալները, որոնք հազվադեպ են օգտագործվում RAM-ից ավելի դանդաղ պահեստավորման համար, ինչը փոքր ազդեցություն ունի ընդհանուր կատարողականի վրա: Այլ հավելվածները պետք է տեղյակ լինեն, որ ֆայլերում կարող են լինել միայն կարդալու մուտքագրումներ, ինչպիսիք են կարգավորումները կամ գաղտնի ստեղները:

Kubernetes-ն արդեն ունի մի քանի տեսակներ վաղանցիկ ծավալներ, սակայն դրանց ֆունկցիոնալությունը սահմանափակվում է K8-ներում ներդրվածով:

Ժամանակավոր CSI հատորները թույլ տվեց Kubernetes-ը ընդլայնել CSI վարորդների հետ՝ աջակցություն տրամադրելու թեթև լոկալ ծավալներին: Այս կերպ հնարավոր է օգտագործել կամայական կառույցներկարգավորումներ, գաղտնիքներ, նույնականացման տվյալներ, փոփոխականներ և այլն: CSI դրայվերները պետք է փոփոխվեն Kubernetes-ի այս ֆունկցիան աջակցելու համար, քանի որ ենթադրվում է, որ սովորական ստանդարտացված դրայվերները չեն աշխատի, բայց ենթադրվում է, որ նման ծավալները կարող են օգտագործվել pod-ի համար ընտրված ցանկացած հանգույցի վրա:

Սա կարող է խնդիր լինել այն ծավալների համար, որոնք սպառում են զգալի հյուրընկալող ռեսուրսներ կամ պահեստավորման համար, որը հասանելի է միայն որոշ հոսթորդների համար: Ահա թե ինչու Kubernetes 1.19-ը ներկայացնում է երկու նոր ալֆա թեստավորման ծավալի առանձնահատկություններ, որոնք կոնցեպտուալ առումով նման են EmptyDir հատորներին.

  • ընդհանուր նշանակության ժամանակավոր ծավալներ;

  • CSI պահեստավորման կարողությունների հետևում:

Նոր մոտեցման առավելությունները.

  • պահեստը կարող է լինել տեղական կամ միացված ցանցի միջոցով.

  • հատորները կարող են ունենալ նշված չափս, որը չի կարող գերազանցվել հավելվածի կողմից.

  • աշխատում է ցանկացած CSI վարորդների հետ, որոնք աջակցում են մշտական ​​ծավալների տրամադրմանը և (հզորությունների հետևմանն աջակցելու համար) իրականացնում են զանգը GetCapacity;

  • ծավալները կարող են ունենալ որոշ նախնական տվյալներ՝ կախված վարորդից և կարգավորումներից.

  • բոլոր ստանդարտ գործողությունները ծավալով (պատկերի ստեղծում, չափափոխում և այլն) աջակցվում են.

  • Ծավալները կարող են օգտագործվել ցանկացած հավելվածի կարգավորիչի հետ, որն ընդունում է մոդուլ կամ ծավալի ճշգրտում.

  • Kubernetes-ի ժամանակացույցն ինքնուրույն ընտրում է համապատասխան հանգույցներ, ուստի այլևս կարիք չկա ժամանակացույցի ընդլայնումներ տրամադրելու և կազմաձևելու կամ վեբ-կեռիկներ փոփոխելու:

Դիմումի ընտրանքներ

Հետևաբար, ընդհանուր նշանակության ժամանակավոր ծավալները հարմար են հետևյալ օգտագործման դեպքերի համար.

Մշտական ​​հիշողություն որպես RAM-ի փոխարինում memcached-ի համար

Memcached-ի վերջին թողարկումները ավելացված աջակցություն օգտագործելով մշտական ​​հիշողություն (Intel Optane և այլն, մոտ. թարգմանիչ) սովորական RAM-ի փոխարեն: Ծրագրի կարգավորիչի միջոցով memcached-ը տեղակայելիս կարող եք օգտագործել ընդհանուր նշանակության ժամանակավոր ծավալներ՝ խնդրելով, որ տվյալ չափի ծավալը հատկացվի PMEM-ից՝ օգտագործելով CSI դրայվերը, օրինակ, PMEM-CSI.

LVM տեղական պահեստավորումը որպես աշխատանքային տարածք

Հավելվածները, որոնք աշխատում են RAM-ից ավելի տվյալների հետ, կարող են պահանջել տեղային հիշողություն՝ չափի կամ կատարողականի չափման չափանիշով, որը Kubernetes-ի սովորական EmptyDir հատորները չեն կարող ապահովել: Օրինակ, այս նպատակով գրված էր TopoLVM.

Միայն կարդալու հասանելիություն տվյալների ծավալների համար

Հատորի բաշխումը կարող է հանգեցնել ամբողջական ծավալի ստեղծմանը, երբ.

Այս ծավալները կարող են տեղադրվել միայն կարդալու ռեժիմում:

Ինչպես է այն աշխատում

Ընդհանուր նշանակության էֆեմերալ ծավալներ

Ընդհանուր նշանակության ժամանակավոր ծավալների հիմնական հատկանիշը նոր ծավալի աղբյուրն է, EphemeralVolumeSource, որը պարունակում է բոլոր դաշտերը՝ ծավալի հարցում ստեղծելու համար (պատմականորեն կոչվում է մշտական ​​ծավալի հարցում՝ PVC): Նոր վերահսկիչ kube-controller-manager նայում է պատիճներին, որոնք ստեղծում են նման ծավալի աղբյուր, այնուհետև ստեղծում է ՊՎՔ այդ պատիճների համար: CSI վարորդի համար այս հարցումը նույնն է, ինչ մյուսները, ուստի այստեղ հատուկ աջակցություն կարիք չկա:

Քանի դեռ այդպիսի PVC-ները գոյություն ունեն, դրանք կարող են օգտագործվել, ինչպես ցանկացած այլ հարցում ձայնի վրա: Մասնավորապես, դրանք կարող են հիշատակվել որպես տվյալների աղբյուր՝ հատորը պատճենելիս կամ հատորից նկար ստեղծելիս: PVC օբյեկտը պարունակում է նաև ծավալի ներկայիս վիճակը:

Ինքնաբերաբար ստեղծված PVC-ների անունները նախապես սահմանված են. դրանք պատիճ անվան և ծավալի անվան համակցություն են՝ բաժանված գծիկով: Նախապես սահմանված անունները հեշտացնում են ՊՎՔ-ի հետ փոխգործակցությունը, քանի որ այն փնտրելու կարիք չկա, եթե գիտեք պատիճ անվանումը և ծավալի անվանումը: Բացասական կողմն այն է, որ անունը կարող է արդեն օգտագործվել, ինչը հայտնաբերվում է Kubernetes-ի կողմից, և արդյունքում pod-ը արգելափակվում է սկսելու համար:

Ապահովելու համար, որ ձայնը ջնջվում է պատի հետ միասին, կարգավորիչը հարցում է կատարում սեփականատիրոջ տակ գտնվող ձայնին: Երբ պատիճը ջնջվում է, աշխատում է աղբահանության ստանդարտ մեխանիզմը, որը ջնջում է և՛ հարցումը, և՛ ծավալը։

Հարցումները համընկնում են պահեստավորման վարորդի կողմից պահեստավորման դասի նորմալ մեխանիզմի միջոցով: Թեև անհապաղ և ուշ պարտադիր պարտադիր դասեր (aka WaitForFirstConsumer) աջակցվում են, ժամանակավոր ծավալների համար իմաստ ունի օգտագործել WaitForFirstConsumer, ապա ժամանակացույցը կարող է հաշվի առնել ինչպես հանգույցի օգտագործումը, այնպես էլ պահեստավորման առկայությունը հանգույց ընտրելիս: Այստեղ հայտնվում է նոր գործառույթ:

Պահպանման հզորության հետևում

Սովորաբար ժամանակացույցը չգիտի, թե որտեղ է CSI դրայվերը ստեղծելու ձայնը: Չկա նաև հնարավորություն, որ ժամանակացույցը ուղղակիորեն կապվի վարորդի հետ՝ խնդրելու այս տեղեկությունը: Հետևաբար, ժամանակացույցը հարցումներ է կատարում հանգույցների վրա, մինչև գտնի մեկը, որի վրա կարելի է մուտք գործել հատորներ (ուշ կապում) կամ թողնում է գտնվելու վայրի ընտրությունը ամբողջությամբ վարորդին (անմիջական կապում):

Նոր API CSIStorageCapacity, որը գտնվում է ալֆա փուլում, թույլ է տալիս անհրաժեշտ տվյալները պահել etcd-ում, որպեսզի դրանք հասանելի լինեն ժամանակացույցին։ Ի տարբերություն ընդհանուր նշանակության ժամանակավոր ծավալների աջակցության, երբ տեղադրում եք վարորդը, դուք պետք է միացնեք պահեստային կարողությունների հետագծումը. external-provisioner պետք է հրապարակի վարորդից ստացված կարողությունների մասին տեղեկատվությունը նորմալ միջոցով GetCapacity.

Եթե ​​ժամանակացույցը պետք է ընտրի հանգույց առանց կապի ծավալով պատիվի համար, որն օգտագործում է ուշ կապում, և վարորդը միացրել է այս գործառույթը տեղակայման ժամանակ՝ դնելով դրոշակը: CSIDriver.storageCapacity, ապա այն հանգույցները, որոնք չունեն բավարար պահեստային հզորություն, ավտոմատ կերպով կհեռացվեն: Սա աշխատում է և՛ ընդհանուր նշանակության ժամանակավոր, և՛ մշտական ​​ծավալների համար, բայց ոչ CSI ժամանակավոր ծավալների համար, քանի որ դրանց պարամետրերը չեն կարող կարդալ Kubernetes-ի կողմից:

Ինչպես միշտ, անմիջապես կապակցված հատորները ստեղծվում են նախքան պատիճների պլանավորումը, և դրանց տեղադրումն ընտրվում է պահեստավորման վարորդի կողմից, այնպես որ կարգավորելիս external-provisioner Լռելյայնորեն, անհապաղ կապով պահեստավորման դասերը բաց են թողնվում, քանի որ այս տվյալները, այնուամենայնիվ, չեն օգտագործվի:

Քանի որ kubernetes ժամանակացույցը ստիպված է աշխատել պոտենցիալ հնացած տեղեկատվության հետ, երաշխիք չկա, որ հզորությունը հասանելի կլինի ամեն դեպքում, երբ ծավալը ստեղծվի, բայց հավանականությունը, որ այն կստեղծվի առանց կրկնակի փորձերի, այնուամենայնիվ, մեծանում է:

NB Դուք կարող եք ավելի մանրամասն տեղեկություններ ստանալ, ինչպես նաև ապահով «պարապել կատուների տակդիրի վրա», իսկ բոլորովին անհասկանալի իրավիճակի դեպքում ստանալ որակյալ տեխնիկական աջակցություն ինտենսիվ դասընթացներում. Կուբերնետես բազա կանցկացվի սեպտեմբերի 28-30-ը, իսկ ավելի առաջադեմ մասնագետների համար Kubernetes Mega հոկտեմբերի 14–16.

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

CSISstorage Capacity

CSIStorageCapacity օբյեկտները բնակվում են անունների տարածություններում; յուրաքանչյուր CSI դրայվեր իր սեփական անվանատարածքում գլորելիս խորհուրդ է տրվում սահմանափակել RBAC իրավունքները CSIStorageCapacity-ի վրա այդ տարածքում, քանի որ ակնհայտ է, թե որտեղից են գալիս տվյալները: Kubernetes-ը, այնուամենայնիվ, դա չի ստուգում, և սովորաբար դրայվերները տեղադրվում են նույն անվանատարածքում, այնպես որ, ի վերջո, ակնկալվում է, որ վարորդները աշխատեն և սխալ տվյալներ չհրապարակեն (և այստեղ է, որ իմ քարտը ձախողվեց, մոտ. թարգմանիչ՝ հիմնված մորուքավոր կատակի վրա)

Ընդհանուր նշանակության էֆեմերալ ծավալներ

Եթե ​​օգտատերերն իրավունք ունեն ստեղծելու pod (ուղղակի կամ անուղղակիորեն), նրանք նաև կկարողանան ստեղծել ընդհանուր նշանակության ժամանակավոր հատորներ, նույնիսկ եթե չունեն ձայնի վրա հարցում ստեղծելու իրավունք: Դա պայմանավորված է նրանով, որ RBAC-ի թույլտվության ստուգումները կիրառվում են վերահսկիչի վրա, որը ստեղծում է PVC-ը, այլ ոչ թե օգտվողին: Սա ավելացման հիմնական փոփոխությունն է ձեր հաշվին, նախքան այս հատկությունը միացնելն այն կլաստերներում, որտեղ անվստահելի օգտվողները չպետք է ունենան հատորներ ստեղծելու իրավունք:

Օրինակ

Առանձին մասնաճյուղ PMEM-CSI-ն պարունակում է բոլոր անհրաժեշտ փոփոխությունները՝ QEMU վիրտուալ մեքենաների ներսում Kubernetes 1.19 կլաստերը գործարկելու համար՝ ալֆա փուլի բոլոր հատկանիշներով: Վարորդի կոդը չի փոխվել, փոխվել է միայն տեղակայումը։

Համապատասխան մեքենայի վրա (Linux, նորմալ օգտագործողը կարող է օգտագործել դոկեր, նայել այստեղ մանրամասներ) այս հրամանները կբերեն կլաստերը և կտեղադրեն PMEM-CSI դրայվերը.

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

Ամեն ինչ աշխատելուց հետո ելքը կպարունակի օգտագործման հրահանգներ.

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 օբյեկտները նախատեսված չեն մարդկանց կողմից կարդալու համար, ուստի որոշակի մշակում է պահանջվում: Golang կաղապարի զտիչները ցույց կտան պահեստավորման դասերը, այս օրինակը ցույց կտա անունը, տոպոլոգիան և հզորությունը.

$ 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

Մեկ օբյեկտն ունի հետևյալ բովանդակությունը.

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

Փորձենք ստեղծել ցուցադրական հավելված մեկ ընդհանուր նշանակության ժամանակավոր ծավալով: Ֆայլի բովանդակությունը 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

Ստեղծելուց հետո, ինչպես ցույց է տրված վերը նշված հրահանգներում, մենք այժմ ունենք լրացուցիչ պատիճ և 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 սեփականատերը - տակ:

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

Սպասվում է թարմացված տեղեկատվություն համար 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

Եթե ​​մեկ այլ հավելվածի կարիք ունի ավելի քան 26620Mi, ապա ժամանակացույցը հաշվի չի առնի pmem-csi-pmem-govm-worker1 ամեն դեպքում.

Ինչ հաջորդ?

Երկու հատկանիշները դեռ մշակման փուլում են: Ալֆա թեստավորման ժամանակ բացվել են մի քանի հավելվածներ։ Բարելավման առաջարկի հղումները փաստում են այն աշխատանքը, որը պետք է կատարվի բետա փուլ անցնելու համար, ինչպես նաև, թե որ այլընտրանքներն արդեն դիտարկվել և մերժվել են.

Source: www.habr.com

Добавить комментарий