ملاحظة perev. : تم نشر المقالة الأصلية مؤخرًا على مدونة Kubernetes وكتبها موظفو Google و Huawei (Jing Xu و Xing Yang و Saad Ali) ، الذين رأيت نشاطهم النشط بالتأكيد في GitHub للمشروع ، إذا كنت مهتمًا بميزات K8s والمشكلات المتعلقة بـ مع تخزين البيانات. يتحدث المهندسون عن الغرض من لقطات الحجم ، وقدراتهم الحالية وأساسيات العمل معهم. قدم Kubernetes v1.12 نسخة ألفا من دعم لقطات المجلدات. تتيح لك هذه الميزة إنشاء لقطات من المجلدات وحذفها ، بالإضافة إلى إنشاء مجلدات جديدة من اللقطات باستخدام الوسائل "الأصلية" للنظام - من خلال واجهة برمجة تطبيقات Kubernetes.
ما هي اللقطة؟
توفر العديد من أنظمة التخزين (مثل Google Cloud Persistent Disks و Amazon Elastic Block Storage والعديد من أنظمة التخزين داخل الشركة) القدرة على إنشاء لقطة ("لقطة") لوحدة تخزين مستمرة. اللقطة هي نسخة من مجلد في وقت معين. يمكن استخدامه لتوفير وحدة تخزين جديدة (مليئة بالفعل ببيانات من لقطة) أو استعادة وحدة تخزين موجودة إلى حالة سابقة (والتي يتم تقديمها في لقطة).
لماذا تضيف لقطات إلى Kubernetes؟
يتوفر تجريد قوي بالفعل في نظام المكونات الإضافية Kubernetes ، وأتمتة التزويد ، وربط وتثبيت كتلة وتخزين الملفات.
يعد توفير كل هذه الإمكانات جزءًا من أهداف Kubernetes لتحمل عبء العمل: تسعى Kubernetes إلى إنشاء طبقة تجريد بين التطبيقات التي تعمل كنظم موزعة ومجموعات أساسية بحيث تكون التطبيقات مستقلة عن الكتلة المحددة التي تعمل عليها ، ولا يتطلب نشر التطبيق أي معرفة خاصة بالمجموعة.
حددت Kubernetes Storage SIG عمليات اللقطة باعتبارها قدرات مهمة لمجموعة متنوعة من أعباء العمل ذات الحالة. على سبيل المثال ، قد يرغب مسؤول قاعدة البيانات في التقاط قاعدة بياناته قبل إجراء أي عملية عليها.
من خلال الحصول على Kubernetes API طريقة قياسية لاستدعاء عمليات اللقطة ، يمكن لمستخدمي Kubernetes العمل معهم دون الحاجة إلى حلول (والاستدعاء اليدوي للعمليات الخاصة بنظام التخزين). بدلاً من ذلك ، تم منح المستخدمين الفرصة لتضمين عمليات اللقطة في أدواتهم وسياساتهم مع الفهم الهادئ بأن كل شيء سيعمل مع أي مجموعات Kubernetes ، بغض النظر عن التخزين الأساسي.
بالإضافة إلى ذلك ، تعمل بدائل Kubernetes الأولية كعناصر بناء أساسية ، تفتح الطريق لتطوير ميزات أكثر تقدمًا على مستوى المؤسسة لإدارة التخزين - على سبيل المثال ، للحماية والنسخ المتماثل وترحيل البيانات.
ما هي مكونات الصوت الإضافية التي تدعم اللقطات في Kubernetes؟
يدعم Kubernetes ثلاثة أنواع من المكونات الإضافية للحجم: in-tree و Flex و CSI. راجع
الأسئلة الشائعة حول المكوّن الإضافي Kubernetes Volume Plugin للحصول على التفاصيل.
اللقطات مدعومة فقط لمحركات CSI (لا يتم دعمها إما داخل الشجرة أو فليكس). للاستفادة من هذه الفرصة ، تأكد من نشر برنامج تشغيل CSI الذي يقوم بتنفيذ دعم اللقطة في مجموعة Kubernetes.
بحلول وقت نشر هذه المدونة
(9 أكتوبر 2018 - ترجمة تقريبًا ) ، يتم دعم اللقطات بواسطة برامج تشغيل CSI التالية:
لا يزال دعم لقطات
برامج التشغيل الأخرى قيد التطوير وسيتوفر قريبًا. مزيد من التفاصيل حول CSI وكيفية نشر برامج تشغيل CSI موصوفة في المنشور "
واجهة تخزين الحاويات (CSI) لـ Kubernetes Goes Beta "
(وأيضًا انظر ترجمة المذكرة " فهم واجهة تخزين الحاويات (في Kubernetes والمزيد) " - تقريبًا. ) .
واجهة برمجة تطبيقات Kubernetes للقطات
لإدارة اللقطات ، يقدم Kubernetes Volume Snapshots ثلاثة كائنات API جديدة بنفس الطريقة كما في Kubernetes Persistent Volumes API:
VolumeSnapshot
- تم إنشاؤها بواسطة مستخدم Kubernetes لطلب لقطة لوحدة التخزين المحددة. يحتوي على معلومات حول عملية اللقطة ، مثل الطابع الزمني لإزالة اللقطة وما إذا كانت جاهزة للاستخدام.
- مثل كائن
PersistentVolumeClaim
، يمثل إنشاء هذا الكائن وحذفه رغبة المستخدم في إنشاء أو حذف مورد نظام المجموعة (لقطة).
VolumeSnapshotContent
- تم إنشاؤه بواسطة برنامج تشغيل CSI عندما تم إنشاء اللقطة بنجاح. يحتوي على معلومات حول اللقطة بما في ذلك معرفها.
- مثل كائن
PersistentVolume
، فهو يمثل موردا مخدوم بالفعل بواسطة نظام المجموعة (لقطة). - مثل كائنات
PersistentVolume
و PersistentVolume
، عندما يتم إنشاء لقطة ، VolumeSnapshotContent
إرفاق كائن VolumeSnapshot
بـ VolumeSnapshot
الذي تم إنشاؤه من أجله (يتم استخدام تعيين واحد لواحد).
VolumeSnapshotClass
- تم تعريفها من قبل مسؤولي الكتلة لوصف اللقطات التي يمكن إنشاؤها. يتضمن معلومات السائق ، وأسرار الوصول إلى لقطات ، وما إلى ذلك.
من المهم ملاحظة أنه - على عكس كائنات الحجم المستمر الرئيسية في Kubernetes - يتم تعريف كائنات اللقطات الإضافية هذه على أنها
CustomResourceDefinitions (CRDs) . ينتقل مشروع Kubernetes تدريجيًا بعيدًا عن أنواع الموارد المحددة مسبقًا في خادم API ، ويقترب من نموذج يكون فيه خادم API مستقلًا عن كائنات API. يتيح لك هذا الأسلوب إعادة استخدام خادم API في مشاريع أخرى (إلى جانب Kubernetes) ، ويمكن للمستهلكين (مثل Kubernetes) تعيين أنواع الموارد التي يحتاجونها مثل CRD.
ستقوم
برامج تشغيل CSI التي تدعم اللقطات بتثبيت CRDs تلقائيًا. يحتاج المستخدمون النهائيون لـ Kubernetes فقط إلى التحقق من نشر برنامج تشغيل CSI الذي يدعم اللقطات في المجموعة.
بالإضافة إلى هذه الكائنات الجديدة ،
PersistentVolumeClaim
على حقل
DataSource
جديد:
type PersistentVolumeClaimSpec struct { AccessModes []PersistentVolumeAccessMode Selector *metav1.LabelSelector Resources ResourceRequirements VolumeName string StorageClassName *string VolumeMode *PersistentVolumeMode DataSource *TypedLocalObjectReference }
يسمح لك هذا الحقل (في حالة إصدار ألفا) بملئه تلقائيًا ببيانات من لقطة موجودة عند إنشاء وحدة تخزين جديدة.
متطلبات لقطة Kubernetes
قبل استخدام لقطات الحجم في Kubernetes ، يجب عليك:
- تأكد من نشر برنامج تشغيل CSI الذي يقوم بتنفيذ اللقطات وتشغيله على الكتلة ؛
- تمكين وظيفة Kubernetes Volume Snapshotting من خلال بوابة الميزات الجديدة (يتم تعطيلها افتراضيًا لإصدار ألفا):
- قم بتعيين العلامة التالية لملقم API
--feature-gates=VolumeSnapshotDataSource=true
: --feature-gates=VolumeSnapshotDataSource=true
قبل إنشاء لقطة ، يجب عليك أيضًا تحديد برنامج تشغيل CSI الذي سيتم استخدامه ، والذي يتم عن طريق إنشاء كائن
VolumeSnapshotClass
وتحديد برنامج تشغيل CSI في حقل
snapshotter
. في مثال
VolumeSnapshotClass
أدناه ، يكون برنامج التشغيل هذا هو
com.example.csi-driver
. يتطلب كل موفر لقطة كائن
VolumeSnapshotClass
واحد على الأقل. من الممكن أيضًا تحديد
VolumeSnapshotClass
افتراضي لكل برنامج تشغيل CSI - ويتم ذلك عن طريق تعيين
snapshot.storage.kubernetes.io/is-default-class: "true"
التعليق التوضيحي
snapshot.storage.kubernetes.io/is-default-class: "true"
في تعريف الفئة:
apiVersion: snapshot.storage.k8s.io/v1alpha1 kind: VolumeSnapshotClass metadata: name: default-snapclass annotations: snapshot.storage.kubernetes.io/is-default-class: "true" snapshotter: com.example.csi-driver apiVersion: snapshot.storage.k8s.io/v1alpha1 kind: VolumeSnapshotClass metadata: name: csi-snapclass snapshotter: com.example.csi-driver parameters: fakeSnapshotOption: foo csiSnapshotterSecretName: csi-secret csiSnapshotterSecretNamespace: csi-namespace
يجب تعيين جميع المعلمات المطلوبة وفقًا لوثائق برنامج تشغيل CSI. في المثال أعلاه ، سيتم
fakeSnapshotOption: foo
معلمة
fakeSnapshotOption: foo
وجميع الأسرار المذكورة إلى برنامج تشغيل CSI أثناء إنشاء اللقطة وإزالتها. يحفظ
اللقطة الخارجية لـ CSI بشكل افتراضي مفاتيح المعلمات
csiSnapshotterSecretNamespace
و
csiSnapshotterSecretNamespace
.
أخيرًا ، قبل إنشاء لقطة ، يجب عليك إنشاء وحدة التخزين من خلال برنامج تشغيل CSI وملئها بالبيانات التي تريد رؤيتها هناك (راجع
هذا المنشور للحصول على تفاصيل حول كيفية استخدام مجلدات CSI).
إنشاء لقطة جديدة في Kubernetes
بمجرد
VolumeSnapshotClass
كائن
VolumeSnapshotClass
وحدة التخزين التي تريد إزالة اللقطة منها ، يمكنك تنفيذ هذه العملية عن طريق إنشاء كائن
VolumeSnapshot
.
يتم تحديد مصدر اللقطة بواسطة معلمتين:
kind
- PersistentVolumeClaim
إلى PersistentVolumeClaim
هنا ؛name
- name
الفعلي للكائن PVC.
من المفهوم أن مساحة الاسم لوحدة التخزين التي تم إنشاء اللقطة لها تحددها مساحة اسم الكائن
VolumeSnapshot
.
apiVersion: snapshot.storage.k8s.io/v1alpha1 kind: VolumeSnapshot metadata: name: new-snapshot-demo namespace: demo-namespace spec: snapshotClassName: csi-snapclass source: name: mypvc kind: PersistentVolumeClaim
يمكن أن
VolumeSnapshot
مواصفات
VolumeSnapshotClass
الذي يحتوي على معلومات حول برنامج تشغيل CSI الذي سيتم استخدامه لإنشاء اللقطة. كما تم الإبلاغ عنه سابقًا ، بعد إنشاء كائن
VolumeSnapshot
يتم
fakeSnapshotOption: foo
المعلمة
fakeSnapshotOption: foo
وجميع أسرار
VolumeSnapshotClass
المذكورة إلى برنامج CSI plugin
com.example.csi-driver
في استدعاء
CreateSnapshot
.
استجابة لمثل هذا الطلب ، يأخذ برنامج تشغيل CSI لقطة
VolumeSnapshotContent
التخزين ثم يقوم تلقائيًا بإنشاء كائن
VolumeSnapshotContent
يمثل اللقطة الجديدة وربط هذا الكائن بـ
VolumeSnapshot
، مما يجعله جاهزًا للاستخدام. إذا تعذر على برنامج تشغيل CSI إنشاء لقطة وإرجاع خطأ ، تقوم وحدة تحكم اللقطة بالإبلاغ عن هذا الخطأ في حالة كائن
VolumeSnapshot
ولا تقوم بمحاولات جديدة (يختلف هذا السلوك عن وحدات التحكم الأخرى في Kubernetes - يتم تنفيذه حتى لا يتم إنشاء لقطة في أوقات غير متوقعة) .
إذا لم يتم تحديد فئة اللقطة ، سيحاول اللقطة الخارجية العثور على الفئة الافتراضية واستخدامها للقطة التي تم إنشاؤها. في هذه الحالة ، يجب أن يتوافق برنامج تشغيل CSI المشار إليه بواسطة
snapshotter
في الفئة الافتراضية مع برنامج تشغيل CSI الذي أشار إليه
provisioner
في فئة تخزين PVC.
يرجى ملاحظة أن إصدار ألفا من لقطات Kubernetes لا يوفر ضمانًا للاتساق. لضمان البيانات الكاملة في لقطة ، من الضروري إعداد التطبيق بشكل صحيح (إيقاف التطبيق ، وتجميد نظام الملفات ، وما إلى ذلك) قبل إزالته.
VolumeSnapshot
أنه
VolumeSnapshot
إنشاء كائن
VolumeSnapshotContent
، يمكنك استخدام
kubectl describe volumesnapshot
:
- يجب أن يكون
Ready
true
في Status
، مما يشير إلى أن لقطة وحدة التخزين جاهزة للاستخدام. - يوضح حقل
Creation Time
التقاط اللقطة بالفعل. - حقل
Restore Size
هو الحد الأدنى لحجم وحدة التخزين لاستعادة لقطة. - يشير حقل
Snapshot Content Name
في المواصفات إلى كائن VolumeSnapshotContent
تم إنشاؤه لهذه اللقطة.
استيراد لقطة موجودة إلى Kubernetes
يمكن استيراد لقطة موجودة إلى Kubernetes عن طريق إنشاء كائن
VolumeSnapshotContent
يدويًا يمثل هذه اللقطة. نظرًا لأن
VolumeSnapshotContent
عبارة عن كائن API غير مرتبط
VolumeSnapshotContent
اسم ، فإن مسؤول النظام فقط لديه الحق في إنشائه.
عند
VolumeSnapshotContent
كائن
VolumeSnapshotContent
، يمكن للمستخدم إنشاء كائن آخر -
VolumeSnapshot
-
VolumeSnapshot
إليه. ستحدد وحدة تحكم اللقطة الخارجية اللقطة بأنها جاهزة بعد التحقق من وجود وصحة الاتصال بين
VolumeSnapshotContent
و
VolumeSnapshotContent
. لقطة جاهزة للاستخدام في Kubernetes عند إنشاء هذا الاتصال.
يجب إنشاء كائن
VolumeSnapshotContent
باستخدام الحقول التالية التي تمثل اللقطة التي تم
توفيرها مسبقًا :
csiVolumeSnapshotSource
- معلومات تحدد لقطة:
snapshotHandle
- اسم / معرف اللقطة. حقل إلزاميdriver
- يستخدم برنامج تشغيل CSI للعمل مع وحدة التخزين هذه. حقل إلزامي. يجب أن يتطابق مع اسم snapshotter
في وحدة التحكم (وحدة تحكم اللقطة) ؛restoreSize
و restoreSize
- بالنسبة إلى وحدات التخزين التي تم توفيرها مسبقًا ، تعد هذه الحقول اختيارية. ستقوم وحدة تحكم اللقطة الخارجية بتحديثها تلقائيًا بعد إنشاء لقطة.
volumeSnapshotRef
- المؤشر إلى كائن VolumeSnapshot
الذي يجب إرفاق هذا الكائن به (أي VolumeSnapshotContent
):
name
namespace
- اسم ومساحة اسم كائن VolumeSnapshot
الذي تكون محتوياته مرتبطة ؛UID
- حقل اختياري (للمجلدات المعدة مسبقًا). ستقوم وحدة تحكم اللقطة الخارجية بتحديث هذا الحقل تلقائيًا بعد الربط. إذا قام المستخدم بتعريف هذا الحقل ، فأنت بحاجة إلى التأكد من أنه يتطابق مع UID الخاص باللقطة التي يحدث الربط لها. إذا لم يكن هناك مثل هذه المراسلات ، فإن المحتوى يعتبر غير ذي صلة (الكائن اليتيم) وبالتالي فإن وحدة التحكم ستحذفه واللقطة المرتبطة به.
snapshotClassName
هو حقل اختياري. ستقوم وحدة التحكم في اللقطة الخارجية بتحديثها تلقائيًا بعد الربط.
apiVersion: snapshot.storage.k8s.io/v1alpha1 kind: VolumeSnapshotContent metadata: name: static-snapshot-content spec: csiVolumeSnapshotSource: driver: com.example.csi-driver snapshotHandle: snapshotcontent-example-id volumeSnapshotRef: kind: VolumeSnapshot name: static-snapshot-demo namespace: demo-namespace
يجب إنشاء كائن
VolumeSnapshot
بحيث يمكن للمستخدم العمل مع اللقطة. فيه:
snapshotClassName
- اسم فئة اللقطة لوحدة التخزين. حقل اختياري. إذا تم التعيين ، يجب أن يتطابق حقل snapshotter
في فئة اللقطة مع اسم وحدة تحكم اللقطة. إذا لم يتم الضبط ، ستبحث وحدة التحكم عن فئة اللقطة الافتراضية ؛snapshotContentName
- اسم محتويات مجلد اللقطة. حقل إلزامي للأحجام المعدة مسبقًا.
apiVersion: snapshot.storage.k8s.io/v1alpha1 kind: VolumeSnapshot metadata: name: static-snapshot-demo namespace: demo-namespace spec: snapshotClassName: csi-snapclass snapshotContentName: static-snapshot-content
عندما يتم إنشاء هذه الكائنات ، ستقوم أداة التحكم في اللقطة بربطها ، وتعيين حقل
Ready
(في
Status
) إلى
True
، للإشارة إلى أن اللقطة جاهزة للاستخدام.
تحضير مجلد جديد من لقطة في Kubernetes
لإنشاء وحدة تخزين جديدة
dataSource
مسبقًا ببيانات من كائن اللقطة ، استخدم حقل
dataSource
الجديد في
PersistentVolumeClaim
. لديها ثلاث معلمات:
name
- اسم كائن VolumeSnapshot
يمثل مصدر اللقطة ؛kind
- يجب تعيين VolumeSnapshot
؛apiGroup
- يجب أن يكون snapshot.storage.k8s.io
.
من المفترض أن مساحة الاسم للمصدر -
VolumeSnapshot
- تطابق مساحة الاسم الخاصة بـ
PersistentVolumeClaim
.
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-restore Namespace: demo-namespace spec: storageClassName: csi-storageclass dataSource: name: new-snapshot-demo kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io accessModes: - ReadWriteOnce resources: requests: storage: 1Gi
عندما يتم إنشاء كائن
PersistentVolumeClaim
، فإنه سيستدعي توفير وحدة التخزين الجديدة ، التي تم ملؤها مسبقًا ببيانات من اللقطة المحددة.
كيفية إضافة دعم لقطة إلى برنامج تشغيل CSI الخاص بي إذا كنت مطور تخزين؟
لتوفير الدعم
LIST_SNAPSHOTS
، يجب إضافة قدرات تحكم إضافية إلى برنامج تشغيل CSI:
CREATE_DELETE_SNAPSHOT
و
LIST_SNAPSHOTS
، بالإضافة إلى وحدات تحكم RPC إضافية:
CreateSnapshot
و
DeleteSnapshot
و
ListSnapshots
. راجع
مواصفات CSI للحصول على التفاصيل.
على الرغم من أن Kubernetes يوفر
المبادئ الأساسية الأساسية للتغليف ونشر برنامج تشغيل وحدة تخزين CSI ، هناك
آلية موصى بها لنشر برنامج تشغيل CSI حاويات عشوائي في Kubernetes لتبسيط هذه العملية.
كجزء من عملية النشر الموصى بها ، يقترح فريق Kubernetes استخدام مجموعة متنوعة من الحاويات الجانبية (أي المساعدة) ، بما في ذلك حاوية السيارة الجانبية مع
لقطة خارجية .
تراقب
VolumeSnapshot
اللقطة الخارجية المذكورة كائنات
VolumeSnapshotContent
و
VolumeSnapshotContent
في خادم API ،
DeleteSnapshot
CreateSnapshot
و
DeleteSnapshot
لنقطة نهاية CSI. كما تم تحديث
dataSource
CSI
الخارجي لدعم استرداد الحجم من اللقطات باستخدام حقل
dataSource
PVC الجديد.
لدعم إمكانات اللقطة ، يُنصح مصنعي التخزين بنشر حاويات جانبية مع لقطة خارجية بالإضافة إلى مزود خارجي ، ووضع برنامج تشغيل CSI في
StatefulSet
، كما هو موضح في الرسم البياني أدناه:

في
مثال النشر هذا ، هناك حاويتان جانبيتان ، وموفر خارجي ، ولقطة خارجية ، ويتم نشر برامج تشغيل CSI مع المكون الإضافي CSI hostpath داخل حافظة StatefulSet. مسار مضيف CSI هو مكون إضافي كمثال غير مخصص للاستخدام في الإنتاج.
ما هي حدود إصدار ألفا؟
يحتوي الإصدار الأولي من تطبيق اللقطة في Kubernetes على القيود التالية:
- التراجع عن وحدة تخزين موجودة إلى حالة سابقة ممثلة بلقطة غير مدعوم (فقط توفير وحدة تخزين جديدة من اللقطة مدعوم).
- الاستعادة الموضعية غير مدعومة لـ
PersistentVolumeClaim
من اللقطة: على سبيل المثال توفير وحدة تخزين جديدة من أعمال اللقطة ، ولكن لا يتم تحديث PersistentVolumeClaim
الحالي بحيث يشير إلى وحدة تخزين جديدة ويتراجع PVC إلى حالة سابقة (فقط استخدام وحدة تخزين جديدة تم إنشاؤها من لقطة من خلال PV / PVC جديدة مدعومة). - لا تتجاوز ضمانات اتساق اللقطات الضمانات التي يوفرها نظام التخزين (على سبيل المثال ، النزاهة عند إسقاطها).
ما هي الخطوة التالية؟
يخطط فريق Kubernetes لإحضار تطبيق اللقطات لـ CSI إلى الإصدار التجريبي في الإصدارات 1.13 أو 1.14 ، اعتمادًا على التعليقات المستلمة وتكييف التكنولوجيا.
كيف تعرف المزيد من التفاصيل؟
راجع وثائق لقطة إضافية على
k8s.io/docs/concepts/storage/volume-snapshots و
kubernetes-csi.imtqy.com/docs .
ملاحظة من المترجم
اقرأ أيضا في مدونتنا: