Ephemeral Volumes with Storage Capacity Tracking: EmptyDir on Steroids

Ephemeral Volumes with Storage Capacity Tracking: EmptyDir on Steroids

ڪجهه ايپليڪيشنن کي ڊيٽا کي ذخيرو ڪرڻ جي ضرورت آهي، پر اهي حقيقت سان ڪافي آرام سان آهن ته ڊيٽا ٻيهر شروع ٿيڻ کان پوء محفوظ نه ٿيندي.

مثال طور، ڪيشنگ جون خدمتون RAM پاران محدود هونديون آهن، پر ڊيٽا کي منتقل ڪري سگھن ٿيون جيڪا اسٽوريج لاءِ استعمال ٿئي ٿي جيڪا RAM کان سست آهي، مجموعي ڪارڪردگيءَ تي ٿورڙي اثر سان. ٻين ايپليڪيشنن کي آگاهي ٿيڻ جي ضرورت آهي ته فائلن ۾ صرف پڙهڻ لاء ڪجهه ان پٽ ٿي سگهي ٿي، جهڙوڪ سيٽنگون يا ڳجهي چيڪ.

Kubernetes اڳ ۾ ئي ڪيترائي قسم آهن عارضي حجم، پر انهن جي ڪارڪردگي محدود آهي جيڪا K8s ۾ لاڳو ڪئي وئي آهي.

عارضي CSI حجم позволили расширять Kubernetes с помощью драйверов CSI для обеспечения поддержки легковесных локальных томов. Этим способом возможно применять خودمختياري جوڙجڪ: سيٽنگون، راز، سڃاڻپ ڊيٽا، متغير، وغيره. CSI ڊرائيورن کي لازمي طور تي تبديل ڪيو وڃي ته جيئن هن Kubernetes خصوصيت کي سپورٽ ڪري، ڇاڪاڻ ته اهو فرض ڪيو ويو آهي ته باقاعده معياري ڊرائيور ڪم نه ڪندا - پر اهو فرض ڪيو ويو آهي ته اهڙي مقدار کي استعمال ڪري سگھجن ٿيون پوڊ لاءِ چونڊيل ڪنهن به نوڊ تي.

اهو حجمن لاءِ مسئلو ٿي سگهي ٿو جيڪي اهم ميزبان وسيلن کي استعمال ڪن ٿا يا اسٽوريج لاءِ جيڪي صرف ڪجهه ميزبانن تي موجود آهن. اهو ئي سبب آهي ته ڪبرنيٽس 1.19 متعارف ڪرايو ٻه نوان الفا ٽيسٽنگ حجم خاصيتون جيڪي تصوراتي طور تي EmptyDir حجم سان ملندڙ جلندڙ آهن:

  • عام مقصد ephemeral حجم؛

  • CSI اسٽوريج جي گنجائش ٽريڪنگ.

نئين طريقي جا فائدا:

  • اسٽوريج مقامي يا نيٽ ورڪ ذريعي ڳنڍيل ٿي سگهي ٿو؛

  • حجم هڪ مخصوص سائيز ٿي سگھي ٿو جيڪا ايپليڪيشن کان وڌي نه ٿي سگھي؛

  • ڪنهن به CSI ڊرائيورن سان ڪم ڪري ٿو جيڪي مسلسل مقدار جي فراهمي جي حمايت ڪن ٿا ۽ (ظرفيت جي ٽريڪنگ کي سپورٽ ڪرڻ لاءِ) ڪال لاڳو ڪن ٿا GetCapacity;

  • حجمن ۾ ڊرائيور ۽ سيٽنگن جي لحاظ کان ڪجھ شروعاتي ڊيٽا ٿي سگھي ٿي؛

  • سڀني معياري عملن کي حجم سان گڏ (سنيپ شاٽ ٺاهڻ، ريزائزنگ، وغيره) جي حمايت ڪئي وئي آهي؛

  • حجم ڪنهن به ايپليڪيشن ڪنٽرولر سان استعمال ڪري سگھجن ٿيون جيڪو ماڊل يا حجم جي وضاحت کي قبول ڪري ٿو؛

  • ڪبرنيٽس شيڊولر پاڻ تي مناسب نوڊس چونڊيندو آهي، تنهنڪري هاڻي شيڊيولر ايڪسٽينشن کي ترتيب ڏيڻ ۽ ترتيب ڏيڻ يا ويب هِڪ کي تبديل ڪرڻ جي ڪا ضرورت ناهي.

ائپليڪيشن جا اختيار

تنهن ڪري، عام مقصد ephemeral حجم هيٺين استعمال جي ڪيسن لاء مناسب آهن:

مستقل ميموري ميمڪيڊ لاءِ رام جي متبادل طور

memcached جي تازي رليز شامل ڪيل سپورٽ مسلسل ياداشت استعمال ڪندي (Intel Optane، وغيره، لڳ ڀڳ مترجم) باقاعده رام جي بدران. جڏهن ايپليڪيشن ڪنٽرولر ذريعي ميمڪيچ کي ترتيب ڏيڻ، توهان عام مقصد جي عارضي حجم استعمال ڪري سگهو ٿا درخواست ڪرڻ لاءِ ته ڏنل سائيز جو مقدار مختص ڪيو وڃي PMEM کان CSI ڊرائيور استعمال ڪندي، مثال طور. PMEM-CSI.

LVM مقامي اسٽوريج هڪ ڪم اسپيس جي طور تي

ايپليڪيشنون جيڪي ڊيٽا سان ڪم ڪن ٿيون جيڪي RAM کان وڏي هونديون آهن شايد مقامي اسٽوريج جي ضرورت هجي سائيز يا ڪارڪردگي جي ماپ سان جيڪي باقاعده EmptyDir حجم Kubernetes کان مهيا نه ڪري سگھن ٿيون. مثال طور، هن مقصد لاء اهو لکيو ويو آهي TopoLVM.

ڊيٽا جي مقدار لاء صرف پڙهڻ جي رسائي

حجم جي تخصيص جي نتيجي ۾ مڪمل حجم پيدا ٿي سگھي ٿي جڏھن:

اهي حجم صرف پڙهڻ واري موڊ ۾ نصب ٿي سگهن ٿا.

ڪيئن هن ڪم ڪندو

عام مقصد Ephemeral حجم

عام مقصد جي عارضي حجم جي هڪ اهم خصوصيت نئين حجم جو ذريعو آهي، EphemeralVolumeSource, سڀني شعبن تي مشتمل هڪ حجم درخواست ٺاهڻ لاء (تاريخي طور تي هڪ مسلسل حجم جي درخواست، PVC سڏيو ويندو آهي). نئون ڪنٽرولر ۾ kube-controller-manager پوڊس کي ڏسندو آهي جيڪي اهڙي حجم جو ذريعو ٺاهيندا آهن، ۽ پوء انهن پوڊز لاء هڪ PVC ٺاهي ٿو. CSI ڊرائيور لاء، هي درخواست ٻين وانگر ساڳيو نظر اچي ٿو، تنهنڪري هتي ڪا خاص مدد جي ضرورت ناهي.

جيستائين اهڙيون PVCs موجود آهن، اهي استعمال ڪري سگھجن ٿيون جهڙوڪ حجم تي ڪنهن ٻئي درخواستون. خاص طور تي، اهي حوالو ڪري سگھجن ٿا ڊيٽا ماخذ جي طور تي جڏهن حجم ڪاپي ڪري يا حجم مان هڪ سنيپ شاٽ ٺاهي. PVC اعتراض پڻ حجم جي موجوده حالت تي مشتمل آهي.

پاڻمرادو ٺاهيل PVCs جا نالا اڳ ۾ بيان ڪيا ويا آهن: اهي پوڊ جي نالي ۽ حجم جي نالي جو هڪ مجموعو آهن، هڪ هائفن سان الڳ ٿيل آهن. اڳواٽ بيان ڪيل نالن کي PVC سان رابطو ڪرڻ آسان بڻائي ٿو ڇو ته توهان کي ان کي ڳولڻ جي ضرورت ناهي جيڪڏهن توهان پوڊ جو نالو ۽ حجم جو نالو ڄاڻو ٿا. نقصان اهو آهي ته اهو نالو شايد اڳ ۾ ئي استعمال ۾ هجي، جيڪو ڪبرنيٽس پاران معلوم ڪيو ويو آهي ۽ نتيجي ۾ پوڊ کي شروع ٿيڻ کان روڪيو ويو آهي.

انهي کي يقيني بڻائڻ لاءِ ته حجم کي پوڊ سان گڏ ختم ڪيو ويو آهي، ڪنٽرولر مالڪ جي هيٺان حجم کي درخواست ڪري ٿو. جڏهن پوڊ کي ختم ڪيو ويندو آهي، معياري ڪچرو گڏ ڪرڻ وارو ميڪانيزم ڪم ڪري ٿو، جيڪو درخواست ۽ حجم ٻنهي کي ختم ڪري ٿو.

اسٽوريج ڪلاس جي عام ميکانيزم ذريعي اسٽوريج ڊرائيور طرفان درخواستون ملن ٿيون. جيتوڻيڪ ڪلاس فوري ۽ دير سان پابند ٿيل (اڪا WaitForFirstConsumer) جي حمايت ڪئي وئي آهي، غير معمولي حجمن لاء اهو استعمال ڪرڻ جو احساس آهي WaitForFirstConsumer، پوءِ شيڊولر ٻنهي نوڊ استعمال ۽ اسٽوريج جي دستيابي تي غور ڪري سگھي ٿو جڏهن نوڊ چونڊيو. هتي هڪ نئين خاصيت ظاهر ٿئي ٿي.

اسٽوريج جي صلاحيت ٽريڪنگ

عام طور تي شيڊولر کي ڪا به ڄاڻ نه آهي ته CSI ڊرائيور ڪٿي حجم ٺاهيندو. هن معلومات جي درخواست ڪرڻ لاء سڌو سنئون ڊرائيور سان رابطو ڪرڻ لاء شيڊولر لاء ڪو طريقو ناهي. تنهن ڪري، شيڊولر پولنگ نوڊس جيستائين اهو هڪ نه ڳولي ٿو جنهن تي حجم تائين رسائي ٿي سگهي ٿي (دير سان پابند) يا جڳهه جي چونڊ کي مڪمل طور تي ڊرائيور ڏانهن ڇڏي ٿو (فوري پابند).

نئين API CSIStorageCapacity، جيڪو الفا اسٽيج ۾ آهي، ضروري ڊيٽا کي وغيره ۾ ذخيرو ڪرڻ جي اجازت ڏئي ٿو ته جيئن اهو شيڊولر وٽ موجود هجي. عام مقصد جي عارضي حجم جي حمايت جي برعڪس، جڏهن توهان ڊرائيور کي ترتيب ڏيو ٿا، توهان کي لازمي طور تي رکڻ جي صلاحيت جي ٽريڪنگ کي فعال ڪرڻ گهرجي: external-provisioner عام ذريعي ڊرائيور کان حاصل ڪيل صلاحيت جي معلومات کي شايع ڪرڻ گهرجي GetCapacity.

جيڪڏهن شيڊيولر کي ضرورت آهي ته هڪ پوڊ لاءِ هڪ نوڊ چونڊيو جيڪو اڻ بائونڊ حجم سان آهي جيڪو دير سان بائنڊنگ استعمال ڪري ٿو، ۽ ڊرائيور هن فيچر کي ڊيپلائي ڪرڻ دوران پرچم کي ترتيب ڏيندي فعال ڪيو. CSIDriver.storageCapacity، پوءِ نوڊس جيڪي ڪافي اسٽوريج جي صلاحيت نه رکندا آھن پاڻمرادو رد ڪيا ويندا. ھي ڪم ٻنھي عام مقصد جي ھميشه ۽ مستقل حجمن لاءِ، پر سي ايس آءِ جي عارضي حجمن لاءِ نه، ڇاڪاڻ ته انھن جا پيرا ميٽر ڪبرنيٽس پاران پڙھي نه سگھندا آھن.

عام طور تي، فوري طور تي ڳنڍيل حجم پيدا ٿيڻ کان اڳ پوڊ مقرر ڪيا ويا آهن، ۽ انهن جي جڳهه کي اسٽوريج ڊرائيور طرفان چونڊيو ويندو آهي، تنهنڪري جڏهن ترتيب ڏيڻ external-provisioner ڊفالٽ طور، اسٽوريج ڪلاس کي فوري طور تي پابند ڪيو ويو آهي، ڇو ته هي ڊيٽا ڪنهن به صورت ۾ استعمال نه ڪيو ويندو.

جيئن ته ڪبرنيٽس شيڊولر کي ممڪن طور تي پراڻي معلومات سان ڪم ڪرڻ تي مجبور ڪيو ويو آهي، ان جي ڪا به ضمانت نه آهي ته گنجائش هر صورت ۾ موجود هوندي جڏهن حجم ٺاهي ويندي، پر ان جي باوجود ان جي ٻيهر ڪوششن جي پيدا ٿيڻ جا موقعا وڌي ويا آهن.

اين بي توهان وڌيڪ تفصيلي معلومات حاصل ڪري سگهو ٿا، انهي سان گڏ محفوظ طور تي "ڪئٽس اسٽينڊ تي مشق"، ۽ مڪمل طور تي ناقابل فهم صورتحال جي صورت ۾، سخت ڪورسز تي قابل ٽيڪنيڪل سپورٽ مدد حاصل ڪريو - ڪبرنيٽس جو بنياد سيپٽمبر 28-30 تي منعقد ڪئي ويندي، ۽ وڌيڪ ترقي يافته ماهرن لاء ڪبرنيٽس ميگا آڪٽوبر 14-16.

حفاظت

CSISstorageCapacity

CSIStorageCapacity شيون نالن جي اسپيس ۾ رهن ٿيون؛ جڏهن هر CSI ڊرائيور کي ان جي پنهنجي نالي واري جاءِ ۾ رول آئوٽ ڪيو وڃي ٿو، اها سفارش ڪئي وئي آهي ته RBAC حقن کي محدود ڪيو وڃي CSIStorageCapacity کي ان اسپيس ۾، ڇاڪاڻ ته اهو واضح آهي ته ڊيٽا ڪٿان اچي رهي آهي. ڪبرنيٽس ان کي ڪنهن به صورت ۾ چيڪ نٿو ڪري، ۽ عام طور تي ڊرائيور ساڳئي نالي جي جاء تي رکيا ويندا آهن، تنهنڪري آخرڪار ڊرائيور کي ڪم ڪرڻ ۽ غلط ڊيٽا شايع نه ڪرڻ جي اميد آهي (۽ اهو آهي جتي منهنجو ڪارڊ ناڪام ٿيو، لڳ ڀڳ مترجم هڪ ڏاڙهي واري مذاق تي ٻڌل آهي)

عام مقصد Ephemeral حجم

جيڪڏهن صارفين کي پوڊ ٺاهڻ جا حق آهن (سڌي يا اڻ سڌي طرح)، اهي پڻ عام مقصد جي عارضي حجم ٺاهي سگهندا، جيتوڻيڪ انهن وٽ حجم تي درخواست ٺاهڻ جا حق نه هوندا. اهو ئي سبب آهي ته RBAC اجازت چيڪن کي ڪنٽرولر تي لاڳو ڪيو ويو آهي جيڪو PVC ٺاهي ٿو، صارف کي نه. هي شامل ڪرڻ لاء بنيادي تبديلي آهي توهان جي اڪائونٽ ڏانهنهن فيچر کي فعال ڪرڻ کان اڳ ڪلسٽرن تي جتي ناقابل اعتماد استعمال ڪندڙن کي حجم ٺاهڻ جا حق نه هجڻ گهرجن.

مثال طور

الڳ شاخ PMEM-CSI سڀني ضروري تبديلين تي مشتمل آھي ھڪڙي Kubernetes 1.19 ڪلسٽر کي هلائڻ لاءِ QEMU ورچوئل مشينن ۾ الفا اسٽيج ۾ سڀني خصوصيتن سان. ڊرائيور ڪوڊ تبديل نه ڪيو ويو آهي، صرف تعیناتي تبديل ٿي وئي آهي.

هڪ مناسب مشين تي (لينڪس، هڪ عام صارف استعمال ڪري سگهي ٿو Docker، ڏس هتي تفصيل) اهي حڪم ڪلستر آڻيندا ۽ 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 شيون انسانن جي پڙهڻ لاءِ نه آهن، تنهنڪري ڪجهه پروسيسنگ گهربل آهي. گولنگ ٽيمپليٽ فلٽر ڏيکاريندا اسٽوريج ڪلاس، هي مثال ڏيکاريندو نالو، ٽوپولوجي ۽ گنجائش:

$ 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

ٺاهڻ کان پوء، جيئن مٿي ڏنل هدايتن ۾ ڏيکاريل آهي، اسان وٽ هاڻي هڪ اضافي پوڊ ۽ پي وي سي آهي:

$ 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 ڪنهن به صورت ۾.

ايندڙ ڇا آهي؟

ٻئي خاصيتون اڃا ترقي ۾ آهن. الفا ٽيسٽ دوران ڪيترائي ايپليڪيشن کوليا ويا. بهتري پروپوزل لنڪس ان ڪم کي دستاويز ڪري ٿو جيڪو بيٽا اسٽيج تي منتقل ڪرڻ جي ضرورت آهي، انهي سان گڏ جيڪي متبادل اڳ ۾ ئي سمجهيا ويا آهن ۽ رد ڪيا ويا آهن:

جو ذريعو: www.habr.com

تبصرو شامل ڪريو