Bagikan melalui


Migrasi dari kelas penyimpanan di pohon ke driver CSI di Azure Kubernetes Service (AKS)

Implementasi driver Container Storage Interface (CSI) diperkenalkan di Azure Kubernetes Service (AKS) yang dimulai dengan versi 1.21. Dengan mengadopsi dan menggunakan CSI sebagai standar, beban kerja stateful Anda yang ada menggunakan Volume Persisten (PV) in-tree harus dimigrasikan atau ditingkatkan untuk menggunakan driver CSI.

Untuk mempermudah proses ini, dan untuk memastikan tidak ada kehilangan data, artikel ini menyediakan opsi migrasi yang berbeda. Opsi ini termasuk skrip untuk membantu memastikan kelancaran migrasi dari driver CSI in-tree ke Azure Disks dan Azure Files.

Sebelum Anda mulai

  • Azure CLI versi 2.37.0 atau lebih baru. Jalankan az --version untuk menemukan versi, dan jalankan az upgrade untuk meningkatkan versi. Jika Anda perlu memasang atau meningkatkan, lihat Memasang Azure CLI.
  • Administrator Kubectl dan kluster memiliki akses untuk membuat, mendapatkan, mencantumkan, menghapus akses ke PVC atau PV, rekam jepret volume, atau konten rekam jepret volume. Untuk kluster yang diaktifkan Microsoft Entra RBAC, Anda adalah anggota peran Admin Kluster RBAC Azure Kubernetes Service.

Memigrasikan volume Disk

Catatan

Label failure-domain.beta.kubernetes.io/zone dan failure-domain.beta.kubernetes.io/region telah ditolak di AKS 1.24 dan dihapus dalam 1.28. Jika volume persisten yang ada masih menggunakan nodeAffinity yang cocok dengan kedua label ini, Anda perlu mengubahnya menjadi topology.kubernetes.io/zone dan topology.kubernetes.io/region memberi label dalam pengaturan volume persisten baru.

Migrasi dari in-tree ke CSI didukung menggunakan dua opsi migrasi:

  • Membuat volume statis
  • Membuat volume dinamis

Membuat volume statis

Dengan menggunakan opsi ini, Anda membuat PV dengan menetapkan claimRef secara statis ke PVC baru yang akan Anda buat nanti, dan menentukan volumeName untuk PersistentVolumeClaim.

Diagram alur kerja volume statis.

Keuntungan-keuntungan dari pendekatan ini adalah:

  • Ini sederhana dan dapat diotomatisasi.
  • Tidak perlu membersihkan konfigurasi asli menggunakan kelas penyimpanan dalam pohon.
  • Risiko rendah karena Anda hanya melakukan penghapusan logis Kubernetes PV/PVC, data fisik aktual tidak dihapus.
  • Tidak ada biaya tambahan yang dikeluarkan sebagai akibat dari tidak harus membuat objek Azure tambahan, seperti disk, rekam jepret, dll.

Berikut ini adalah pertimbangan penting untuk dievaluasi:

  • Transisi ke volume statis dari volume gaya dinamis asli memerlukan pembuatan dan pengelolaan objek PV secara manual untuk semua opsi.
  • Potensi waktu henti aplikasi saat menyebarkan ulang aplikasi baru dengan referensi ke objek PVC baru.

Migration

  1. Perbarui PV ReclaimPolicy yang ada dari Hapus ke Pertahankan dengan menjalankan perintah berikut:

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

    Ganti pvName dengan nama PersistentVolume yang Anda pilih. Atau, jika Anda ingin memperbarui reclaimPolicy untuk beberapa PV, buat file bernama patchReclaimPVs.sh dan salin dalam kode berikut.

    #!/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
    

    Jalankan skrip dengan namespace parameter untuk menentukan namespace ./PatchReclaimPolicy.sh <namespace>kluster .

  2. Dapatkan daftar semua PVC di namespace yang diurutkan menurut creationTimestamp dengan menjalankan perintah berikut. Atur namespace menggunakan --namespace argumen bersama dengan namespace kluster yang sebenarnya.

    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
    

    Langkah ini berguna jika Anda memiliki sejumlah besar PV yang perlu dimigrasikan, dan Anda ingin bermigrasi beberapa per satu. Menjalankan perintah ini memungkinkan Anda mengidentifikasi PVC mana yang dibuat dalam jangka waktu tertentu. Saat Anda menjalankan skrip CreatePV.sh , dua parameter adalah waktu mulai dan waktu akhir yang memungkinkan Anda hanya memigrasikan PVC selama periode waktu tersebut.

  3. Buat file bernama CreatePV.sh dan salin dalam kode berikut. Skrip melakukan hal berikut:

    • Membuat PersistentVolume baru dengan nama existing-pv-csi untuk semua PersistentVolumes di namespace layanan untuk kelas storageClassNamepenyimpanan .
    • Konfigurasikan nama PVC baru sebagai existing-pvc-csi.
    • Membuat PVC baru dengan nama PV yang Anda tentukan.
    #!/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. Untuk membuat PersistentVolume baru untuk semua PersistentVolumes di namespace, jalankan skrip CreatePV.sh dengan parameter berikut:

    • namespace - Namespace kluster
    • sourceStorageClass - StorageClass berbasis driver penyimpanan di pohon
    • targetCSIStorageClass - StorageClass berbasis driver penyimpanan CSI, yang dapat menjadi salah satu kelas penyimpanan default yang memiliki provisioner yang diatur ke disk.csi.azure.com atau file.csi.azure.com. Atau Anda dapat membuat kelas penyimpanan kustom selama diatur ke salah satu dari dua provisi tersebut.
    • startTimeStamp - Berikan waktu mulai sebelum waktu pembuatan PVC dalam format yyyy-mm-ddthh:mm:ssz
    • endTimeStamp - Berikan waktu akhir dalam format yyyy-mm-ddthh:mm:ssz.
    ./CreatePV.sh <namespace> <sourceIntreeStorageClass> <targetCSIStorageClass> <startTimestamp> <endTimestamp>
    
  5. Perbarui aplikasi Anda untuk menggunakan PVC baru.

Membuat volume dinamis

Dengan menggunakan opsi ini, Anda secara dinamis membuat Volume Persisten dari Klaim Volume Persisten.

Diagram alur kerja volume dinamis.

Keuntungan-keuntungan dari pendekatan ini adalah:

  • Langkah ini memiliki risiko yang lebih sedikit karena semua objek baru dibuat sambil mempertahankan salinan lain dengan snapshot.

  • Tidak perlu membuat PV secara terpisah dan menambahkan nama volume dalam manifes PVC.

Berikut ini adalah pertimbangan penting untuk dievaluasi:

  • Meskipun memiliki risiko yang lebih sedikit, pendekatan ini membuat beberapa objek yang akan meningkatkan biaya penyimpanan Anda.

  • Selama pembuatan volume baru, aplikasi Anda menjadi tidak tersedia.

  • Langkah-langkah penghapusan harus dilakukan dengan hati-hati. Kunci sumber daya sementara dapat diterapkan ke grup sumber daya Anda hingga migrasi selesai dan aplikasi Anda berhasil diverifikasi.

  • Lakukan validasi/verifikasi data saat disk baru dibuat dari snapshot.

Migration

Sebelum melanjutkan, verifikasi hal berikut:

  • Untuk beban kerja tertentu di mana data ditulis ke memori sebelum ditulis ke disk, aplikasi harus dihentikan dan untuk memungkinkan data dalam memori dihapus ke disk.

  • VolumeSnapshot kelas harus ada seperti yang ditunjukkan dalam contoh YAML berikut:

    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. Dapatkan daftar semua PVC di namespace tertentu yang diurutkan menurut creationTimestamp dengan menjalankan perintah berikut. Atur namespace menggunakan --namespace argumen bersama dengan namespace kluster yang sebenarnya.

    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
    

    Langkah ini berguna jika Anda memiliki sejumlah besar PV yang perlu dimigrasikan, dan Anda ingin bermigrasi beberapa per satu. Menjalankan perintah ini memungkinkan Anda mengidentifikasi PVC mana yang dibuat dalam jangka waktu tertentu. Saat Anda menjalankan skrip MigrateCSI.sh , dua parameter adalah waktu mulai dan waktu akhir yang memungkinkan Anda hanya memigrasikan PVC selama periode waktu tersebut.

  2. Buat file bernama MigrateToCSI.sh dan salin dalam kode berikut. Skrip melakukan hal berikut:

    • Membuat rekam jepret disk lengkap menggunakan Azure CLI
    • Menciptakan VolumesnapshotContent
    • Menciptakan VolumeSnapshot
    • Membuat PVC baru dari VolumeSnapshot
    • Membuat file baru dengan nama <namespace>-timestampfile , yang berisi daftar semua sumber daya lama yang perlu dibersihkan.
    #!/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. Untuk memigrasikan volume disk, jalankan skrip MigrateToCSI.sh dengan parameter berikut:

    • namespace - Namespace kluster
    • sourceStorageClass - StorageClass berbasis driver penyimpanan di pohon
    • targetCSIStorageClass - StorageClass berbasis driver penyimpanan CSI
    • volumeSnapshotClass - Nama kelas rekam jepret volume. Contohnya,custom-disk-snapshot-sc.
    • startTimeStamp - Berikan waktu mulai dalam format yyyy-mm-ddthh:mm:ssz.
    • endTimeStamp - Berikan waktu akhir dalam format yyyy-mm-ddthh:mm:ssz.
    ./MigrateToCSI.sh <namespace> <sourceStorageClass> <TargetCSIstorageClass> <VolumeSnapshotClass> <startTimestamp> <endTimestamp>
    
  4. Perbarui aplikasi Anda untuk menggunakan PVC baru.

  5. Hapus sumber daya lama secara manual termasuk PVC/PV in-tree, VolumeSnapshot, dan VolumeSnapshotContent. Jika tidak, mempertahankan PVC/PC in-tree dan objek snapshot akan menghasilkan lebih banyak biaya.

Memigrasikan volume berbagi file

Migrasi dari in-tree ke CSI didukung dengan membuat volume statis:

  • Tidak perlu membersihkan konfigurasi asli menggunakan kelas penyimpanan dalam pohon.
  • Risiko rendah karena Anda hanya melakukan penghapusan logis Kubernetes PV/PVC, data fisik aktual tidak dihapus.
  • Tidak ada biaya tambahan yang dikeluarkan sebagai akibat dari tidak harus membuat objek Azure tambahan, seperti berbagi file, dll.

Migration

  1. Perbarui PV ReclaimPolicy yang ada dari Hapus ke Pertahankan dengan menjalankan perintah berikut:

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

    Ganti pvName dengan nama PersistentVolume yang Anda pilih. Atau, jika Anda ingin memperbarui reclaimPolicy untuk beberapa PV, buat file bernama patchReclaimPVs.sh dan salin dalam kode berikut.

    #!/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
    

    Jalankan skrip dengan namespace parameter untuk menentukan namespace ./PatchReclaimPolicy.sh <namespace>kluster .

  2. Buat Kelas Penyimpanan baru dengan provisioner yang diatur ke file.csi.azure.com, atau Anda dapat menggunakan salah satu StorageClasses default dengan penyedia file CSI.

  3. secretName Dapatkan dan shareName dari PersistentVolumes yang ada dengan menjalankan perintah berikut:

    kubectl describe pv pvName
    
  4. Buat PV baru menggunakan StorageClass baru, dan shareName dan secretName dari PV in-tree. Buat file bernama azurefile-mount-pv.yaml dan salin dalam kode berikut. Di bawah csi, perbarui resourceGroup, volumeHandle, dan shareName. Untuk opsi pemasangan, nilai default untuk fileMode dan dirMode adalah 0777.

    Nilai default untuk fileMode dan dirMode adalah 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. Buat file bernama azurefile-mount-pvc.yaml dengan PersistentVolumeClaim yang menggunakan PersistentVolume menggunakan kode berikut.

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: azurefile
    spec:
      accessModes:
        - ReadWriteMany
      storageClassName: azurefile-csi
      volumeName: azurefile
      resources:
        requests:
          storage: 5Gi
    
  6. kubectl Gunakan perintah untuk membuat PersistentVolume.

    kubectl apply -f azurefile-mount-pv.yaml
    
  7. kubectl Gunakan perintah untuk membuat PersistentVolumeClaim.

    kubectl apply -f azurefile-mount-pvc.yaml
    
  8. Verifikasi PersistentVolumeClaim Anda dibuat dan terikat ke PersistentVolume dengan menjalankan perintah berikut.

    kubectl get pvc azurefile
    

    Output menyerupai hal berikut:

    NAME        STATUS   VOLUME      CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    azurefile   Bound    azurefile   5Gi        RWX            azurefile      5s
    
  9. Perbarui spesifikasi kontainer untuk mereferensikan PersistentVolumeClaim dan perbarui pod Anda. Misalnya, salin kode berikut dan buat file bernama azure-files-pod.yaml.

    ...
      volumes:
      - name: azure
        persistentVolumeClaim:
          claimName: azurefile
    
  10. Spesifikasi pod tidak dapat diperbarui di tempat. Gunakan perintah berikut kubectl untuk menghapus lalu membuat ulang pod.

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

Langkah berikutnya