다음을 통해 공유


트리 내 스토리지 클래스에서 AKS(Azure Kubernetes Service)의 CSI 드라이버로 마이그레이션

CSI(Container Storage Interface) 드라이버의 구현은 버전 1.21부터 AKS(Azure Kubernetes Service)에 도입되었습니다. CSI를 표준으로 채택하고 사용하면 트리 내 PV(영구 볼륨)를 사용하는 기존 상태 저장 워크로드를 마이그레이션하거나 업그레이드하여 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/zonefailure-domain.beta.kubernetes.io/region은 AKS 1.24에서 더 이상 사용되지 않으며 1.28에서 제거되었습니다. 기존의 영구적 볼륨이 여전히 이 두 레이블과 일치하는 nodeAffinity를 사용하는 경우 새로운 영구적 볼륨 설정에서 topology.kubernetes.io/zonetopology.kubernetes.io/region 레이블로 변경해야 합니다.

두 가지 마이그레이션 옵션을 사용하여 트리 내에서 CSI로 마이그레이션할 수 있습니다.

  • 정적 볼륨 만들기
  • 동적 볼륨 만들기

정적 볼륨 만들기

이 옵션을 사용하면 나중에 만들 새 PVC에 claimRef를 정적으로 할당하여 PV를 만들고 PersistentVolumeClaim에 대해 volumeName을 지정합니다.

정적 볼륨 워크플로 다이어그램.

이 방법의 이점은 다음과 같습니다.

  • 간단하고 자동화할 수 있습니다.
  • 트리 내 스토리지 클래스를 사용하여 원래 구성을 정리할 필요가 없습니다.
  • Kubernetes PV/PVC의 논리적 삭제만 수행하므로 위험이 낮습니다. 실제 물리적 데이터는 삭제되지 않습니다.
  • 디스크, 스냅샷 등과 같은 추가 Azure 개체를 만들 필요가 없으므로 추가 비용이 발생하지 않습니다.

다음은 평가해야 할 중요한 고려 사항입니다.

  • 원래 동적 스타일 볼륨에서 정적 볼륨으로 전환하려면 모든 옵션에 대해 수동으로 PV 개체를 구성하고 관리해야 합니다.
  • 새 PVC 개체를 참조하여 새 애플리케이션을 다시 배포할 때 애플리케이션 가동 중지 가능성이 있습니다.

마이그레이션

  1. 다음 명령을 실행하여 기존 PV ReclaimPolicy삭제에서 보존으로 업데이트합니다.

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

    pvName을 선택한 PersistentVolume 이름으로 바꿉니다. 또는 여러 PV에 대한 reclaimPolicy를 업데이트하려면 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별로 정렬된 네임스페이스의 모든 PVC 목록을 가져옵니다. 실제 클러스터 네임스페이스와 함께 --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
    

    이 단계는 마이그레이션해야 하는 PV가 많이 있고, 한 번에 몇 개씩 마이그레이션하려는 경우에 유용합니다. 이 명령을 실행하면 지정된 시간 프레임에 생성된 PVC를 식별할 수 있습니다. CreatePV.sh 스크립트를 실행할 때 두 매개 변수는 시작 시간과 종료 시간으로, 해당 기간 동안에만 PVC를 마이그레이션할 수 있습니다.

  3. CreatePV.sh라는 파일을 만들고 다음 코드에 복사합니다. 이 스크립트는 다음을 수행합니다.

    • 스토리지 클래스 storageClassName에 대한 네임스페이스의 모든 PersistentVolume에 대해 existing-pv-csi라는 이름으로 새 PersistentVolume을 만듭니다.
    • 새 PVC 이름을 existing-pvc-csi로 구성합니다.
    • 지정한 PV 이름으로 새 PVC를 만듭니다.
    #!/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에 대해 새 PersistentVolume을 만들려면 다음 매개 변수를 사용하여 스크립트 CreatePV.sh를 실행합니다.

    • namespace - 클러스터 네임스페이스
    • sourceStorageClass - 트리 내 스토리지 드라이버 기반 StorageClass
    • targetCSIStorageClass - CSI 스토리지 드라이버 기반 StorageClass. 이것은 프로비저닝 프로그램이 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를 사용하도록 애플리케이션을 업데이트합니다.

동적 볼륨 만들기

이 옵션을 사용하여 영구 볼륨 클레임에서 동적으로 영구 볼륨을 만듭니다.

동적 볼륨 워크플로 다이어그램.

이 방법의 이점은 다음과 같습니다.

  • 스냅샷이 있는 다른 복사본을 보존하면서 모든 새 개체가 만들어지기 때문에 위험이 적습니다.

  • PV를 별도로 구성하고 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별로 정렬된 지정된 네임스페이스의 모든 PVC 목록을 가져옵니다. 실제 클러스터 네임스페이스와 함께 --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
    

    이 단계는 마이그레이션해야 하는 PV가 많이 있고, 한 번에 몇 개씩 마이그레이션하려는 경우에 유용합니다. 이 명령을 실행하면 지정된 시간 프레임에 생성된 PVC를 식별할 수 있습니다. MigrateCSI.sh 스크립트를 실행할 때 두 매개 변수는 시작 시간과 종료 시간으로, 해당 기간 동안에만 PVC를 마이그레이션할 수 있습니다.

  2. MigrateToCSI.sh라는 파일을 만들고 다음 코드에 복사합니다. 이 스크립트는 다음을 수행합니다.

    • Azure CLI를 사용하여 전체 디스크 스냅샷 만들기
    • VolumesnapshotContent 만들기
    • VolumeSnapshot 만들기
    • VolumeSnapshot에서 새 PVC 만들기
    • 정리해야 하는 모든 이전 리소스 목록이 포함된 새 파일을 <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 스토리지 드라이버 기반 StorageClass
    • 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삭제에서 보존으로 업데이트합니다.

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

    pvName을 선택한 PersistentVolume 이름으로 바꿉니다. 또는 여러 PV에 대한 reclaimPolicy를 업데이트하려면 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으로 설정된 새 Storage 클래스를 만들거나, 기본 StorageClass 중 하나를 CSI 파일 프로비저닝 프로그램과 함께 사용할 수 있습니다.

  3. 다음 명령을 실행하여 기존 PersistentVolumes에서 secretNameshareName을 가져옵니다.

    kubectl describe pv pvName
    
  4. 새 StorageClass를 사용하여 새 PV를 만들고, 트리 내 PV에서 shareNamesecretName을 만듭니다. azurefile-mount-pv.yaml이라는 파일을 만들고 다음 코드에 복사합니다. csi에서 resourceGroup, volumeHandle, shareName을 업데이트합니다. 탑재 옵션의 경우 fileModedirMode의 기본값은 0777입니다.

    fileModedirMode의 기본값은 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. 다음 코드를 사용하여 PersistentVolume을 사용하는 PersistentVolumeClaim으로 azurefile-mount-pvc.yaml이라는 파일을 만듭니다.

    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을 참조하고 Pod를 업데이트하도록 컨테이너 사양을 업데이트합니다. 예를 들어 다음 코드를 복사하고 azure-files-pod.yaml이라는 파일을 만듭니다.

    ...
      volumes:
      - name: azure
        persistentVolumeClaim:
          claimName: azurefile
    
  10. Pod 사양은 현재 위치에서 업데이트할 수 없습니다. 다음 kubectl 명령을 사용하여 Pod를 삭제한 다음 다시 만듭니다.

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

다음 단계