الترحيل من فئة التخزين داخل الشجرة إلى برامج تشغيل CSI على خدمة Azure Kubernetes (AKS)

تم تقديم تنفيذ برنامج تشغيل واجهة تخزين الحاويات (CSI) في خدمة Azure Kubernetes (AKS) بدءا من الإصدار 1.21. من خلال اعتماد واستخدام CSI كمعيار، يجب ترحيل أحمال العمل الحالية ذات الحالة باستخدام وحدات التخزين الثابتة (PVs) داخل الشجرة أو ترقيتها لاستخدام برنامج تشغيل CSI.

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

قبل البدء

  • إصدار Azure CLI، 2.37.0 أو أحدث. قم بتشغيل az --version للعثور على الإصدار، ثم قم بتشغيل az upgrade لترقية الإصدار. إذا كنت بحاجة إلى التثبيت أو الترقية، فراجع تثبيت Azure CLI.
  • يمكن لمسؤولي Kubectl والكتلة الوصول إلى إنشاء أو الحصول على أو سرد أو حذف الوصول إلى PVC أو PV أو لقطة وحدة التخزين أو محتوى لقطة وحدة التخزين. بالنسبة إلى مجموعة Microsoft Entra RBAC الممكنة، أنت عضو في دور مسؤول نظام مجموعة Azure Kubernetes Service RBAC.

ترحيل وحدات تخزين القرص

إشعار

تم إهمال التسميات failure-domain.beta.kubernetes.io/zone و failure-domain.beta.kubernetes.io/region في AKS 1.24 وإزالتها في 1.28. إذا كانت وحدات التخزين الثابتة الحالية لا تزال تستخدم nodeAffinity المطابقة لهذين الوصفين، فستحتاج إلى تغييرها إلى topology.kubernetes.io/zone و topology.kubernetes.io/region التسميات في إعداد وحدة التخزين الثابتة الجديد.

يتم دعم الترحيل من داخل الشجرة إلى CSI باستخدام خيارين للترحيل:

  • إنشاء وحدة تخزين ثابتة
  • إنشاء وحدة تخزين ديناميكية

إنشاء وحدة تخزين ثابتة

باستخدام هذا الخيار، يمكنك إنشاء PV عن طريق تعيين claimRef ثابت إلى PVC جديد ستقوم بإنشائه لاحقا، وتحديد volumeName ل PersistentVolumeClaim.

رسم تخطيطي لسير عمل وحدة التخزين الثابتة.

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

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

فيما يلي اعتبارات مهمة لتقييمها:

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

الترحيل

  1. قم بتحديث PV ReclaimPolicy الموجود من Delete إلى Retain عن طريق تشغيل الأمر التالي:

    kubectl patch pv pvName -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'
    

    استبدل pvName باسم PersistentVolume المحدد. بدلا من ذلك، إذا كنت ترغب في تحديث reclaimPolicy ل PVs متعددة، قم بإنشاء ملف باسم patchReclaimPVs.sh ونسخه في التعليمات البرمجية التالية.

    #!/bin/bash
    # Patch the Persistent Volume in case ReclaimPolicy is Delete
    NAMESPACE=$1
    i=1
    for PVC in $(kubectl get pvc -n $NAMESPACE | awk '{ print $1}'); do
      # Ignore first record as it contains header
      if [ $i -eq 1 ]; then
        i=$((i + 1))
      else
        PV="$(kubectl get pvc $PVC -n $NAMESPACE -o jsonpath='{.spec.volumeName}')"
        RECLAIMPOLICY="$(kubectl get pv $PV -n $NAMESPACE -o jsonpath='{.spec.persistentVolumeReclaimPolicy}')"
        echo "Reclaim Policy for Persistent Volume $PV is $RECLAIMPOLICY"
        if [[ $RECLAIMPOLICY == "Delete" ]]; then
          echo "Updating ReclaimPolicy for $pv to Retain"
          kubectl patch pv $PV -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'
        fi
      fi
    done
    

    قم بتنفيذ البرنامج النصي مع المعلمة namespace لتحديد مساحة ./PatchReclaimPolicy.sh <namespace>اسم نظام المجموعة .

  2. احصل على قائمة بجميع أجهزة الكمبيوتر الشخصية في مساحة الاسم التي تم فرزها حسب creationTimestamp عن طريق تشغيل الأمر التالي. قم بتعيين مساحة الاسم باستخدام الوسيطة --namespace مع مساحة اسم المجموعة الفعلية.

    kubectl get pvc -n <namespace> --sort-by=.metadata.creationTimestamp -o custom-columns=NAME:.metadata.name,CreationTime:.metadata.creationTimestamp,StorageClass:.spec.storageClassName,Size:.spec.resources.requests.storage
    

    هذه الخطوة مفيدة إذا كان لديك عدد كبير من PVs التي تحتاج إلى ترحيل، وتريد ترحيل عدد قليل في كل مرة. يمكنك تشغيل هذا الأمر من تحديد أجهزة الكمبيوتر الشخصية التي تم إنشاؤها في إطار زمني معين. عند تشغيل البرنامج النصي CreatePV.sh ، فإن اثنتين من المعلمات هما وقت البدء ووقت الانتهاء الذي يمكنك من ترحيل أجهزة الكمبيوتر الشخصية فقط خلال تلك الفترة الزمنية.

  3. أنشئ ملفا باسم CreatePV.sh وانسخه في التعليمات البرمجية التالية. يقوم البرنامج النصي بالآتي:

    • إنشاء PersistentVolume جديد باسم existing-pv-csi لكافة PersistentVolumes في مساحات الأسماء لفئة storageClassNameالتخزين .
    • تكوين اسم PVC جديد ك existing-pvc-csi.
    • إنشاء PVC جديد باسم PV الذي تحدده.
    #!/bin/bash
    #kubectl get pvc -n <namespace> --sort-by=.metadata.creationTimestamp -o custom-columns=NAME:.metadata.name,CreationTime:.metadata.creationTimestamp,StorageClass:.spec.storageClassName,Size:.spec.resources.requests.storage
    # TimeFormat 2022-04-20T13:19:56Z
    NAMESPACE=$1
    FILENAME=$(date +%Y%m%d%H%M)-$NAMESPACE
    EXISTING_STORAGE_CLASS=$2
    STORAGE_CLASS_NEW=$3
    STARTTIMESTAMP=$4
    ENDTIMESTAMP=$5
    i=1
    for PVC in $(kubectl get pvc -n $NAMESPACE | awk '{ print $1}'); do
      # Ignore first record as it contains header
      if [ $i -eq 1 ]; then
        i=$((i + 1))
      else
        PVC_CREATION_TIME=$(kubectl get pvc  $PVC -n $NAMESPACE -o jsonpath='{.metadata.creationTimestamp}')
        if [[ $PVC_CREATION_TIME >= $STARTTIMESTAMP ]]; then
          if [[ $ENDTIMESTAMP > $PVC_CREATION_TIME ]]; then
            PV="$(kubectl get pvc $PVC -n $NAMESPACE -o jsonpath='{.spec.volumeName}')"
            RECLAIM_POLICY="$(kubectl get pv $PV -n $NAMESPACE -o jsonpath='{.spec.persistentVolumeReclaimPolicy}')"
            STORAGECLASS="$(kubectl get pv $PV -n $NAMESPACE -o jsonpath='{.spec.storageClassName}')"
            echo $PVC
            RECLAIM_POLICY="$(kubectl get pv $PV -n $NAMESPACE -o jsonpath='{.spec.persistentVolumeReclaimPolicy}')"
            if [[ $RECLAIM_POLICY == "Retain" ]]; then
              if [[ $STORAGECLASS == $EXISTING_STORAGE_CLASS ]]; then
                STORAGE_SIZE="$(kubectl get pv $PV -n $NAMESPACE -o jsonpath='{.spec.capacity.storage}')"
                SKU_NAME="$(kubectl get storageClass $STORAGE_CLASS_NEW -o jsonpath='{.parameters.skuname}')"
                DISK_URI="$(kubectl get pv $PV -n $NAMESPACE -o jsonpath='{.spec.azureDisk.diskURI}')"
                PERSISTENT_VOLUME_RECLAIM_POLICY="$(kubectl get pv $PV -n $NAMESPACE -o jsonpath='{.spec.persistentVolumeReclaimPolicy}')"
    
                cat >$PVC-csi.yaml <<EOF
        apiVersion: v1
        kind: PersistentVolume
        metadata:
          annotations:
            pv.kubernetes.io/provisioned-by: disk.csi.azure.com
          name: $PV-csi
        spec:
          accessModes:
          - ReadWriteOnce
          capacity:
            storage: $STORAGE_SIZE
          claimRef:
            apiVersion: v1
            kind: PersistentVolumeClaim
            name: $PVC-csi
            namespace: $NAMESPACE
          csi:
            driver: disk.csi.azure.com
            volumeAttributes:
              csi.storage.k8s.io/pv/name: $PV-csi
              csi.storage.k8s.io/pvc/name: $PVC-csi
              csi.storage.k8s.io/pvc/namespace: $NAMESPACE
              requestedsizegib: "$STORAGE_SIZE"
              skuname: $SKU_NAME
            volumeHandle: $DISK_URI
          persistentVolumeReclaimPolicy: $PERSISTENT_VOLUME_RECLAIM_POLICY
          storageClassName: $STORAGE_CLASS_NEW
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: $PVC-csi
      namespace: $NAMESPACE
    spec:
      accessModes:
        - ReadWriteOnce
      storageClassName: $STORAGE_CLASS_NEW
      resources:
        requests:
          storage: $STORAGE_SIZE
      volumeName: $PV-csi
    EOF
                kubectl apply -f $PVC-csi.yaml
                LINE="PVC:$PVC,PV:$PV,StorageClassTarget:$STORAGE_CLASS_NEW"
                printf '%s\n' "$LINE" >>$FILENAME
              fi
            fi
          fi
        fi
      fi
    done
    
  4. لإنشاء PersistentVolume جديد لكافة PersistentVolumes في مساحة الاسم، قم بتنفيذ البرنامج النصي CreatePV.sh مع المعلمات التالية:

    • namespace - مساحة اسم نظام المجموعة
    • sourceStorageClass - StorageClass المستندة إلى برنامج تشغيل التخزين داخل الشجرة
    • targetCSIStorageClass - StorageClass المستندة إلى برنامج تشغيل تخزين CSI، والتي يمكن أن تكون إحدى فئات التخزين الافتراضية التي تم تعيين التزويد عليها إلى disk.csi.azure.com أو file.csi.azure.com. أو يمكنك إنشاء فئة تخزين مخصصة طالما تم تعيينها إلى أي من هذين المزودين.
    • startTimeStamp - توفير وقت بدء قبل وقت إنشاء PVC بالتنسيق yyyy-mm-ddthh:mm:ssz
    • endTimeStamp - توفير وقت الانتهاء بالتنسيق yyyy-mm-ddthh:mm:ssz.
    ./CreatePV.sh <namespace> <sourceIntreeStorageClass> <targetCSIStorageClass> <startTimestamp> <endTimestamp>
    
  5. تحديث التطبيق الخاص بك لاستخدام PVC الجديد.

إنشاء وحدة تخزين ديناميكية

باستخدام هذا الخيار، يمكنك إنشاء وحدة تخزين ثابتة ديناميكيا من مطالبة وحدة تخزين ثابتة.

رسم تخطيطي لسير عمل وحدة التخزين الديناميكية.

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

  • إنها أقل خطورة لأنه يتم إنشاء جميع الكائنات الجديدة مع الاحتفاظ بنسخ أخرى مع اللقطات.

  • لا حاجة لإنشاء PVs بشكل منفصل وإضافة اسم وحدة التخزين في بيان PVC.

فيما يلي اعتبارات مهمة لتقييمها:

  • في حين أن هذا الأسلوب أقل خطورة، فإنه ينشئ كائنات متعددة من شأنها أن تزيد من تكاليف التخزين الخاصة بك.

  • أثناء إنشاء وحدة (وحدات) التخزين الجديدة، لا يتوفر التطبيق الخاص بك.

  • يجب تنفيذ خطوات الحذف بحذر. يمكن تطبيق تأمينات الموارد المؤقتة على مجموعة الموارد الخاصة بك حتى يكتمل الترحيل ويتم التحقق من التطبيق الخاص بك بنجاح.

  • إجراء التحقق من صحة البيانات/التحقق منها حيث يتم إنشاء أقراص جديدة من اللقطات.

الترحيل

قبل المتابعة، تحقق مما يلي:

  • بالنسبة لأحمال العمل المحددة حيث تتم كتابة البيانات إلى الذاكرة قبل كتابتها على القرص، يجب إيقاف التطبيق والسماح بمسح البيانات الموجودة في الذاكرة إلى القرص.

  • VolumeSnapshot يجب أن تكون الفئة موجودة كما هو موضح في المثال التالي YAML:

    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshotClass
    metadata:
      name: custom-disk-snapshot-sc
    driver: disk.csi.azure.com
    deletionPolicy: Delete
    parameters:
      incremental: "false"
    
  1. احصل على قائمة بجميع أجهزة الكمبيوتر الشخصية في مساحة اسم محددة تم فرزها حسب creationTimestamp عن طريق تشغيل الأمر التالي. قم بتعيين مساحة الاسم باستخدام الوسيطة --namespace مع مساحة اسم المجموعة الفعلية.

    kubectl get pvc --namespace <namespace> --sort-by=.metadata.creationTimestamp -o custom-columns=NAME:.metadata.name,CreationTime:.metadata.creationTimestamp,StorageClass:.spec.storageClassName,Size:.spec.resources.requests.storage
    

    هذه الخطوة مفيدة إذا كان لديك عدد كبير من PVs التي تحتاج إلى ترحيل، وتريد ترحيل عدد قليل في كل مرة. يمكنك تشغيل هذا الأمر من تحديد أجهزة الكمبيوتر الشخصية التي تم إنشاؤها في إطار زمني معين. عند تشغيل البرنامج النصي MigrateCSI.sh ، فإن اثنتين من المعلمات هما وقت البدء ووقت الانتهاء الذي يمكنك من ترحيل أجهزة الكمبيوتر الشخصية فقط خلال تلك الفترة الزمنية.

  2. أنشئ ملفا باسم MigrateToCSI.sh وانسخه في التعليمات البرمجية التالية. يقوم البرنامج النصي بالآتي:

    • إنشاء لقطة قرص كاملة باستخدام Azure CLI
    • يخلق VolumesnapshotContent
    • يخلق VolumeSnapshot
    • إنشاء PVC جديد من VolumeSnapshot
    • إنشاء ملف جديد باسم الملف <namespace>-timestampالذي يحتوي على قائمة بجميع الموارد القديمة التي تحتاج إلى تنظيف.
    #!/bin/bash
    #kubectl get pvc -n <namespace> --sort-by=.metadata.creationTimestamp -o custom-columns=NAME:.metadata.name,CreationTime:.metadata.creationTimestamp,StorageClass:.spec.storageClassName,Size:.spec.resources.requests.storage
    # TimeFormat 2022-04-20T13:19:56Z
    NAMESPACE=$1
    FILENAME=$NAMESPACE-$(date +%Y%m%d%H%M)
    EXISTING_STORAGE_CLASS=$2
    STORAGE_CLASS_NEW=$3
    VOLUME_STORAGE_CLASS=$4
    START_TIME_STAMP=$5
    END_TIME_STAMP=$6
    i=1
    for PVC in $(kubectl get pvc -n $NAMESPACE | awk '{ print $1}'); do
      # Ignore first record as it contains header
      if [ $i -eq 1 ]; then
        i=$((i + 1))
      else
        PVC_CREATION_TIME=$(kubectl get pvc $PVC -n $NAMESPACE -o jsonpath='{.metadata.creationTimestamp}')
        if [[ $PVC_CREATION_TIME > $START_TIME_STAMP ]]; then
          if [[ $END_TIME_STAMP > $PVC_CREATION_TIME ]]; then
            PV="$(kubectl get pvc $PVC -n $NAMESPACE -o jsonpath='{.spec.volumeName}')"
            RECLAIM_POLICY="$(kubectl get pv $PV -n $NAMESPACE -o jsonpath='{.spec.persistentVolumeReclaimPolicy}')"
            STORAGE_CLASS="$(kubectl get pv $PV -n $NAMESPACE -o jsonpath='{.spec.storageClassName}')"
            echo $PVC
            RECLAIM_POLICY="$(kubectl get pv $PV -n $NAMESPACE -o jsonpath='{.spec.persistentVolumeReclaimPolicy}')"
            if [[ $STORAGE_CLASS == $EXISTING_STORAGE_CLASS ]]; then
              STORAGE_SIZE="$(kubectl get pv $PV -n $NAMESPACE -o jsonpath='{.spec.capacity.storage}')"
              SKU_NAME="$(kubectl get storageClass $STORAGE_CLASS_NEW -o jsonpath='{.parameters.skuname}')"
              DISK_URI="$(kubectl get pv $PV -n $NAMESPACE -o jsonpath='{.spec.azureDisk.diskURI}')"
              TARGET_RESOURCE_GROUP="$(cut -d'/' -f5 <<<"$DISK_URI")"
              echo $DISK_URI
              SUBSCRIPTION_ID="$(echo $DISK_URI | grep -o 'subscriptions/[^/]*' | sed 's#subscriptions/##g')"
              echo $TARGET_RESOURCE_GROUP
              PERSISTENT_VOLUME_RECLAIM_POLICY="$(kubectl get pv $PV -n $NAMESPACE -o jsonpath='{.spec.persistentVolumeReclaimPolicy}')"
              az snapshot create --resource-group $TARGET_RESOURCE_GROUP --name $PVC-$FILENAME --source "$DISK_URI" --subscription ${SUBSCRIPTION_ID}
              SNAPSHOT_PATH=$(az snapshot list --resource-group $TARGET_RESOURCE_GROUP --query "[?name == '$PVC-$FILENAME'].id | [0]" --subscription ${SUBSCRIPTION_ID})
              SNAPSHOT_HANDLE=$(echo "$SNAPSHOT_PATH" | tr -d '"')
              echo $SNAPSHOT_HANDLE
              sleep 10
              # Create Restore File
              cat <<EOF >$PVC-csi.yml
        apiVersion: snapshot.storage.k8s.io/v1
        kind: VolumeSnapshotContent
        metadata:
          name: $PVC-$FILENAME
        spec:
          deletionPolicy: 'Delete'
          driver: 'disk.csi.azure.com'
          volumeSnapshotClassName: $VOLUME_STORAGE_CLASS
          source:
            snapshotHandle: $SNAPSHOT_HANDLE
          volumeSnapshotRef:
            apiVersion: snapshot.storage.k8s.io/v1
            kind: VolumeSnapshot
            name: $PVC-$FILENAME
            namespace: $1
    ---
        apiVersion: snapshot.storage.k8s.io/v1
        kind: VolumeSnapshot
        metadata:
          name: $PVC-$FILENAME
          namespace: $1
        spec:
          volumeSnapshotClassName: $VOLUME_STORAGE_CLASS
          source:
            volumeSnapshotContentName: $PVC-$FILENAME
    ---
        apiVersion: v1
        kind: PersistentVolumeClaim
        metadata:
          name: csi-$PVC
          namespace: $1
        spec:
          accessModes:
          - ReadWriteOnce
          storageClassName: $STORAGE_CLASS_NEW
          resources:
            requests:
              storage: $STORAGE_SIZE
          dataSource:
            name: $PVC-$FILENAME
            kind: VolumeSnapshot
            apiGroup: snapshot.storage.k8s.io
    
    EOF
              kubectl create -f $PVC-csi.yml
              LINE="OLDPVC:$PVC,OLDPV:$PV,VolumeSnapshotContent:volumeSnapshotContent-$FILENAME,VolumeSnapshot:volumesnapshot$FILENAME,OLDdisk:$DISK_URI"
              printf '%s\n' "$LINE" >>$FILENAME
            fi
          fi
        fi
      fi
    done
    
  3. لترحيل وحدات تخزين القرص، قم بتنفيذ البرنامج النصي MigrateToCSI.sh مع المعلمات التالية:

    • namespace - مساحة اسم نظام المجموعة
    • sourceStorageClass - StorageClass المستندة إلى برنامج تشغيل التخزين داخل الشجرة
    • targetCSIStorageClass - فئة التخزين المستندة إلى برنامج تشغيل تخزين CSI
    • volumeSnapshotClass - اسم فئة لقطة وحدة التخزين. على سبيل المثال، custom-disk-snapshot-sc
    • startTimeStamp - توفير وقت بدء بالتنسيق yyyy-mm-ddthh:mm:ssz.
    • endTimeStamp - توفير وقت الانتهاء بالتنسيق yyyy-mm-ddthh:mm:ssz.
    ./MigrateToCSI.sh <namespace> <sourceStorageClass> <TargetCSIstorageClass> <VolumeSnapshotClass> <startTimestamp> <endTimestamp>
    
  4. تحديث التطبيق الخاص بك لاستخدام PVC الجديد.

  5. احذف الموارد القديمة يدويا بما في ذلك PVC/PV داخل الشجرة و VolumeSnapshot و VolumeSnapshotContent. وإلا، فإن الحفاظ على PVC/PC في الشجرة وعناصر اللقطة سيولد المزيد من التكلفة.

ترحيل وحدات تخزين مشاركة الملف

يتم دعم الترحيل من داخل الشجرة إلى CSI عن طريق إنشاء وحدة تخزين ثابتة:

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

الترحيل

  1. قم بتحديث PV ReclaimPolicy الموجود من Delete إلى Retain عن طريق تشغيل الأمر التالي:

    kubectl patch pv pvName -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'
    

    استبدل pvName باسم PersistentVolume المحدد. بدلا من ذلك، إذا كنت ترغب في تحديث reclaimPolicy ل PVs متعددة، قم بإنشاء ملف باسم patchReclaimPVs.sh ونسخه في التعليمات البرمجية التالية.

    #!/bin/bash
    # Patch the Persistent Volume in case ReclaimPolicy is Delete
    namespace=$1
    i=1
    for pvc in $(kubectl get pvc -n $namespace | awk '{ print $1}'); do
      # Ignore first record as it contains header
      if [ $i -eq 1 ]; then
        i=$((i + 1))
      else
        pv="$(kubectl get pvc $pvc -n $namespace -o jsonpath='{.spec.volumeName}')"
        reclaimPolicy="$(kubectl get pv $pv -n $namespace -o jsonpath='{.spec.persistentVolumeReclaimPolicy}')"
        echo "Reclaim Policy for Persistent Volume $pv is $reclaimPolicy"
        if [[ $reclaimPolicy == "Delete" ]]; then
          echo "Updating ReclaimPolicy for $pv to Retain"
          kubectl patch pv $pv -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'
        fi
      fi
    done
    

    قم بتنفيذ البرنامج النصي مع المعلمة namespace لتحديد مساحة ./PatchReclaimPolicy.sh <namespace>اسم نظام المجموعة .

  2. قم بإنشاء فئة تخزين جديدة مع تعيين التزويد إلى file.csi.azure.com، أو يمكنك استخدام إحدى فئات التخزين الافتراضية مع توفير ملف CSI.

  3. احصل على secretName و shareName من PersistentVolumes الموجودة عن طريق تشغيل الأمر التالي:

    kubectl describe pv pvName
    
  4. قم بإنشاء PV جديد باستخدام StorageClass الجديد، و و shareName secretName من PV داخل الشجرة. أنشئ ملفا باسم azurefile-mount-pv.yaml وانسخه في التعليمات البرمجية التالية. ضمن csi، حدِّث resourceGroup وvolumeHandle وshareName. بالنسبة لخيارات التحميل، القيمة الافتراضية ل fileMode وdirMode هي 0777.

    القيمة الافتراضية ل fileMode و dirMode هي 0777.

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      annotations:
        pv.kubernetes.io/provisioned-by: file.csi.azure.com
      name: azurefile
    spec:
      capacity:
        storage: 5Gi
      accessModes:
        - ReadWriteMany
      persistentVolumeReclaimPolicy: Retain
      storageClassName: azurefile-csi
      csi:
        driver: file.csi.azure.com
        readOnly: false
        volumeHandle: unique-volumeid  # make sure volumeid is unique for every identical share in the cluster
        volumeAttributes:
          resourceGroup: EXISTING_RESOURCE_GROUP_NAME  # optional, only set this when storage account is not in the same resource group as the cluster nodes
          shareName: aksshare
        nodeStageSecretRef:
          name: azure-secret
          namespace: default
      mountOptions:
        - dir_mode=0777
        - file_mode=0777
        - uid=0
        - gid=0
        - mfsymlinks
        - cache=strict
        - nosharesock
        - nobrl  # disable sending byte range lock requests to the server and for applications which have challenges with posix locks
    
  5. أنشئ ملفا باسم ملف azurefile-mount-pvc.yaml باستخدام PersistentVolumeClaim يستخدم PersistentVolume باستخدام التعليمات البرمجية التالية.

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: azurefile
    spec:
      accessModes:
        - ReadWriteMany
      storageClassName: azurefile-csi
      volumeName: azurefile
      resources:
        requests:
          storage: 5Gi
    
  6. kubectl استخدم الأمر لإنشاء PersistentVolume.

    kubectl apply -f azurefile-mount-pv.yaml
    
  7. kubectl استخدم الأمر لإنشاء PersistentVolumeClaim.

    kubectl apply -f azurefile-mount-pvc.yaml
    
  8. تحقق من إنشاء PersistentVolumeClaim وربطه ب PersistentVolume عن طريق تشغيل الأمر التالي.

    kubectl get pvc azurefile
    

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

    NAME        STATUS   VOLUME      CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    azurefile   Bound    azurefile   5Gi        RWX            azurefile      5s
    
  9. قم بتحديث مواصفات الحاوية للإشارة إلى PersistentVolumeClaim وتحديث الجراب الخاص بك. على سبيل المثال، انسخ التعليمات البرمجية التالية وأنشئ ملفا باسم azure-files-pod.yaml.

    ...
      volumes:
      - name: azure
        persistentVolumeClaim:
          claimName: azurefile
    
  10. لا يمكن تحديث مواصفات الجراب في مكانها. استخدم الأوامر التالية kubectl لحذف ثم إعادة إنشاء الجراب.

    kubectl delete pod mypod
    
    kubectl apply -f azure-files-pod.yaml
    

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