سعة التخزين المتعقبة للأحجام المؤقتة: EmptyDir على المنشطات

سعة التخزين المتعقبة للأحجام المؤقتة: EmptyDir على المنشطات

تحتاج بعض التطبيقات أيضًا إلى تخزين البيانات، لكنها تشعر بالارتياح تجاه حقيقة أنه لن يتم حفظ البيانات بعد إعادة التشغيل.

على سبيل المثال، تقتصر خدمات التخزين المؤقت على ذاكرة الوصول العشوائي (RAM)، ولكن يمكنها أيضًا نقل البيانات التي نادرًا ما يتم استخدامها إلى مساحة تخزين أبطأ من ذاكرة الوصول العشوائي (RAM)، مع تأثير ضئيل على الأداء العام. يجب أن تدرك التطبيقات الأخرى أنه قد يكون هناك بعض المدخلات للقراءة فقط في الملفات، مثل الإعدادات أو المفاتيح السرية.

لدى Kubernetes بالفعل عدة أنواع مجلدات سريعة الزوال، لكن وظائفها تقتصر على ما يتم تنفيذه في K8s.

سريع الزوال مجلدات منظمة التضامن المسيحي الدولية السماح بتوسيع Kubernetes مع برامج تشغيل CSI لتوفير الدعم لوحدات التخزين المحلية خفيفة الوزن. بهذه الطريقة من الممكن استخدامها الهياكل التعسفية: الإعدادات، والأسرار، وبيانات التعريف، والمتغيرات، وما إلى ذلك. يجب تعديل برامج تشغيل CSI لدعم ميزة Kubernetes هذه، حيث من المفترض أن برامج التشغيل القياسية العادية لن تعمل - ولكن من المفترض أنه يمكن استخدام وحدات التخزين هذه على أي عقدة محددة للحجرة.

قد يكون هذا مشكلة بالنسبة لوحدات التخزين التي تستهلك موارد مضيفة كبيرة أو للتخزين المتوفر فقط على بعض الأجهزة المضيفة. ولهذا السبب يقدم Kubernetes 1.19 ميزتين جديدتين لحجم اختبار ألفا تشبهان من الناحية المفاهيمية وحدات تخزين EmptyDir:

  • مجلدات مؤقتة للأغراض العامة؛

  • تتبع سعة التخزين CSI.

مزايا النهج الجديد:

  • يمكن أن يكون التخزين محليًا أو متصلاً عبر الشبكة؛

  • يمكن أن يكون لوحدات التخزين حجم محدد لا يمكن للتطبيق تجاوزه؛

  • يعمل مع أي برامج تشغيل CSI تدعم توفير وحدات التخزين المستمرة و(لدعم تتبع السعة) تنفذ المكالمة GetCapacity;

  • قد تحتوي المجلدات على بعض البيانات الأولية اعتمادًا على برنامج التشغيل والإعدادات؛

  • يتم دعم جميع العمليات القياسية المتعلقة بالحجم (إنشاء لقطة وتغيير الحجم وما إلى ذلك)؛

  • يمكن استخدام وحدات التخزين مع أي وحدة تحكم في التطبيقات تقبل وحدة نمطية أو مواصفات وحدة تخزين؛

  • يقوم برنامج جدولة Kubernetes بتحديد العقد المناسبة من تلقاء نفسه، لذلك لم تعد هناك حاجة لتوفير وتكوين ملحقات الجدولة أو تعديل خطافات الويب.

خيارات التطبيق

ولذلك، فإن المجلدات المؤقتة ذات الأغراض العامة مناسبة لحالات الاستخدام التالية:

الذاكرة الدائمة كبديل لذاكرة الوصول العشوائي لـ memcached

أحدث إصدارات memcached دعم إضافي باستخدام الذاكرة المستمرة (Intel Optane، وما إلى ذلك، تقريبا. مترجم) بدلاً من ذاكرة الوصول العشوائي العادية. عند نشر memcached من خلال وحدة تحكم التطبيق، يمكنك استخدام وحدات التخزين المؤقتة للأغراض العامة لطلب تخصيص وحدة تخزين بحجم معين من PMEM باستخدام برنامج تشغيل CSI، على سبيل المثال PMEM-CSI.

تخزين LVM المحلي كمساحة عمل

قد تتطلب التطبيقات التي تعمل مع بيانات أكبر من ذاكرة الوصول العشوائي (RAM) تخزينًا محليًا بحجم أو مقاييس أداء لا يمكن لوحدات تخزين EmptyDir العادية من Kubernetes توفيرها. على سبيل المثال، لهذا الغرض تم كتابته TopoLVM.

الوصول للقراءة فقط لوحدات تخزين البيانات

يمكن أن يؤدي تخصيص المجلد إلى إنشاء مجلد كامل عندما:

يمكن تركيب وحدات التخزين هذه في وضع القراءة فقط.

كيف يعمل هذا؟

مجلدات الأغراض العامة سريعة الزوال

الميزة الرئيسية للمجلدات المؤقتة للأغراض العامة هي مصدر المجلد الجديد، EphemeralVolumeSource، يحتوي على كافة الحقول لإنشاء طلب وحدة تخزين (يُسمى تاريخيًا طلب وحدة التخزين المستمرة، PVC). وحدة تحكم جديدة في kube-controller-manager ينظر إلى القرون التي تنشئ مثل هذا المصدر للحجم، ثم يقوم بإنشاء PVC لتلك القرون. بالنسبة لبرنامج تشغيل CSI، يبدو هذا الطلب مثل الطلبات الأخرى، لذلك لا توجد حاجة إلى دعم خاص هنا.

طالما أن مثل هذه PVC موجودة، فيمكن استخدامها مثل أي طلبات أخرى على وحدة التخزين. على وجه الخصوص، يمكن الرجوع إليها كمصدر بيانات عند نسخ وحدة تخزين أو إنشاء لقطة من وحدة تخزين. يحتوي كائن PVC أيضًا على الحالة الحالية لوحدة التخزين.

يتم تعريف أسماء PVC التي تم إنشاؤها تلقائيًا مسبقًا: فهي عبارة عن مزيج من اسم الكبسولة واسم المجلد، مفصولة بواصلة. تسهل الأسماء المحددة مسبقًا التفاعل مع PVC لأنك لا تحتاج إلى البحث عنه إذا كنت تعرف اسم الكبسولة واسم المجلد. الجانب السلبي هو أن الاسم قد يكون قيد الاستخدام بالفعل، وهو ما اكتشفه Kubernetes ونتيجة لذلك تم حظر الكبسولة من البدء.

للتأكد من حذف المجلد مع الكبسولة، تقوم وحدة التحكم بتقديم طلب إلى المجلد الموجود تحت المالك. عندما يتم حذف الكبسولة، تعمل آلية جمع البيانات المهملة القياسية، والتي تحذف كلاً من الطلب ووحدة التخزين.

تتم مطابقة الطلبات بواسطة برنامج تشغيل التخزين من خلال الآلية العادية لفئة التخزين. على الرغم من أن الفصول ذات الارتباط الفوري والمتأخر (المعروف أيضًا باسم WaitForFirstConsumer) مدعومة، بالنسبة للمجلدات سريعة الزوال فمن المنطقي استخدامها WaitForFirstConsumer، فيمكن للمجدول أن يأخذ في الاعتبار استخدام العقدة وتوافر التخزين عند تحديد العقدة. تظهر ميزة جديدة هنا.

تتبع سعة التخزين

عادةً لا يكون لدى المجدول أي معرفة بالمكان الذي سيقوم فيه برنامج تشغيل CSI بإنشاء وحدة التخزين. لا توجد أيضًا طريقة يمكن للمجدول من خلالها الاتصال بالسائق مباشرة لطلب هذه المعلومات. لذلك، يقوم المجدول باستقصاء العقد حتى يجد واحدة يمكن الوصول إلى وحدات التخزين عليها (الربط المتأخر) أو يترك اختيار الموقع بالكامل للسائق (الربط الفوري).

جديد API CSIStorageCapacity، الذي هو في مرحلة ألفا، يسمح بتخزين البيانات الضرورية في الخ بحيث تكون متاحة للمجدول. على عكس دعم وحدات التخزين المؤقتة للأغراض العامة، عند نشر برنامج التشغيل، يجب عليك تمكين تتبع سعة التخزين: external-provisioner يجب نشر معلومات السعة الواردة من السائق عبر الوضع العادي GetCapacity.

إذا احتاج المجدول إلى تحديد عقدة لحجرة ذات وحدة تخزين غير منضم تستخدم الربط المتأخر، وقام برنامج التشغيل بتمكين هذه الميزة أثناء النشر عن طريق تعيين العلامة CSIDriver.storageCapacity، فسيتم تلقائيًا التخلص من العقد التي لا تحتوي على سعة تخزين كافية. يعمل هذا مع كل من المجلدات المؤقتة والمستمرة للأغراض العامة، ولكن ليس مع مجلدات CSI المؤقتة لأنه لا يمكن قراءة معلماتها بواسطة Kubernetes.

كالعادة، يتم إنشاء وحدات التخزين المرتبطة على الفور قبل جدولة الكبسولات، ويتم اختيار موضعها بواسطة برنامج تشغيل التخزين، لذلك عند التكوين external-provisioner افتراضيًا، يتم تخطي فئات التخزين ذات الارتباط الفوري، حيث لن يتم استخدام هذه البيانات على أي حال.

نظرًا لأن برنامج جدولة kubernetes مجبر على العمل مع معلومات قد تكون قديمة، فليس هناك ضمان بأن السعة ستكون متاحة في كل حالة عند إنشاء المجلد، ولكن فرص إنشائه دون إعادة المحاولة تزداد مع ذلك.

ملحوظة: يمكنك الحصول على معلومات أكثر تفصيلاً، بالإضافة إلى "التدرب على منصة القطط" بأمان، وفي حالة حدوث موقف غير مفهوم تمامًا، يمكنك الحصول على مساعدة الدعم الفني المؤهلة في الدورات المكثفة - قاعدة Kubernetes سيعقد في الفترة من 28 إلى 30 سبتمبر وللمتخصصين الأكثر تقدمًا Kubernetes ميجا 14-16 أكتوبر.

أمن

CSIStorageCapacity

توجد كائنات CSIStorageCapacity في مساحات الأسماء؛ عند طرح كل برنامج تشغيل CSI في مساحة الاسم الخاصة به، يوصى بتقييد حقوق RBAC إلى CSIStorageCapacity في تلك المساحة نظرًا لأنه من الواضح من أين تأتي البيانات. لا يتحقق Kubernetes من هذا على أي حال، وعادةً ما يتم وضع برامج التشغيل في نفس مساحة الاسم، لذلك في النهاية من المتوقع أن تعمل برامج التشغيل ولا تنشر بيانات غير صحيحة (وهذا هو المكان الذي فشلت فيه بطاقتي، تقريبا. مترجم على أساس نكتة ملتحية)

مجلدات الأغراض العامة سريعة الزوال

إذا كان لدى المستخدمين حقوق إنشاء حجرة (بشكل مباشر أو غير مباشر)، فسيتمكنون أيضًا من إنشاء وحدات تخزين مؤقتة للأغراض العامة حتى لو لم يكن لديهم حقوق إنشاء طلب على وحدة التخزين. وذلك لأن عمليات فحص أذونات RBAC يتم تطبيقها على وحدة التحكم التي تنشئ PVC، وليس على المستخدم. هذا هو التغيير الرئيسي الذي يجب إضافته إلى حسابك، قبل تمكين هذه الميزة في المجموعات حيث لا ينبغي أن يتمتع المستخدمون غير الموثوق بهم بحقوق إنشاء وحدات التخزين.

مثال

منفصل فرع يحتوي PMEM-CSI على جميع التغييرات اللازمة لتشغيل مجموعة Kubernetes 1.19 داخل أجهزة QEMU الافتراضية مع جميع الميزات الموجودة في مرحلة ألفا. لم يتغير رمز برنامج التشغيل، لقد تغير النشر فقط.

على جهاز مناسب (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

إذا كان تطبيق آخر يحتاج إلى أكثر من 26620مي، فلن يأخذ المجدول في الاعتبار pmem-csi-pmem-govm-worker1 على أي حال.

ما هي الخطوة التالية؟

كلتا الميزتين لا تزالان قيد التطوير. تم فتح العديد من التطبيقات أثناء اختبار ألفا. توثق روابط مقترح التحسين العمل الذي يجب القيام به للانتقال إلى المرحلة التجريبية، بالإضافة إلى البدائل التي تم النظر فيها بالفعل ورفضها:

المصدر: www.habr.com

إضافة تعليق