تحتاج بعض التطبيقات أيضًا إلى تخزين البيانات، لكنها تشعر بالارتياح تجاه حقيقة أنه لن يتم حفظ البيانات بعد إعادة التشغيل.
على سبيل المثال، تقتصر خدمات التخزين المؤقت على ذاكرة الوصول العشوائي (RAM)، ولكن يمكنها أيضًا نقل البيانات التي نادرًا ما يتم استخدامها إلى مساحة تخزين أبطأ من ذاكرة الوصول العشوائي (RAM)، مع تأثير ضئيل على الأداء العام. يجب أن تدرك التطبيقات الأخرى أنه قد يكون هناك بعض المدخلات للقراءة فقط في الملفات، مثل الإعدادات أو المفاتيح السرية.
لدى Kubernetes بالفعل عدة أنواع
سريع الزوال
قد يكون هذا مشكلة بالنسبة لوحدات التخزين التي تستهلك موارد مضيفة كبيرة أو للتخزين المتوفر فقط على بعض الأجهزة المضيفة. ولهذا السبب يقدم Kubernetes 1.19 ميزتين جديدتين لحجم اختبار ألفا تشبهان من الناحية المفاهيمية وحدات تخزين EmptyDir:
-
مجلدات مؤقتة للأغراض العامة؛
-
تتبع سعة التخزين CSI.
مزايا النهج الجديد:
-
يمكن أن يكون التخزين محليًا أو متصلاً عبر الشبكة؛
-
يمكن أن يكون لوحدات التخزين حجم محدد لا يمكن للتطبيق تجاوزه؛
-
يعمل مع أي برامج تشغيل CSI تدعم توفير وحدات التخزين المستمرة و(لدعم تتبع السعة) تنفذ المكالمة
GetCapacity
; -
قد تحتوي المجلدات على بعض البيانات الأولية اعتمادًا على برنامج التشغيل والإعدادات؛
-
يتم دعم جميع العمليات القياسية المتعلقة بالحجم (إنشاء لقطة وتغيير الحجم وما إلى ذلك)؛
-
يمكن استخدام وحدات التخزين مع أي وحدة تحكم في التطبيقات تقبل وحدة نمطية أو مواصفات وحدة تخزين؛
-
يقوم برنامج جدولة Kubernetes بتحديد العقد المناسبة من تلقاء نفسه، لذلك لم تعد هناك حاجة لتوفير وتكوين ملحقات الجدولة أو تعديل خطافات الويب.
خيارات التطبيق
ولذلك، فإن المجلدات المؤقتة ذات الأغراض العامة مناسبة لحالات الاستخدام التالية:
الذاكرة الدائمة كبديل لذاكرة الوصول العشوائي لـ memcached
أحدث إصدارات memcached
تخزين LVM المحلي كمساحة عمل
قد تتطلب التطبيقات التي تعمل مع بيانات أكبر من ذاكرة الوصول العشوائي (RAM) تخزينًا محليًا بحجم أو مقاييس أداء لا يمكن لوحدات تخزين EmptyDir العادية من Kubernetes توفيرها. على سبيل المثال، لهذا الغرض تم كتابته
الوصول للقراءة فقط لوحدات تخزين البيانات
يمكن أن يؤدي تخصيص المجلد إلى إنشاء مجلد كامل عندما:
يمكن تركيب وحدات التخزين هذه في وضع القراءة فقط.
كيف يعمل هذا؟
مجلدات الأغراض العامة سريعة الزوال
الميزة الرئيسية للمجلدات المؤقتة للأغراض العامة هي مصدر المجلد الجديد، EphemeralVolumeSource
، يحتوي على كافة الحقول لإنشاء طلب وحدة تخزين (يُسمى تاريخيًا طلب وحدة التخزين المستمرة، PVC). وحدة تحكم جديدة في kube-controller-manager
ينظر إلى القرون التي تنشئ مثل هذا المصدر للحجم، ثم يقوم بإنشاء PVC لتلك القرون. بالنسبة لبرنامج تشغيل CSI، يبدو هذا الطلب مثل الطلبات الأخرى، لذلك لا توجد حاجة إلى دعم خاص هنا.
طالما أن مثل هذه PVC موجودة، فيمكن استخدامها مثل أي طلبات أخرى على وحدة التخزين. على وجه الخصوص، يمكن الرجوع إليها كمصدر بيانات عند نسخ وحدة تخزين أو إنشاء لقطة من وحدة تخزين. يحتوي كائن PVC أيضًا على الحالة الحالية لوحدة التخزين.
يتم تعريف أسماء PVC التي تم إنشاؤها تلقائيًا مسبقًا: فهي عبارة عن مزيج من اسم الكبسولة واسم المجلد، مفصولة بواصلة. تسهل الأسماء المحددة مسبقًا التفاعل مع PVC لأنك لا تحتاج إلى البحث عنه إذا كنت تعرف اسم الكبسولة واسم المجلد. الجانب السلبي هو أن الاسم قد يكون قيد الاستخدام بالفعل، وهو ما اكتشفه Kubernetes ونتيجة لذلك تم حظر الكبسولة من البدء.
للتأكد من حذف المجلد مع الكبسولة، تقوم وحدة التحكم بتقديم طلب إلى المجلد الموجود تحت المالك. عندما يتم حذف الكبسولة، تعمل آلية جمع البيانات المهملة القياسية، والتي تحذف كلاً من الطلب ووحدة التخزين.
تتم مطابقة الطلبات بواسطة برنامج تشغيل التخزين من خلال الآلية العادية لفئة التخزين. على الرغم من أن الفصول ذات الارتباط الفوري والمتأخر (المعروف أيضًا باسم WaitForFirstConsumer
) مدعومة، بالنسبة للمجلدات سريعة الزوال فمن المنطقي استخدامها WaitForFirstConsumer
، فيمكن للمجدول أن يأخذ في الاعتبار استخدام العقدة وتوافر التخزين عند تحديد العقدة. تظهر ميزة جديدة هنا.
تتبع سعة التخزين
عادةً لا يكون لدى المجدول أي معرفة بالمكان الذي سيقوم فيه برنامج تشغيل CSI بإنشاء وحدة التخزين. لا توجد أيضًا طريقة يمكن للمجدول من خلالها الاتصال بالسائق مباشرة لطلب هذه المعلومات. لذلك، يقوم المجدول باستقصاء العقد حتى يجد واحدة يمكن الوصول إلى وحدات التخزين عليها (الربط المتأخر) أو يترك اختيار الموقع بالكامل للسائق (الربط الفوري).
جديد CSIStorageCapacity
، الذي هو في مرحلة ألفا، يسمح بتخزين البيانات الضرورية في الخ بحيث تكون متاحة للمجدول. على عكس دعم وحدات التخزين المؤقتة للأغراض العامة، عند نشر برنامج التشغيل، يجب عليك تمكين تتبع سعة التخزين: external-provisioner
يجب نشر معلومات السعة الواردة من السائق عبر الوضع العادي GetCapacity
.
إذا احتاج المجدول إلى تحديد عقدة لحجرة ذات وحدة تخزين غير منضم تستخدم الربط المتأخر، وقام برنامج التشغيل بتمكين هذه الميزة أثناء النشر عن طريق تعيين العلامة CSIDriver.storageCapacity
، فسيتم تلقائيًا التخلص من العقد التي لا تحتوي على سعة تخزين كافية. يعمل هذا مع كل من المجلدات المؤقتة والمستمرة للأغراض العامة، ولكن ليس مع مجلدات CSI المؤقتة لأنه لا يمكن قراءة معلماتها بواسطة Kubernetes.
كالعادة، يتم إنشاء وحدات التخزين المرتبطة على الفور قبل جدولة الكبسولات، ويتم اختيار موضعها بواسطة برنامج تشغيل التخزين، لذلك عند التكوين external-provisioner
افتراضيًا، يتم تخطي فئات التخزين ذات الارتباط الفوري، حيث لن يتم استخدام هذه البيانات على أي حال.
نظرًا لأن برنامج جدولة kubernetes مجبر على العمل مع معلومات قد تكون قديمة، فليس هناك ضمان بأن السعة ستكون متاحة في كل حالة عند إنشاء المجلد، ولكن فرص إنشائه دون إعادة المحاولة تزداد مع ذلك.
ملحوظة: يمكنك الحصول على معلومات أكثر تفصيلاً، بالإضافة إلى "التدرب على منصة القطط" بأمان، وفي حالة حدوث موقف غير مفهوم تمامًا، يمكنك الحصول على مساعدة الدعم الفني المؤهلة في الدورات المكثفة -
أمن
CSIStorageCapacity
توجد كائنات CSIStorageCapacity في مساحات الأسماء؛ عند طرح كل برنامج تشغيل CSI في مساحة الاسم الخاصة به، يوصى بتقييد حقوق RBAC إلى CSIStorageCapacity في تلك المساحة نظرًا لأنه من الواضح من أين تأتي البيانات. لا يتحقق Kubernetes من هذا على أي حال، وعادةً ما يتم وضع برامج التشغيل في نفس مساحة الاسم، لذلك في النهاية من المتوقع أن تعمل برامج التشغيل ولا تنشر بيانات غير صحيحة (وهذا هو المكان الذي فشلت فيه بطاقتي، تقريبا. مترجم على أساس نكتة ملتحية)
مجلدات الأغراض العامة سريعة الزوال
إذا كان لدى المستخدمين حقوق إنشاء حجرة (بشكل مباشر أو غير مباشر)، فسيتمكنون أيضًا من إنشاء وحدات تخزين مؤقتة للأغراض العامة حتى لو لم يكن لديهم حقوق إنشاء طلب على وحدة التخزين. وذلك لأن عمليات فحص أذونات RBAC يتم تطبيقها على وحدة التحكم التي تنشئ PVC، وليس على المستخدم. هذا هو التغيير الرئيسي الذي يجب إضافته
مثال
منفصل
على جهاز مناسب (Linux، يمكن للمستخدم العادي استخدام
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