Migrace z třídy úložiště ve stromové struktuře na ovladače CSI ve službě Azure Kubernetes Service (AKS)

Implementace ovladače Rozhraní úložiště kontejneru (CSI) byla zavedena ve službě Azure Kubernetes Service (AKS) od verze 1.21. Přijetím a použitím csI jako standardu by se vaše stávající stavové úlohy používající trvalé svazky ve stromu měly migrovat nebo upgradovat tak, aby používaly ovladač CSI.

Aby byl tento proces co nejjednodušší a aby se zajistilo, že nedojde ke ztrátě dat, najdete v tomto článku různé možnosti migrace. Mezi tyto možnosti patří skripty, které vám pomůžou zajistit bezproblémovou migraci ze stromu na disky Azure a ovladače CSI služby Azure Files.

Než začnete

  • Azure CLI verze 2.37.0 nebo novější. Spuštěním příkazu vyhledejte az --version verzi a spusťte az upgrade upgrade verze. Pokud potřebujete instalaci nebo upgrade, přečtěte si téma Instalace Azure CLI.
  • Správci kubectl a clusteru mají přístup k vytvoření, získání, výpisu, odstranění přístupu k PVC nebo PV, snímku svazku nebo k obsahu snímku svazku. V případě clusteru s povoleným Microsoft Entra RBAC jste členem role clusteru RBAC služby Azure Kubernetes Service Správa.

Migrace svazků disků

Poznámka:

Popisky failure-domain.beta.kubernetes.io/zone a failure-domain.beta.kubernetes.io/region jsou zastaralé v AKS 1.24 a odebrány ve verzi 1.28. Pokud vaše stávající trvalé svazky stále používají nodeAffinity odpovídající těmto dvěma popiskům, musíte je změnit na topology.kubernetes.io/zone a topology.kubernetes.io/region popisky v novém nastavení trvalého svazku.

Migrace ze stromové struktury na csI se podporuje pomocí dvou možností migrace:

  • Vytvoření statického svazku
  • Vytvoření dynamického svazku

Vytvoření statického svazku

Pomocí této možnosti vytvoříte PV staticky přiřazením claimRef k novému PVC, který později vytvoříte, a určíte volumeName pro PersistentVolumeClaim.

Static volume workflow diagram.

Výhody tohoto přístupu jsou:

  • Tento proces je jednoduchý a dá se automatizovat.
  • Není potřeba mazat původní konfiguraci využívající třídu úložiště ve stromové struktuře.
  • Tento proces je méně riskantní, protože se provádí pouze logické odstranění trvalého svazku nebo deklarace identity trvalého svazku Kubernetes a skutečná fyzická data se neodstraní.
  • V důsledku toho, že nebudete muset vytvářet další objekty Azure, jako jsou disky, snímky atd., se neúčtují žádné další náklady.

Při vyhodnocování je potřeba vzít v úvahu následující důležité aspekty:

  • Všechny varianty přechodu na statické svazky z původních dynamických svazků vyžadují ruční vytvoření a správu objektů trvalých svazků.
  • Při opětovném nasazování nové aplikace s odkazem na nový objekt deklarace identity trvalého svazku může dojít k výpadku aplikace.

Migrace

  1. Spuštěním následujícího příkazu aktualizujte existující pv ReclaimPolicy z delete na Zachovat :

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

    Nahraďte pvName názvem vybraného PersistentVolume. Případně pokud chcete aktualizovat adresu reclaimPolicy pro více virtuálních počítačů, vytvořte soubor s názvem patchReclaimPVs.sh a zkopírujte ho do následujícího kódu.

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

    Spusťte skript s parametrem namespace pro určení oboru názvů ./PatchReclaimPolicy.sh <namespace>clusteru .

  2. Spuštěním následujícího příkazu získejte seznam všech pvcs v oboru názvů seřazený podle creationTimestamp . Nastavte obor názvů pomocí argumentu --namespace spolu se skutečným oborem názvů clusteru.

    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
    

    Tento krok je užitečný, pokud máte velký počet počítačů, které je potřeba migrovat, a chcete migrovat několik najednou. Spuštěním tohoto příkazu můžete zjistit, které pvcs byly vytvořeny v daném časovém rámci. Při spuštění skriptu CreatePV.sh jsou dva parametry počátečním a koncovým časem, které umožňují migrovat pouze řadiče pro čtení v daném časovém období.

  3. Vytvořte soubor s názvem CreatePV.sh a zkopírujte následující kód. Skript provede následující akce:

    • Vytvoří nový PersistentVolume s názvem existing-pv-csi pro všechny PersistentVolumes v oborech názvů pro třídu storageClassNameúložiště .
    • Nakonfigurujte nový název PVC jako existing-pvc-csi.
    • Vytvoří nový PVC s zadaným názvem 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. Pokud chcete vytvořit nový PersistentVolume pro všechny PersistentVolumes v oboru názvů, spusťte skript CreatePV.sh s následujícími parametry:

    • namespace – Obor názvů clusteru
    • sourceStorageClass – Třída StorageClass založená na ovladači úložiště ve stromové struktuře
    • targetCSIStorageClass – Třída StorageClass založená na ovladači csI, která může být jednou z výchozích tříd úložiště, které mají zřizovací rutinu nastavenou na disk.csi.azure.com nebo file.csi.azure.com. Nebo můžete vytvořit vlastní třídu úložiště, pokud je nastavená na jeden z těchto dvou zřizovacích objektů.
    • startTimeStamp - Zadejte počáteční čas před časem vytvoření PVC ve formátu rrrr-mm-ddthh:mm:ssz
    • endTimeStamp - Zadejte koncový čas ve formátu rrrr-mm-ddthh:mm:ssz.
    ./CreatePV.sh <namespace> <sourceIntreeStorageClass> <targetCSIStorageClass> <startTimestamp> <endTimestamp>
    
  5. Aktualizujte aplikaci tak, aby používala nový PVC.

Vytvoření dynamického svazku

Pomocí této možnosti dynamicky vytvoříte trvalý svazek z deklarace trvalého svazku.

Dynamic volume workflow diagram.

Výhody tohoto přístupu jsou:

  • Tento proces je méně riskantní, protože všechny nové objekty se vytvoří při zachování dalších kopií díky snímkům.

  • Není nutné vytvářet trvalé svazky zvlášť a přidávat názvy svazků do manifestu deklarace identity trvalého svazku.

Při vyhodnocování je potřeba vzít v úvahu následující důležité aspekty:

  • Tento přístup je sice méně riskantní, ale vytvoří se několik objektů, které zvyšují náklady na úložiště.

  • Během vytváření nových svazků je aplikace nedostupná.

  • Při odstraňování byste měli postupovat opatrně. Dočasné zámky prostředků se dají použít pro vaši skupinu prostředků, dokud se migrace nedokončí a vaše aplikace se úspěšně ověří.

  • Při vytváření nových disků ze snímků proveďte ověření dat.

Migrace

Než budete pokračovat, ověřte následující:

  • Pro konkrétní úlohy, ve kterých se data před zápisem na disk zapisují do paměti, by se měla aplikace zastavit a umožnit vyprázdnění dat v paměti na disk.

  • VolumeSnapshot třída by měla existovat, jak je znázorněno v následujícím příkladu 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. Spuštěním následujícího příkazu získejte seznam všech pvcs v zadaném oboru názvů seřazeném podle creationTimestamp . Nastavte obor názvů pomocí argumentu --namespace spolu se skutečným oborem názvů clusteru.

    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
    

    Tento krok je užitečný, pokud máte velký počet počítačů, které je potřeba migrovat, a chcete migrovat několik najednou. Spuštěním tohoto příkazu můžete zjistit, které pvcs byly vytvořeny v daném časovém rámci. Při spuštění skriptu MigrateCSI.sh jsou dva parametry počátečním a koncovým časem, které umožňují migrovat pouze řadiče pro čtení v daném časovém období.

  2. Vytvořte soubor s názvem MigrateToCSI.sh a zkopírujte následující kód. Skript provede následující akce:

    • Vytvoří snímek celého disku pomocí Azure CLI.
    • Vytvoří VolumesnapshotContent
    • Vytvoří VolumeSnapshot
    • Vytvoří nový PVC z VolumeSnapshot
    • Vytvoří nový soubor s názvem souboru <namespace>-timestamp, který obsahuje seznam všech starých prostředků, které je potřeba vyčistit.
    #!/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. Pokud chcete migrovat diskové svazky, spusťte skript MigrateToCSI.sh s následujícími parametry:

    • namespace – Obor názvů clusteru
    • sourceStorageClass – Třída StorageClass založená na ovladači úložiště ve stromové struktuře
    • targetCSIStorageClass – Třída StorageClass založená na ovladači úložiště CSI
    • volumeSnapshotClass – Název třídy snímku svazku. Například custom-disk-snapshot-sc.
    • startTimeStamp - Zadejte počáteční čas ve formátu rrrr-mm-ddthh:mm:ssz.
    • endTimeStamp - Zadejte koncový čas ve formátu rrrr-mm-ddthh:mm:ssz.
    ./MigrateToCSI.sh <namespace> <sourceStorageClass> <TargetCSIstorageClass> <VolumeSnapshotClass> <startTimestamp> <endTimestamp>
    
  4. Aktualizujte aplikaci tak, aby používala nový PVC.

  5. Ručně odstraňte starší prostředky, včetně prostředků PVC/PV ve stromové struktuře, VolumeSnapshot a VolumeSnapshotContent. Jinak bude údržba trvalých svazků a deklarací identity trvalých svazků ve stromové struktuře a objektů snímků znamenat vyšší náklady.

Migrace svazků sdílených složek

Migrace ze stromové struktury na csI je podporovaná vytvořením statického svazku:

  • Není potřeba mazat původní konfiguraci využívající třídu úložiště ve stromové struktuře.
  • Tento proces je méně riskantní, protože se provádí pouze logické odstranění trvalého svazku nebo deklarace identity trvalého svazku Kubernetes a skutečná fyzická data se neodstraní.
  • V důsledku toho, že nebudete muset vytvářet další objekty Azure, jako jsou sdílené složky atd., se neúčtují žádné další náklady.

Migrace

  1. Spuštěním následujícího příkazu aktualizujte existující pv ReclaimPolicy z delete na Zachovat :

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

    Nahraďte pvName názvem vybraného PersistentVolume. Případně pokud chcete aktualizovat adresu reclaimPolicy pro více virtuálních počítačů, vytvořte soubor s názvem patchReclaimPVs.sh a zkopírujte ho do následujícího kódu.

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

    Spusťte skript s parametrem namespace pro určení oboru názvů ./PatchReclaimPolicy.sh <namespace>clusteru .

  2. Vytvořte novou třídu úložiště s nastavením zřizovacího modulu file.csi.azure.comnebo můžete použít některou z výchozích tříd StorageClasss se zřizovacím nástrojem pro soubory CSI.

  3. Spuštěním následujícího příkazu získejte secretName a shareName z existujícího PersistentVolumes :

    kubectl describe pv pvName
    
  4. Vytvořte novou pv pomocí nové třídy StorageClass a z objektu shareNamesecretName PV ve stromu. Vytvořte soubor s názvem azurefile-mount-pv.yaml a zkopírujte ho do následujícího kódu. V části csi, update resourceGroup, volumeHandlea shareName. Pro možnosti připojení je výchozí hodnota fileModea dirMode 0777.

    Výchozí hodnota je fileModedirMode0777.

    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
    
  5. Pomocí následujícího kódu vytvořte soubor azurefile-mount-pvc.yaml s trvalým názvem PersistentVolumeClaim, který používá PersistentVolume.

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: azurefile
    spec:
      accessModes:
        - ReadWriteMany
      storageClassName: azurefile-csi
      volumeName: azurefile
      resources:
        requests:
          storage: 5Gi
    
  6. kubectl Pomocí příkazu vytvořte PersistentVolume.

    kubectl apply -f azurefile-mount-pv.yaml
    
  7. kubectl Pomocí příkazu vytvořte PersistentVolumeClaim.

    kubectl apply -f azurefile-mount-pvc.yaml
    
  8. Spuštěním následujícího příkazu ověřte, že je váš TrvalýVolumeClaim vytvořen a svázán s trvalým objektem.

    kubectl get pvc azurefile
    

    Výstup vypadá přibližně takto:

    NAME        STATUS   VOLUME      CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    azurefile   Bound    azurefile   5Gi        RWX            azurefile      5s
    
  9. Aktualizujte specifikaci kontejneru tak, aby odkazoval na persistentVolumeClaim a aktualizoval pod. Zkopírujte například následující kód a vytvořte soubor s názvem azure-files-pod.yaml.

    ...
      volumes:
      - name: azure
        persistentVolumeClaim:
          claimName: azurefile
    
  10. Specifikace podu se nedá aktualizovat. K odstranění a opětovnému vytvoření podu použijte následující kubectl příkazy.

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

Další kroky