إدخال الإصدار ألفا من لقطات الحجم في Kubernetes



ملاحظة 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 .

ملاحظة من المترجم


اقرأ أيضا في مدونتنا:

Source: https://habr.com/ru/post/ar426133/


All Articles