Share via


Migreren van in-tree-opslagklasse naar CSI-stuurprogramma's in Azure Kubernetes Service (AKS)

De implementatie van het CSI-stuurprogramma (Container Storage Interface) is geïntroduceerd in Azure Kubernetes Service (AKS) vanaf versie 1.21. Door CSI als standaard te gebruiken en te gebruiken, moeten uw bestaande stateful workloads met behulp van permanente volumes (CSV's) in de structuur worden gemigreerd of bijgewerkt om het CSI-stuurprogramma te gebruiken.

Om dit proces zo eenvoudig mogelijk te maken en om ervoor te zorgen dat er geen gegevens verloren gaan, biedt dit artikel verschillende migratieopties. Deze opties omvatten scripts om een soepele migratie van in-tree naar Azure Disks en Azure Files CSI-stuurprogramma's te garanderen.

Voordat u begint

  • Azure CLI versie 2.37.0 of hoger. Voer az --version deze uit om de versie te vinden en voer deze uit az upgrade om de versie te upgraden. Als u Azure CLI 2.0 wilt installeren of upgraden, raadpleegt u Azure CLI 2.0 installeren.
  • Kubectl- en clusterbeheerders hebben toegang tot inhoud voor het maken, ophalen, weergeven, verwijderen van toegang tot een PVC of PV, volumemomentopname of volumemomentopname. Voor een Microsoft Entra RBAC-cluster bent u lid van de RBAC-cluster van Azure Kubernetes Service Beheer rol.

Schijfvolumes migreren

Notitie

De labels failure-domain.beta.kubernetes.io/zone en failure-domain.beta.kubernetes.io/region zijn afgeschaft in AKS 1.24 en verwijderd in 1.28. Als uw bestaande permanente volumes nog steeds gebruikmaken van nodeAffinity die overeenkomen met deze twee labels, moet u deze wijzigen in topology.kubernetes.io/zone en topology.kubernetes.io/region labels in de nieuwe permanente volume-instelling.

Migratie van in-tree naar CSI wordt ondersteund met behulp van twee migratieopties:

  • Een statisch volume maken
  • Een dynamisch volume maken

Een statisch volume maken

Met deze optie maakt u een HW door statisch toe te claimRef wijzen aan een nieuw PVC dat u later gaat maken en het volumeName voor persistentVolumeClaim op te geven.

Static volume workflow diagram.

De voordelen van deze aanpak zijn:

  • Het is eenvoudig en kan worden geautomatiseerd.
  • U hoeft de oorspronkelijke configuratie niet op te schonen met behulp van de in-tree-opslagklasse.
  • Laag risico omdat u alleen een logische verwijdering van Kubernetes PV/PVC uitvoert, worden de werkelijke fysieke gegevens niet verwijderd.
  • Er worden geen extra kosten in rekening gebracht als gevolg van het niet hoeven maken van extra Azure-objecten, zoals schijf, momentopnamen, enzovoort.

Hier volgen belangrijke overwegingen om te evalueren:

  • Voor de overgang naar statische volumes van oorspronkelijke dynamische volumes moeten PV-objecten handmatig worden gemaakt en beheerd voor alle opties.
  • Mogelijke downtime van toepassingen bij het opnieuw implementeren van de nieuwe toepassing met verwijzing naar het nieuwe PVC-object.

Migratie

  1. Werk de bestaande HW ReclaimPolicy bij van Delete naar Behouden door de volgende opdracht uit te voeren:

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

    Vervang pvName door de naam van uw geselecteerde PersistentVolume. Als u de reclaimPolicy voor meerdere tv's wilt bijwerken, maakt u ook een bestand met de naam patchReclaimPVs.sh en kopieert u deze in de volgende code.

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

    Voer het script uit met de namespace parameter om de clusternaamruimte ./PatchReclaimPolicy.sh <namespace>op te geven.

  2. Haal een lijst op met alle HPC's in naamruimte gesorteerd op creationTimestamp door de volgende opdracht uit te voeren. Stel de naamruimte in met behulp van het --namespace argument, samen met de werkelijke clusternaamruimte.

    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
    

    Deze stap is handig als u een groot aantal tv's hebt die moeten worden gemigreerd en u er een paar tegelijk wilt migreren. Door deze opdracht uit te voeren, kunt u bepalen welke PVC's in een bepaald tijdsbestek zijn gemaakt. Wanneer u het CreatePV.sh-script uitvoert, zijn twee van de parameters de begin- en eindtijd waarmee u de HPC's gedurende die periode alleen kunt migreren.

  3. Maak een bestand met de naam CreatePV.sh en kopieer deze in de volgende code. Het script doet het volgende:

    • Hiermee maakt u een nieuw PersistentVolume met de naam existing-pv-csi voor alle PersistentVolumes in naamruimten voor opslagklasse storageClassName.
    • Configureer de nieuwe PVC-naam als existing-pvc-csi.
    • Hiermee maakt u een nieuw PVC met de HW-naam die u opgeeft.
    #!/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. Als u een nieuw PersistentVolume wilt maken voor alle PersistentVolumes in de naamruimte, voert u het script uit CreatePV.sh met de volgende parameters:

    • namespace - De clusternaamruimte
    • sourceStorageClass - De op stuurprogramma's gebaseerde StorageClass van de in-tree storage
    • targetCSIStorageClass - De op stuurprogramma's van het CSI-opslagstuurprogramma gebaseerde StorageClass, die een van de standaardopslagklassen kan zijn waarop de inrichting is ingesteld op disk.csi.azure.com of file.csi.azure.com. U kunt ook een aangepaste opslagklasse maken zolang deze is ingesteld op een van deze twee inrichtingsfuncties.
    • startTimeStamp - Geef een begintijd op voordat PVC aanmaaktijd in de notatie jjjj-mm-ddthh:mm:ssz
    • endTimeStamp - Geef een eindtijd op in de notatie jjjj-mm-ddthh:mm:ssz.
    ./CreatePV.sh <namespace> <sourceIntreeStorageClass> <targetCSIStorageClass> <startTimestamp> <endTimestamp>
    
  5. Werk uw toepassing bij om het nieuwe PVC te gebruiken.

Een dynamisch volume maken

Met deze optie maakt u dynamisch een permanent volume op basis van een permanente volumeclaim.

Dynamic volume workflow diagram.

De voordelen van deze aanpak zijn:

  • Het is minder riskant omdat alle nieuwe objecten worden gemaakt met behoud van andere kopieën met momentopnamen.

  • Het is niet nodig om PV's afzonderlijk samen te stellen en een volumenaam toe te voegen in het PVC-manifest.

Hier volgen belangrijke overwegingen om te evalueren:

  • Hoewel deze benadering minder riskant is, worden er meerdere objecten gemaakt die uw opslagkosten verhogen.

  • Tijdens het maken van de nieuwe volumes is uw toepassing niet beschikbaar.

  • Verwijderingsstappen moeten voorzichtig worden uitgevoerd. Tijdelijke resourcevergrendelingen kunnen worden toegepast op uw resourcegroep totdat de migratie is voltooid en uw toepassing is geverifieerd.

  • Voer gegevensvalidatie/verificatie uit wanneer er nieuwe schijven worden gemaakt op basis van momentopnamen.

Migratie

Controleer het volgende voordat u doorgaat:

  • Voor specifieke werkbelastingen waarin gegevens naar het geheugen worden geschreven voordat ze naar de schijf worden geschreven, moet de toepassing worden gestopt en moeten gegevens in het geheugen worden leeggemaakt naar de schijf.

  • VolumeSnapshot klasse moet bestaan zoals wordt weergegeven in het volgende voorbeeld 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. Haal een lijst op van alle HPC's in een opgegeven naamruimte, gesorteerd op creationTimestamp door de volgende opdracht uit te voeren. Stel de naamruimte in met behulp van het --namespace argument, samen met de werkelijke clusternaamruimte.

    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
    

    Deze stap is handig als u een groot aantal tv's hebt die moeten worden gemigreerd en u er een paar tegelijk wilt migreren. Door deze opdracht uit te voeren, kunt u bepalen welke PVC's in een bepaald tijdsbestek zijn gemaakt. Wanneer u het MigrateCSI.sh-script uitvoert, zijn twee van de parameters de begin- en eindtijd waarmee u de HPC's gedurende die periode alleen kunt migreren.

  2. Maak een bestand met de naam MigrateToCSI.sh en kopieer deze in de volgende code. Het script doet het volgende:

    • Hiermee maakt u een momentopname van een volledige schijf met behulp van de Azure CLI
    • Maakt VolumesnapshotContent
    • Maakt VolumeSnapshot
    • Hiermee maakt u een nieuw PVC van VolumeSnapshot
    • Hiermee maakt u een nieuw bestand met de bestandsnaam <namespace>-timestamp, dat een lijst bevat met alle oude resources die moeten worden opgeschoond.
    #!/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. Als u de schijfvolumes wilt migreren, voert u het script uit MigrateToCSI.sh met de volgende parameters:

    • namespace - De clusternaamruimte
    • sourceStorageClass - De op stuurprogramma's gebaseerde StorageClass van de in-tree storage
    • targetCSIStorageClass - De op stuurprogramma's gebaseerde StorageClass van CSI
    • volumeSnapshotClass - Naam van de klasse voor momentopnamen van het volume. Bijvoorbeeld: custom-disk-snapshot-sc.
    • startTimeStamp - Geef een begintijd op in de notatie jjjj-mm-ddthh:mm:ssz.
    • endTimeStamp - Geef een eindtijd op in de notatie jjjj-mm-ddthh:mm:ssz.
    ./MigrateToCSI.sh <namespace> <sourceStorageClass> <TargetCSIstorageClass> <VolumeSnapshotClass> <startTimestamp> <endTimestamp>
    
  4. Werk uw toepassing bij om het nieuwe PVC te gebruiken.

  5. Verwijder handmatig de oudere resources, waaronder in-tree PVC/PV, VolumeSnapshot en VolumeSnapshotContent. Anders genereert het onderhoud van de in-tree PVC/PC en momentopnameobjecten meer kosten.

Bestandssharevolumes migreren

Migratie van in-tree naar CSI wordt ondersteund door een statisch volume te maken:

  • U hoeft de oorspronkelijke configuratie niet op te schonen met behulp van de in-tree-opslagklasse.
  • Laag risico omdat u alleen een logische verwijdering van Kubernetes PV/PVC uitvoert, worden de werkelijke fysieke gegevens niet verwijderd.
  • Er worden geen extra kosten gemaakt als gevolg van het niet hoeven maken van extra Azure-objecten, zoals bestandsshares, enzovoort.

Migratie

  1. Werk de bestaande HW ReclaimPolicy bij van Delete naar Behouden door de volgende opdracht uit te voeren:

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

    Vervang pvName door de naam van uw geselecteerde PersistentVolume. Als u de reclaimPolicy voor meerdere tv's wilt bijwerken, maakt u ook een bestand met de naam patchReclaimPVs.sh en kopieert u deze in de volgende code.

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

    Voer het script uit met de namespace parameter om de clusternaamruimte ./PatchReclaimPolicy.sh <namespace>op te geven.

  2. Maak een nieuwe opslagklasse waarop de inrichting is ingesteld file.csi.azure.comof u kunt een van de standaardOpslagklassen gebruiken met de CSI-bestandsinrichting.

  3. Haal de secretName en shareName van de bestaande PersistentVolumes op door de volgende opdracht uit te voeren:

    kubectl describe pv pvName
    
  4. Maak een nieuwe HW met behulp van de nieuwe StorageClass en de shareName en secretName van de HW in de structuur. Maak een bestand met de naam azurefile-mount-pv.yaml en kopieer deze in de volgende code. Onder csi, bijwerken resourceGroup, en shareNamevolumeHandle. Voor koppelopties is de standaardwaarde voor fileMode en dirMode 0777.

    De standaardwaarde voor fileMode en dirMode is 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
    
  5. Maak een bestand met de naam azurefile-mount-pvc.yaml-bestand met een PersistentVolumeClaim die het PersistentVolume gebruikt met behulp van de volgende code.

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: azurefile
    spec:
      accessModes:
        - ReadWriteMany
      storageClassName: azurefile-csi
      volumeName: azurefile
      resources:
        requests:
          storage: 5Gi
    
  6. Gebruik de kubectl opdracht om het PersistentVolume te maken.

    kubectl apply -f azurefile-mount-pv.yaml
    
  7. Gebruik de kubectl opdracht om de PersistentVolumeClaim te maken.

    kubectl apply -f azurefile-mount-pvc.yaml
    
  8. Controleer of uw PersistentVolumeClaim is gemaakt en gebonden aan het PersistentVolume door de volgende opdracht uit te voeren.

    kubectl get pvc azurefile
    

    De uitvoer ziet er ongeveer als volgt uit:

    NAME        STATUS   VOLUME      CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    azurefile   Bound    azurefile   5Gi        RWX            azurefile      5s
    
  9. Werk de containerspecificatie bij om te verwijzen naar uw PersistentVolumeClaim en werk uw pod bij. Kopieer bijvoorbeeld de volgende code en maak een bestand met de naam azure-files-pod.yaml.

    ...
      volumes:
      - name: azure
        persistentVolumeClaim:
          claimName: azurefile
    
  10. De podspecificatie kan niet worden bijgewerkt. Gebruik de volgende kubectl opdrachten om de pod te verwijderen en vervolgens opnieuw te maken.

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

Volgende stappen