트리 내 스토리지 클래스에서 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/zone
및 failure-domain.beta.kubernetes.io/region
은 AKS 1.24에서 더 이상 사용되지 않으며 1.28에서 제거되었습니다. 기존의 영구적 볼륨이 여전히 이 두 레이블과 일치하는 nodeAffinity를 사용하는 경우 새로운 영구적 볼륨 설정에서 topology.kubernetes.io/zone
및 topology.kubernetes.io/region
레이블로 변경해야 합니다.
두 가지 마이그레이션 옵션을 사용하여 트리 내에서 CSI로 마이그레이션할 수 있습니다.
- 정적 볼륨 만들기
- 동적 볼륨 만들기
정적 볼륨 만들기
이 옵션을 사용하면 나중에 만들 새 PVC에 claimRef
를 정적으로 할당하여 PV를 만들고 PersistentVolumeClaim에 대해 volumeName
을 지정합니다.
이 방법의 이점은 다음과 같습니다.
- 간단하고 자동화할 수 있습니다.
- 트리 내 스토리지 클래스를 사용하여 원래 구성을 정리할 필요가 없습니다.
- Kubernetes PV/PVC의 논리적 삭제만 수행하므로 위험이 낮습니다. 실제 물리적 데이터는 삭제되지 않습니다.
- 디스크, 스냅샷 등과 같은 추가 Azure 개체를 만들 필요가 없으므로 추가 비용이 발생하지 않습니다.
다음은 평가해야 할 중요한 고려 사항입니다.
- 원래 동적 스타일 볼륨에서 정적 볼륨으로 전환하려면 모든 옵션에 대해 수동으로 PV 개체를 구성하고 관리해야 합니다.
- 새 PVC 개체를 참조하여 새 애플리케이션을 다시 배포할 때 애플리케이션 가동 중지 가능성이 있습니다.
마이그레이션
다음 명령을 실행하여 기존 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>
를 지정합니다.다음 명령을 실행하여 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를 마이그레이션할 수 있습니다.
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
- 스토리지 클래스
네임스페이스의 모든 PersistentVolume에 대해 새 PersistentVolume을 만들려면 다음 매개 변수를 사용하여 스크립트 CreatePV.sh를 실행합니다.
namespace
- 클러스터 네임스페이스sourceStorageClass
- 트리 내 스토리지 드라이버 기반 StorageClasstargetCSIStorageClass
- 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>
새 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"
다음 명령을 실행하여 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를 마이그레이션할 수 있습니다.
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
디스크 볼륨을 마이그레이션하려면 다음 매개 변수를 사용하여 스크립트 MigrateToCSI.sh를 실행합니다.
namespace
- 클러스터 네임스페이스sourceStorageClass
- 트리 내 스토리지 드라이버 기반 StorageClasstargetCSIStorageClass
- CSI 스토리지 드라이버 기반 StorageClassvolumeSnapshotClass
- 볼륨 스냅샷 클래스의 이름 예:custom-disk-snapshot-sc
.startTimeStamp
- 시작 시간을 yyyy-mm-ddthh:mm:ssz 형식으로 제공endTimeStamp
- 종료 시간을 yyyy-mm-ddthh:mm:ssz 형식으로 제공
./MigrateToCSI.sh <namespace> <sourceStorageClass> <TargetCSIstorageClass> <VolumeSnapshotClass> <startTimestamp> <endTimestamp>
새 PVC를 사용하도록 애플리케이션을 업데이트합니다.
트리 내 PVC/PV, VolumeSnapshot 및 VolumeSnapshotContent를 포함하여 이전 리소스를 수동으로 삭제합니다. 그렇지 않으면 트리 내 PVC/PC 및 스냅샷 개체를 유지 관리하는 경우 더 많은 비용이 발생합니다.
파일 공유 볼륨 마이그레이션
정적 볼륨을 만들면 트리 내에서 CSI로 마이그레이션할 수 있습니다.
- 트리 내 스토리지 클래스를 사용하여 원래 구성을 정리할 필요가 없습니다.
- Kubernetes PV/PVC의 논리적 삭제만 수행하므로 위험이 낮습니다. 실제 물리적 데이터는 삭제되지 않습니다.
- 파일 공유 등과 같은 추가 Azure 개체를 만들 필요가 없으므로 추가 비용이 발생하지 않습니다.
마이그레이션
다음 명령을 실행하여 기존 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>
를 지정합니다.프로비저닝 프로그램이
file.csi.azure.com
으로 설정된 새 Storage 클래스를 만들거나, 기본 StorageClass 중 하나를 CSI 파일 프로비저닝 프로그램과 함께 사용할 수 있습니다.다음 명령을 실행하여 기존 PersistentVolumes에서
secretName
및shareName
을 가져옵니다.kubectl describe pv pvName
새 StorageClass를 사용하여 새 PV를 만들고, 트리 내 PV에서
shareName
및secretName
을 만듭니다. 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
다음 코드를 사용하여 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
kubectl
명령을 사용하여 PersistentVolume을 만듭니다.kubectl apply -f azurefile-mount-pv.yaml
kubectl
명령을 사용하여 PersistentVolumeClaim을 만듭니다.kubectl apply -f azurefile-mount-pvc.yaml
다음 명령을 실행하여 PersistentVolumeClaim이 만들어지고 PersistentVolume에 바인딩되었는지 확인합니다.
kubectl get pvc azurefile
출력은 다음과 유사합니다.
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE azurefile Bound azurefile 5Gi RWX azurefile 5s
PersistentVolumeClaim을 참조하고 Pod를 업데이트하도록 컨테이너 사양을 업데이트합니다. 예를 들어 다음 코드를 복사하고 azure-files-pod.yaml이라는 파일을 만듭니다.
... volumes: - name: azure persistentVolumeClaim: claimName: azurefile
Pod 사양은 현재 위치에서 업데이트할 수 없습니다. 다음
kubectl
명령을 사용하여 Pod를 삭제한 다음 다시 만듭니다.kubectl delete pod mypod
kubectl apply -f azure-files-pod.yaml
다음 단계
- 스토리지 모범 사례에 관한 자세한 내용은 Azure Kubernetes Service의 스토리지 및 백업 모범 사례를 참조하세요.
- AKS용 Azure Backup을 사용하여 백업하여 새로 마이그레이션된 CSI 드라이버 기반 PV를 보호합니다.
Azure Kubernetes Service