استخدم برنامج تشغيل واجهة تخزين حاوية ملفات Azure (CSI) في خدمة Azure Kubernetes (AKS)

برنامج تشغيل Azure Files Container Storage Interface (CSI) هو برنامج تشغيل متوافق مع مواصفات CSI تستخدمه خدمة Azure Kubernetes (AKS) لإدارة دورة حياة مشاركات ملفات Azure. منظمة التضامن المسيحي الدولية هو معيار لفضح كتلة التعسفي وأنظمة تخزين الملفات لأعباء العمل في حاويات على Kubernetes.

من خلال اعتماد واستخدام CSI، يمكن لـ AKS الآن كتابة وتوزيع وتكرار المكونات الإضافية لكشف أنظمة التخزين الجديدة أو تحسين أنظمة التخزين الحالية في Kubernetes. يؤدي استخدام برامج تشغيل CSI في AKS إلى تجنب الاضطرار إلى لمس التعليمات البرمجية الأساسية لـ Kubernetes وانتظار دورات الإصدار الخاصة به.

لإنشاء مجموعة AKS باستخدام دعم برامج تشغيل CSI، قم بمراجعة تمكين برامج تشغيل CSI على AKS.

إشعار

تشير برامج التشغيل في شجرة إلى برامج تشغيل التخزين الحالية التي هي جزء من تعليمة برمجية لـ Kubernetes أساسية مقابل برامج تشغيل CSI الجديدة، وهي مكونات إضافية.

ميزات برنامج تشغيل Azure Files CSI الجديدة

بالإضافة إلى ميزات برنامج التشغيل الأصلي داخل الشجرة، يقوم برنامج تشغيل Azure Files CSI بدعم الميزات الجديدة التالية:

استخدم وحدة تخزين ثابتة مع ملفات Azure

تمثل وحدة التخزين الثابتة (PV) قطعة تخزين يتم توفيرها للاستخدام مع قرون Kubernetes. يمكن استخدام PV من قبل واحد أو العديد من القرون ويمكن توفيرها ديناميكيا أو ثابتا. إذا كانت الحاويات المتعددة بحاجة إلى وصول متزامن إلى نفس وحدة التخزين، فيمكنك استخدام ملفات Azure للاتصال باستخدام بروتوكول Server Message Block (SMB) أو بروتوكول NFS. توضح لك هذه المقالة كيفية إنشاء مشاركة لملفات Azure بشكل ديناميكي لاستخدامها من قبل عدة مجموعات في مجموعة AKS. للتوفير الثابت، راجع إنشاء واستخدام وحدة تخزين يدويًا باستخدام مشاركة ملفات Azure .

إشعار

يرجى العلم أن برنامج تشغيل Azure File CSI يسمح فقط بتحميل مشاركات ملفات SMB باستخدام المصادقة المستندة إلى المفتاح (NTLM v2)، وبالتالي لا يدعم الحد الأقصى لملف تعريف الأمان لإعدادات مشاركة ملف Azure. من ناحية أخرى، لا يتطلب تحميل مشاركات ملفات NFS مصادقة تستند إلى المفتاح.

مع مشاركات Azure Files، لا يوجد حد لعدد الملفات التي يمكن تحميلها على عقدة.

لمزيد من المعلومات حول وحدات تخزين Kubernetes، راجع خيارات التخزين للتطبيقات في AKS .

قم بإنشاء Azure Files PVs ديناميكيًا باستخدام فئات التخزين المبنية

يتم استخدام فئة التخزين لتحديد كيفية إنشاء مشاركة ملف Azure. يتم إنشاء حساب تخزين تلقائيا في مجموعة موارد العقدة للاستخدام مع فئة التخزين للاحتفاظ بمشاركة ملفات Azure. اختر أحد وحدات SKU الخاصة بتكرار تخزين Azure لـ skuName:

  • Standard_LRS : تخزين قياسي محلي إضافي
  • Standard_GRS : تخزين قياسي متكرر جغرافيًا
  • Standard_ZRS : مساحة تخزين احتياطية قياسية
  • Standard_RAGRS : تخزين قياسي مكرر جغرافيًا يمكن الوصول إليه للقراءة
  • Standard_RAGRS : مساحة تخزين زائدة عن الحاجة للمنطقة الجغرافية للوصول للقراءة
  • Premium_LRS : مساحة تخزين متميزة وفائضة محليًا
  • Premium_ZRS- مساحة تخزين ممتازة زائدة عن الحاجة

إشعار

تدعم Azure Files مشاركات ملفات Azure Premium. الحد الأدنى لسعة مشاركة الملف هو 100 جيبي بايت. نوصي باستخدام مشاركات ملفات Azure Premium بدلا من مشاركات الملفات القياسية لأن مشاركات الملفات المتميزة تقدم أداء أعلى ودعم قرص زمن انتقال منخفض لأحمال العمل كثيفة الإدخال/الإخراج.

عند استخدام برامج تشغيل التخزين CSI على AKS، هناك اثنان إضافيان مضمنان StorageClasses يستخدمان برامج تشغيل تخزين Azure Files CSI. يتم إنشاء فئات تخزين CSI الأخرى باستخدام الكتلة جنبًا إلى جنب مع فئات التخزين الافتراضية داخل الشجرة.

  • azurefile-csi: يستخدم Azure Standard Storage لإنشاء مشاركة ملف Azure.
  • azurefile-csi-premium: يستخدم Azure Premium Storage لإنشاء مشاركة ملف Azure.

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

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

قم بإنشاء نموذج PVC وحاوية تقوم بطباعة التاريخ الحالي في outfile عن طريق تشغيل أوامر kubectl apply:

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azurefile-csi-driver/master/deploy/example/pvc-azurefile-csi.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azurefile-csi-driver/master/deploy/example/nginx-pod-azurefile.yaml

إخراج الأمر يشبه المثال التالي:

persistentvolumeclaim/pvc-azurefile created
pod/nginx-azurefile created

بعد أن تكون الكبسولة في حالة التشغيل، يمكنك التحقق من أن مشاركة الملف قد تم تحميلها بشكل صحيح عن طريق تشغيل الأمر التالي والتحقق من احتواء الإخراج على outfile:

kubectl exec nginx-azurefile -- ls -l /mnt/azurefile

إخراج الأمر يشبه المثال التالي:

total 29
-rwxrwxrwx 1 root root 29348 Aug 31 21:59 outfile

إنشاء فئة تخزين مخصصة

تناسب فئات التخزين الافتراضية السيناريوهات الأكثر شيوعا، ولكن ليس كلها. بالنسبة لبعض الحالات، قد ترغب في تخصيص فئة التخزين الخاصة بك مع المعلمات الخاصة بك. على سبيل المثال، استخدم البيان التالي لتكوين mountOptions مشاركة الملف.

القيمة الافتراضية لـ file Mode وdir Mode هي 0777 لمشاركات الملفات المحملة على Kubernetes. يمكنك تحديد خيارات التحميل المختلفة على كائن فئة التخزين.

قم بإنشاء ملف باسم azure-file-sc.yaml، والصق مثال البيان التالي:

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: my-azurefile
provisioner: file.csi.azure.com
reclaimPolicy: Delete
volumeBindingMode: Immediate
allowVolumeExpansion: true
mountOptions:
  - dir_mode=0640
  - file_mode=0640
  - uid=0
  - gid=0
  - mfsymlinks
  - cache=strict # https://linux.die.net/man/8/mount.cifs
  - nosharesock
parameters:
  skuName: Standard_LRS

قم بإنشاء فئة التخزين باستخدام الأمر kubectl apply:

kubectl apply -f azure-file-sc.yaml

إخراج الأمر يشبه المثال التالي:

storageclass.storage.k8s.io/my-azurefile created

يدعم برنامج تشغيل Azure Files CSI إنشاء لقطات لوحدات التخزين الثابتة ومشاركات الملفات الأساسية.

أنشئ فئة لقطة وحدة التخزين باستخدام الأمر kubectl apply :

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azurefile-csi-driver/master/deploy/example/snapshot/volumesnapshotclass-azurefile.yaml

إخراج الأمر يشبه المثال التالي:

volumesnapshotclass.snapshot.storage.k8s.io/csi-azurefile-vsc created

أنشئ لقطة وحدة تخزين من PVC أنشأناها ديناميكيًا في بداية هذا البرنامج التعليمي ، pvc-azurefile.

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azurefile-csi-driver/master/deploy/example/snapshot/volumesnapshot-azurefile.yaml

إخراج الأمر يشبه المثال التالي:

volumesnapshot.snapshot.storage.k8s.io/azurefile-volume-snapshot created

قم بالتحقق من إنشاء اللقطة بشكل صحيح عن طريق تشغيل الأمر التالي:

kubectl describe volumesnapshot azurefile-volume-snapshot

إخراج الأمر يشبه المثال التالي:

Name:         azurefile-volume-snapshot
Namespace:    default
Labels:       <none>
Annotations:  API Version:  snapshot.storage.k8s.io/v1beta1
Kind:         VolumeSnapshot
Metadata:
  Creation Timestamp:  2020-08-27T22:37:41Z
  Finalizers:
    snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection
    snapshot.storage.kubernetes.io/volumesnapshot-bound-protection
  Generation:        1
  Resource Version:  955091
  Self Link:         /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/azurefile-volume-snapshot
  UID:               c359a38f-35c1-4fb1-9da9-2c06d35ca0f4
Spec:
  Source:
    Persistent Volume Claim Name:  pvc-azurefile
  Volume Snapshot Class Name:      csi-azurefile-vsc
Status:
  Bound Volume Snapshot Content Name:  snapcontent-c359a38f-35c1-4fb1-9da9-2c06d35ca0f4
  Ready To Use:                        false
Events:                                <none>

تغيير حجم وحدة تخزين ثابتة

يمكنك طلب حجم أكبر لـ PVC. تحرير الكائن PVC، وتحديد حجم أكبر. يؤدي هذا التغيير إلى توسيع وحدة التخزين الأساسية التي تدعم PV.

إشعار

لا يتم إنشاء PV جديدة لتلبية المطالبة. بدلا من ذلك، يتم حجم وحدة تخزين موجودة.

تقليص وحدات التخزين الثابتة غير مدعوم حاليا.

في AKS، تدعم فئة التخزين azurefile-csi المدمجة التوسيع بالفعل، لذا استخدم PVC الذي تم إنشاؤه مسبقًا مع فئة التخزين هذه . طلب PVC مشاركة ملف 100 GiB. يمكننا أن نؤكد ذلك عن طريق تشغيل:

kubectl exec -it nginx-azurefile -- df -h /mnt/azurefile

إخراج الأمر يشبه المثال التالي:

Filesystem                                                                                Size  Used Avail Use% Mounted on
//f149b5a219bd34caeb07de9.file.core.windows.net/pvc-5e5d9980-da38-492b-8581-17e3cad01770  100G  128K  100G   1% /mnt/azurefile

قم بتوسيع PVC عن طريق زيادة الحقل spec.resources.requests.storage:

kubectl patch pvc pvc-azurefile --type merge --patch '{"spec": {"resources": {"requests": {"storage": "200Gi"}}}}'

إخراج الأمر يشبه المثال التالي:

persistentvolumeclaim/pvc-azurefile patched

تحقق من أن كلاً من PVC ونظام الملفات داخل الكبسولة يظهران الحجم الجديد:

kubectl get pvc pvc-azurefile
NAME            STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS    AGE
pvc-azurefile   Bound    pvc-5e5d9980-da38-492b-8581-17e3cad01770   200Gi      RWX            azurefile-csi   64m

kubectl exec -it nginx-azurefile -- df -h /mnt/azurefile
Filesystem                                                                                Size  Used Avail Use% Mounted on
//f149b5a219bd34caeb07de9.file.core.windows.net/pvc-5e5d9980-da38-492b-8581-17e3cad01770  200G  128K  200G   1% /mnt/azurefile

استخدام وحدة تخزين ثابتة مع تخزين ملفات Azure الخاصة (نقطة نهاية خاصة)

إذا كانت موارد Azure Files محمية بنقطة نهاية خاصة، فيجب عليك إنشاء فئة التخزين الخاصة بك. تأكد من تكوين إعدادات DNS لحل عنوان IP لنقطة النهاية الخاصة إلى FQDN سلسلة الاتصال. تخصيص المعلمات التالية:

  • resourceGroupمجموعة الموارد التي يتم نشر حساب التخزين فيها.
  • storageAccount: اسم حساب التخزين.
  • server: FQDN لنقطة النهاية الخاصة لحساب التخزين.

أنشئ ملفا باسم private-azure-file-sc.yaml، ثم الصق بيان المثال التالي في الملف. استبدل قيم <resourceGroup> و<storageAccountName>.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: private-azurefile-csi
provisioner: file.csi.azure.com
allowVolumeExpansion: true
parameters:
  resourceGroup: <resourceGroup>
  storageAccount: <storageAccountName>
  server: <storageAccountName>.file.core.windows.net
reclaimPolicy: Delete
volumeBindingMode: Immediate
mountOptions:
  - dir_mode=0777
  - file_mode=0777
  - uid=0
  - gid=0
  - mfsymlinks
  - cache=strict  # https://linux.die.net/man/8/mount.cifs
  - nosharesock  # reduce probability of reconnect race
  - actimeo=30  # reduce latency for metadata-heavy workload

إنشاء فئة التخزين باستخدام kubectl apply الأمر :

kubectl apply -f private-azure-file-sc.yaml

إخراج الأمر يشبه المثال التالي:

storageclass.storage.k8s.io/private-azurefile-csi created

أنشئ ملفا باسم private-pvc.yaml، ثم الصق بيان المثال التالي في الملف:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: private-azurefile-pvc
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: private-azurefile-csi
  resources:
    requests:
      storage: 100Gi

قم بإنشاء PVC باستخدام الأمر kubectl apply :

kubectl apply -f private-pvc.yaml

مشاركات ملفات NFS

تدعم ملفات Azure بروتوكول NFS v4.1 . يوفر لك دعم الإصدار 4.1 من NFS لملفات Azure نظام ملفات NFS مُدار بالكامل كخدمة مبنية على نظام أساسي للتخزين مرن ومتوفر للغاية وموزع للغاية.

تم تحسين هذا الخيار لأحمال عمل الوصول العشوائي مع تحديثات البيانات الموضعية ويوفر دعمًا كاملاً لنظام ملفات POSIX. يوضح لك هذا القسم كيفية استخدام مشاركات NFS مع برنامج تشغيل Azure File CSI على مجموعة AKS.

المتطلبات الأساسية

  • تتم إضافة هوية وحدة التحكم في نظام مجموعة AKS (أي اسم مجموعة AKS) إلى دور المساهم على VNet وNetworkSecurityGroup.
  • يجب إضافة كيان خدمة نظام مجموعة AKS أو هوية الخدمة المدارة (MSI) إلى دور المساهم في حساب التخزين.

إشعار

يمكنك استخدام نقطة نهاية خاصة بدلا من السماح بالوصول إلى VNet المحددة.

تحسين خيارات حجم القراءة والكتابة

يوفر هذا القسم معلومات حول كيفية التعامل مع ضبط الأداء NFS مع برنامج تشغيل Azure Files CSI مع خيارات rsize وwsize. تحدد خيارات rsize وwsize الحد الأقصى لحجم النقل لعملية NFS. إذا لم يتم تحديد rsize أو wsize عند التحميل، يتفاوض العميل والخادم على أكبر حجم يدعمه الاثنين. حاليا، تدعم كل من ملفات Azure NetApp وتوزيعات Linux الحديثة أحجام القراءة والكتابة بحجم 1,048,576 بايت (1 ميبي بايت).

يعتمد الأداء الأمثل على اتصال فعال بين العميل والخادم. يمكن أن تؤدي زيادة قيم حجم خيار القراءة والكتابة أو تقليلها إلى تحسين أداء NFS. الحجم الافتراضي لحزم القراءة/الكتابة المنقولة بين العميل والخادم هو 8 كيلوبايت للإصدار 2 من NFS، و32 كيلوبايت للإصدارين 3 و4 من NFS. قد تكون هذه الإعدادات الافتراضية كبيرة جدا أو صغيرة جدا. قد يؤدي تقليل rsize وwsize إلى تحسين أداء NFS في شبكة ازدحام عن طريق إرسال حزم أصغر لكل طلب قراءة وكتابة NFS. ومع ذلك، يمكن أن يزيد هذا من عدد الحزم اللازمة لإرسال البيانات عبر الشبكة، ما يزيد من إجمالي نسبة استخدام الشبكة واستخدام وحدة المعالجة المركزية على العميل والخادم.

من المهم إجراء الاختبار للعثور على rsize وwsize الذي يحافظ على نقل الحزمة efficent، حيث لا يقلل من معدل النقل ويزيد من زمن الانتقال.

لمزيد من المعلومات حول تحسين rsize وwsize، راجع أفضل ممارسات خيارات تحميل Linux NFS لملفات Azure NetApp.

على سبيل المثال، لتكوين rsize وwsize كحد أقصى من 256-KiB، قم بتكوين mountOptions في فئة التخزين كما يلي:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: azurefile-csi-nfs
provisioner: file.csi.azure.com
allowVolumeExpansion: true
parameters:
  protocol: nfs
mountOptions:
  - nconnect=4
  - noresvport
  - actimeo=30
  - rsize=262144
  - wsize=262144

أنشئ فئة تخزين مشاركة ملف NFS

قم بإنشاء ملف باسمnfs-sc.yaml وانسخ البيان أدناه. للحصول على قائمة بخيارات التحميل المدعومة mountOptions، راجع خيارات تحميل NFS.

إشعار

vers، minorversionsec يتم تكوينها بواسطة برنامج تشغيل Azure File CSI. تحديد قيمة في البيان الخاص بك لهذه الخصائص غير مدعوم.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: azurefile-csi-nfs
provisioner: file.csi.azure.com
allowVolumeExpansion: true
parameters:
  protocol: nfs
mountOptions:
  - nconnect=4
  - noresvport
  - actimeo=30

بعد تحرير الملف وحفظه، أنشئ فئة التخزين باستخدام الأمر kubectl apply:

kubectl apply -f nfs-sc.yaml

إخراج الأمر يشبه المثال التالي:

storageclass.storage.k8s.io/azurefile-csi-nfs created

إنشاء عملية نشر مع مشاركة ملف مدعومة من NFS

يمكنك نشر مثال مجموعة ذات حالة توفر الطوابع الزمنية في ملف data.txt باستخدام الأمر kubectl apply :

kubectl apply -f

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: statefulset-azurefile
  labels:
    app: nginx
spec:
  podManagementPolicy: Parallel  # default is OrderedReady
  serviceName: statefulset-azurefile
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      nodeSelector:
        "kubernetes.io/os": linux
      containers:
        - name: statefulset-azurefile
          image: mcr.microsoft.com/oss/nginx/nginx:1.19.5
          command:
            - "/bin/bash"
            - "-c"
            - set -euo pipefail; while true; do echo $(date) >> /mnt/azurefile/outfile; sleep 1; done
          volumeMounts:
            - name: persistent-storage
              mountPath: /mnt/azurefile
  updateStrategy:
    type: RollingUpdate
  selector:
    matchLabels:
      app: nginx
  volumeClaimTemplates:
    - metadata:
        name: persistent-storage
      spec:
        storageClassName: azurefile-csi-nfs
        accessModes: ["ReadWriteMany"]
        resources:
          requests:
            storage: 100Gi

إخراج الأمر يشبه المثال التالي:

statefulset.apps/statefulset-azurefile created

تحقق من صحة محتويات المجلد عن طريق تشغيل الأمر التالي:

kubectl exec -it statefulset-azurefile-0 -- df -h

إخراج الأمر يشبه المثال التالي:

Filesystem      Size  Used Avail Use% Mounted on
...
/dev/sda1                                                                                 29G   11G   19G  37% /etc/hosts
accountname.file.core.windows.net:/accountname/pvc-fa72ec43-ae64-42e4-a8a2-556606f5da38  100G     0  100G   0% /mnt/azurefile
...

إشعار

لاحظ أنه نظرا لوجود مشاركة ملف NFS في حساب Premium، فإن الحد الأدنى لحجم مشاركة الملف هو 100 جيبي بايت. إذا قمت بإنشاء PVC بحجم تخزين صغير، فقد تواجه خطأ مشابهًا لما يلي: فشل في إنشاء مشاركة ملف ... الحجم (5) .....

حاويات Windows

يدعم برنامج تشغيل Azure Files CSI أيضًا عُقد وحاويات Windows. لاستخدام حاويات Windows، اتبع التشغيل السريع لحاويات Windows لإضافة تجمع عقدة Windows.

بعد أن يكون لديك تجمع عقدة Windows، استخدم فئات التخزين المضمنة مثلazurefile-csi أو أنشئ مجموعة مخصصة. يمكنك توزيع نموذج لمجموعة الحالة المستندة إلى Windows والتي تحفظ الطوابع الزمنية في ملف data.txt عن طريق تشغيل الأمر kubectl apply:

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azurefile-csi-driver/master/deploy/example/windows/statefulset.yaml

إخراج الأمر يشبه المثال التالي:

statefulset.apps/busybox-azurefile created

تحقق من صحة محتويات المجلد عن طريق تشغيل الأمر kubectl exec التالي:

kubectl exec -it busybox-azurefile-0 -- cat c:\\mnt\\azurefile\\data.txt # on Linux/MacOS Bash
kubectl exec -it busybox-azurefile-0 -- cat c:\mnt\azurefile\data.txt # on Windows Powershell/CMD

إخراج الأوامر يشبه المثال التالي:

2020-08-27 22:11:01Z
2020-08-27 22:11:02Z
2020-08-27 22:11:04Z
(...)

الخطوات التالية