AKS(Azure Kubernetes Service)에서 Azure Disk CSI(Container Storage Interface) 드라이버 사용

Azure Disks CSI(Container Storage Interface) 드라이버는 Azure Disk의 수명 주기를 관리하기 위해 AKS(Azure Kubernetes Service)에서 사용하는 CSI 사양 규격 드라이버입니다.

CSI는 임의 블록과 파일 스토리지 시스템을 Kubernetes의 컨테이너화된 워크로드에 공개하는 표준입니다. CSI를 채택하고 사용하면 이제 AKS는 플러그 인을 작성, 배포 및 반복하여 Kubernetes에서 새로운 스토리지 시스템을 공개하거나 기존 스토리지 시스템을 개선할 수 있습니다. AKS에서 CSI 드라이버를 사용하면 핵심 Kubernetes 코드를 조정하고 릴리스 주기를 기다릴 필요가 없습니다.

CSI 드라이버를 지원하는 AKS 클러스터를 만들려면 AKS에서 CSI 드라이버 사용을 참조하세요. 이 문서에서는 Azure Disk CSI 드라이버 버전 1을 사용하는 방법에 대해 설명합니다.

참고 항목

Azure Disk CSI 드라이버 v2(미리 보기)는 확장성을 향상시키고 Pod 장애 조치(failover) 대기 시간을 줄입니다. 공유 디스크를 사용하여 첨부 복제본을 여러 클러스터 노드에 프로비저닝하고 Pod 스케줄러와 통합하여 Pod 장애 조치 시 첨부 복제본이 있는 노드가 선택되도록 합니다. Azure Disk CSI 드라이버 v2(미리 보기)는 성능을 미세 조정할 수 있는 기능도 제공합니다. 미리 보기에 참여하려면 https://aka.ms/DiskCSIv2Preview에서 요청을 제출하세요. 이 미리 보기 버전은 서비스 수준 계약 없이 제공되며, 미리 보기 중에 호환성이 손상되는 변경이 수행되는 경우가 있을 수 있습니다. 미리 보기 버전은 프로덕션 워크로드에 권장되지 않습니다. 자세한 내용은 Microsoft Azure Preview에 대한 추가 사용 약관을 참조하세요.

참고 항목

인트리 드라이버는 플러그 인인 새로운 CSI 드라이버와 비교하여 핵심 Kubernetes 코드의 일부인 현재 스토리지 드라이버를 나타냅니다.

Azure Disk CSI 드라이버 기능

트리 내 드라이버 기능 외에도 Azure Disk CSI 드라이버에서 지원하는 기능은 다음과 같습니다.

  • 동시 디스크 연결 및 분리 중 성능 향상
    • 트리 내 드라이버는 디스크를 직렬로 연결하거나 분리하지만, CSI 드라이버는 디스크를 일괄적으로 연결하거나 분리합니다. 여러 디스크가 하나의 노드에 연결되는 경우 성능이 크기 향상됩니다.
  • 프리미엄 SSD v1 및 v2가 지원됩니다.
    • PremiumV2_LRSNone 캐싱 모드만 지원합니다.
  • ZRS(영역 중복 스토리지) 디스크 지원
    • Premium_ZRS, StandardSSD_ZRS 디스크 유형이 지원됩니다. 영역 또는 비영역 노드에서 ZRS 디스크를 예약할 수 있습니다(디스크 볼륨이 지정된 노드와 동일한 영역에 배치되어야 한다는 제한이 없음). 지원되는 지역을 포함하여 자세한 내용은 관리 디스크에 대한 영역 중복 스토리지를 참조하세요.
  • 스냅샷
  • 볼륨 복제
  • 가동 중지 시간 없이 디스크 PV 크기 조정

참고 항목

사용 중인 VM SKU에 따라 Azure Disk CSI 드라이버에 노드당 볼륨 한도가 있을 수 있습니다. 일부 강력한 VM(예: 16개 코어)의 경우 한도는 노드당 64개 볼륨입니다. VM SKU당 한도를 확인하려면 제공된 각 VM SKU에 대한 최대 데이터 디스크 열을 검토합니다. 제공되는 VM SKU 및 해당 세부 용량 한도의 목록을 보려면 범용 가상 머신 크기를 참조하세요.

Azure Disks가 포함된 CSI 영구 볼륨 사용

PV(영구 볼륨)는 Kubernetes Pod와 함께 사용하기 위해 프로비저닝된 스토리지 부분을 나타냅니다. PV는 하나 이상의 Pod에서 사용할 수 있으며 동적 또는 정적으로 프로비저닝할 수 있습니다. 이 문서에서는 AKS 클러스터에서 한 Pod에 사용할 Azure Disks가 포함된 PV를 동적으로 만드는 방법을 설명합니다. 정적 프로비저닝의 경우 Azure Disks를 사용하여 정적 볼륨 만들기를 참조하세요.

Kubernetes 볼륨에 대한 자세한 내용은 AKS의 애플리케이션에 대한 스토리지 옵션을 참조하세요.

기본 제공 스토리지 클래스를 사용하여 동적으로 Azure Disks PV 만들기

스토리지 클래스를 사용하여 영구적 볼륨에서 스토리지 단위를 동적으로 생성되는 방법을 정의합니다. Kubernetes 스토리지 클래스에 대한 자세한 내용은 Kubernetes 스토리지 클래스를 참조하세요.

AKS에서 Azure Disk CSI 드라이버를 사용하는 경우 Azure Disk CSI 스토리지 드라이버를 사용하는 기본 제공 StorageClasses가 두 개 더 있습니다. 다른 CSI 스토리지 클래스는 인트리 기본 스토리지 클래스와 함께 클러스터에서 생성됩니다.

  • managed-csi: Azure Standard SSD LRS(로컬 중복 스토리지)를 사용하여 관리 디스크를 만듭니다. Kubernetes 버전 1.29부터 여러 가용성 영역에 배포된 AKS(Azure Kubernetes Service) 클러스터에서 이 스토리지 클래스는 Azure 표준 SSD ZRS(영역 중복 스토리지)를 활용하여 관리 디스크를 만듭니다.
  • managed-csi-premium: Azure Premium LRS를 사용하여 관리 디스크를 만듭니다. Kubernetes 버전 1.29부터 여러 가용성 영역에 배포된 AKS(Azure Kubernetes Service) 클러스터에서 이 스토리지 클래스는 Azure Premium ZRS(영역 중복 스토리지)를 활용하여 관리 디스크를 만듭니다.

두 스토리지 클래스의 회수 정책 때문에 각 PV가 삭제될 때 기본 Azure Disks가 삭제됩니다. 스토리지 클래스도 PV를 확장할 수 있도록 구성합니다. PVC(영구 볼륨 클레임)를 새 크기로 편집만 하면 됩니다.

스토리지 클래스를 사용하려면 해당 클래스를 참조하고 사용하는 PVC와 해당 Pod를 만듭니다. PVC를 사용하여 스토리지 클래스를 기반으로 하는 스토리지를 자동으로 프로비저닝합니다. PVC는 미리 만든 스토리지 클래스 중 하나 또는 사용자 정의 스토리지 클래스를 사용하여 원하는 SKU와 크기에 맞는 Azure 관리 디스크를 만들 수 있습니다. Pod 정의를 만들 때 원하는 스토리지를 요청하는 PVC가 지정됩니다.

kubectl apply 명령을 실행하여 예제 Pod 및 각 PVC를 만듭니다.

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azuredisk-csi-driver/master/deploy/example/pvc-azuredisk-csi.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azuredisk-csi-driver/master/deploy/example/nginx-pod-azuredisk.yaml

명령의 출력은 다음 예제와 유사합니다.

persistentvolumeclaim/pvc-azuredisk created
pod/nginx-azuredisk created

Pod가 실행 중 상태가 되면 다음 명령을 실행하여 test.txt라는 새 파일을 만듭니다.

kubectl exec nginx-azuredisk -- touch /mnt/azuredisk/test.txt

디스크가 올바르게 탑재되었는지 확인하려면 다음 명령을 실행하여 출력에 test.txt 파일이 표시되는지 확인합니다.

kubectl exec nginx-azuredisk -- ls /mnt/azuredisk

lost+found
outfile
test.txt

사용자 지정 스토리지 클래스 만들기

기본 스토리지 클래스는 가장 일반적인 시나리오에 적합합니다. 경우에 따라 고유한 매개 변수를 사용하여 고유 스토리지 클래스를 사용자 지정해야 할 수 있습니다. 예를 들어 volumeBindingMode 클래스를 변경해야 할 수 있습니다.

PVC가 만들어지면 즉시 수행되도록 보장하는 volumeBindingMode: Immediate 클래스를 사용할 수 있습니다. 노드 풀이 토폴로지가 제한된 상태인 경우(예: 가용성 영역을 사용할 때) Pod의 일정 요구 사항에 대한 지식 없이 PV가 바인딩되거나 프로비저닝됩니다.

이 시나리오를 해결하려면 PVC를 사용하는 Pod를 만들 때까지 PV의 바인딩과 프로비저닝을 연기하는 volumeBindingMode: WaitForFirstConsumer를 사용할 수 있습니다. 이 방식으로 PV는 Pod의 예약 제약 조건에 지정된 가용성 영역(또는 기타 토폴로지)을 준수하고 프로비전됩니다. 기본 스토리지 클래스는 volumeBindingMode: WaitForFirstConsumer 클래스를 사용합니다.

sc-azuredisk-csi-waitforfirstconsumer.yaml이라는 파일을 만들고, 다음 코드를 붙여넣습니다. 스토리지 클래스는 managed-csi 스토리지 클래스와 동일하지만 다른 volumeBindingMode 클래스가 포함되어 있습니다.

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: azuredisk-csi-waitforfirstconsumer
provisioner: disk.csi.azure.com
parameters:
  skuname: StandardSSD_LRS
allowVolumeExpansion: true
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer

kubectl apply 명령을 실행하여 스토리지 클래스를 만들고 sc-azuredisk-csi-waitforfirstconsumer.yaml 파일을 지정합니다.

kubectl apply -f sc-azuredisk-csi-waitforfirstconsumer.yaml

명령의 출력은 다음 예제와 유사합니다.

storageclass.storage.k8s.io/azuredisk-csi-waitforfirstconsumer created

볼륨 스냅샷

Azure Disk CSI 드라이버는 영구 볼륨의 스냅샷 만들기를 지원합니다. 이 기능의 일부로 드라이버는 incremental 매개 변수에 설정된 값(기본적으로 true)에 따라 전체 또는 증분 스냅샷을 수행할 수 있습니다.

다음 표에서는 모든 매개 변수에 대한 세부 정보를 제공합니다.

이름 의미 사용 가능한 값 필수 기본값
resourceGroup 스냅샷을 저장하는 리소스 그룹 기존 리소스 그룹 아니요 지정하지 않으면 스냅샷이 원본 Azure Disks와 동일한 리소스 그룹에 저장됩니다.
증분 전체 또는 증분 스냅샷을 만듭니다. true, false 아니요 true
tags Azure Disks 태그 태그 형식: 'key1=val1,key2=val2' 아니요 ""
userAgent 고객 사용량 특성에 사용되는 사용자 에이전트 아니요 driverName/driverVersion compiler/version (OS-ARCH) 형식으로 생성된 Useragent
subscriptionID Azure Disks가 만들어질 Azure 구독 ID 지정 Azure 구독 ID 아니요 비어 있지 않은 경우 resourceGroup을 제공해야 하고 incrementalfalse로 설정해야 합니다.

볼륨 스냅샷 만들기

참고 항목

계속하기 전에 애플리케이션이 원본 디스크에 데이터를 쓰지 않는지 확인합니다.

이 기능에 관한 예제를 보려면 kubectl apply 명령을 사용하여 볼륨 스냅샷 클래스를 만듭니다.

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azuredisk-csi-driver/master/deploy/example/snapshot/storageclass-azuredisk-snapshot.yaml

명령의 출력은 다음 예제와 유사합니다.

volumesnapshotclass.snapshot.storage.k8s.io/csi-azuredisk-vsc created

이제 이 자습서의 시작 부분에서 동적으로 만든pvc-azuredisk PVC에서 볼륨 스냅샷을 만들어 보겠습니다.

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azuredisk-csi-driver/master/deploy/example/snapshot/azuredisk-volume-snapshot.yaml

명령의 출력은 다음 예제와 유사합니다.

volumesnapshot.snapshot.storage.k8s.io/azuredisk-volume-snapshot created

스냅샷이 올바르게 만들어졌는지 확인하려면 다음 명령을 실행합니다.

kubectl describe volumesnapshot azuredisk-volume-snapshot

명령의 출력은 다음 예제와 유사합니다.

Name:         azuredisk-volume-snapshot
Namespace:    default
Labels:       <none>
Annotations:  API Version:  snapshot.storage.k8s.io/v1
Kind:         VolumeSnapshot
Metadata:
  Creation Timestamp:  2020-08-27T05:27:58Z
  Finalizers:
    snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection
    snapshot.storage.kubernetes.io/volumesnapshot-bound-protection
  Generation:        1
  Resource Version:  714582
  Self Link:         /apis/snapshot.storage.k8s.io/v1/namespaces/default/volumesnapshots/azuredisk-volume-snapshot
  UID:               dd953ab5-6c24-42d4-ad4a-f33180e0ef87
Spec:
  Source:
    Persistent Volume Claim Name:  pvc-azuredisk
  Volume Snapshot Class Name:      csi-azuredisk-vsc
Status:
  Bound Volume Snapshot Content Name:  snapcontent-dd953ab5-6c24-42d4-ad4a-f33180e0ef87
  Creation Time:                       2020-08-31T05:27:59Z
  Ready To Use:                        true
  Restore Size:                        10Gi
Events:                                <none>

볼륨 스냅샷을 기반으로 새 PVC 만들기

볼륨 스냅샷을 기반으로 새 PVC를 만들 수 있습니다. 이전 단계에서 만든 스냅샷을 사용하여 새 PVC새 Pod를 만들어 사용합니다.

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azuredisk-csi-driver/master/deploy/example/snapshot/pvc-azuredisk-snapshot-restored.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azuredisk-csi-driver/master/deploy/example/snapshot/nginx-pod-restored-snapshot.yaml

명령의 출력은 다음 예제와 유사합니다.

persistentvolumeclaim/pvc-azuredisk-snapshot-restored created
pod/nginx-restored created

마지막으로 다음 명령을 실행하여 내용을 확인하여 이전에 만들어진 것과 동일한 PVC인지 확인합니다.

kubectl exec nginx-restored -- ls /mnt/azuredisk

명령의 출력은 다음 예제와 유사합니다.

lost+found
outfile
test.txt

예상대로 이전에 만든 test.txt 파일을 계속 볼 수 있습니다.

볼륨 복제

복제된 볼륨은 기존 Kubernetes 볼륨의 복제로 정의됩니다. Kubernetes의 볼륨 복제에 관한 자세한 내용은 볼륨 복제에 관한 개념 문서를 참조하세요.

Azure Disks용 CSI 드라이버는 볼륨 복제를 지원합니다. 시연하려면 이전에 만든azuredisk-pvc복제된 볼륨을 만들고 해당 볼륨을 사용하는 새 Pod를 만듭니다.

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azuredisk-csi-driver/master/deploy/example/cloning/pvc-azuredisk-cloning.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azuredisk-csi-driver/master/deploy/example/cloning/nginx-pod-restored-cloning.yaml

명령의 출력은 다음 예제와 유사합니다.

persistentvolumeclaim/pvc-azuredisk-cloning created
pod/nginx-restored-cloning created

다음 명령을 실행하고 test.txt 파일이 만들어졌는지 확인하여 복제된 볼륨의 콘텐츠를 확인할 수 있습니다.

kubectl exec nginx-restored-cloning -- ls /mnt/azuredisk

명령의 출력은 다음 예제와 유사합니다.

lost+found
outfile
test.txt

가동 중지 시간 없이 영구 볼륨 크기 조정

더 큰 용량의 PVC를 요청할 수 있습니다. PVC 개체를 편집하고 더 큰 크기를 지정합니다. 이 변경때문에 PV를 지원하는 기본 볼륨의 확장이 트리거됩니다.

참고 항목

클레임을 충족하기 위해 새 PV를 만들지 않습니다. 대신 기존 볼륨의 크기가 조정됩니다.

AKS에서 기본 제공 managed-csi 스토리지 클래스는 이미 확장을 지원하므로 이 스토리지 클래스로 이전에 만든 PVC 를 사용합니다. PVC에서 10-Gi 영구 볼륨을 요청했습니다. 다음 명령을 실행하여 확인할 수 있습니다.

kubectl exec -it nginx-azuredisk -- df -h /mnt/azuredisk

명령의 출력은 다음 예제와 유사합니다.

Filesystem      Size  Used Avail Use% Mounted on
/dev/sdc        9.8G   42M  9.8G   1% /mnt/azuredisk

다음 명령을 실행하여 spec.resources.requests.storage 필드를 늘림으로써 PVC를 확장합니다.

kubectl patch pvc pvc-azuredisk --type merge --patch '{"spec": {"resources": {"requests": {"storage": "15Gi"}}}}'

참고 항목

영구 볼륨 축소는 현재 지원되지 않습니다. 현재 PVC보다 크기가 작은 기존 PVC를 패치하려고 하면 다음과 같은 오류 메시지가 표시됩니다. The persistentVolumeClaim "pvc-azuredisk" is invalid: spec.resources.requests.storage: Forbidden: field can not be less than previous value.

명령의 출력은 다음 예제와 유사합니다.

persistentvolumeclaim/pvc-azuredisk patched

다음 명령을 실행하여 볼륨 크기가 증가했는지 확인합니다.

kubectl get pv

명령의 출력은 다음 예제와 유사합니다.

NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                                     STORAGECLASS   REASON   AGE
pvc-391ea1a6-0191-4022-b915-c8dc4216174a   15Gi       RWO            Delete           Bound    default/pvc-azuredisk                     managed-csi             2d2h
(...)

그리고 몇 분 후에 다음 명령을 실행하여 PVC의 크기를 확인합니다.

kubectl get pvc pvc-azuredisk

명령의 출력은 다음 예제와 유사합니다.

NAME            STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc-azuredisk   Bound    pvc-391ea1a6-0191-4022-b915-c8dc4216174a   15Gi       RWO            managed-csi    2d2h

다음 명령을 실행하여 Pod 내부의 디스크 크기를 확인합니다.

kubectl exec -it nginx-azuredisk -- df -h /mnt/azuredisk

명령의 출력은 다음 예제와 유사합니다.

Filesystem      Size  Used Avail Use% Mounted on
/dev/sdc         15G   46M   15G   1% /mnt/azuredisk

주문형 버스팅

요구 사항이 현재 용량을 초과할 때마다 주문형 디스크 버스팅 모델에서 디스크 버스트를 허용합니다. 이 모델은 디스크 버스트가 발생할 때마다 추가 요금을 생성합니다. 주문형 버스트는 512GiB보다 큰 프리미엄 SSD에만 사용할 수 있습니다. 프로비전된 프리미엄 SSD IOPS 및 디스크당 처리량에 대한 자세한 내용은 프리미엄 SSD 크기를 참조하세요. 또는 크레딧 기반 버스팅은 버스트 크레딧이 크레딧 버킷에 누적된 경우에만 디스크가 버스트되는 곳입니다. 크레딧 기반 버스팅은 디스크 버스트 시 추가 요금을 생성하지 않습니다. 크레딧 기반 버스팅은 프리미엄 SSD 512GiB 이하 및 표준 SSD 1024GiB 이하에서만 사용할 수 있습니다. 주문형 버스팅에 대한 자세한 내용은 주문형 버스팅을 참조하세요.

Important

기본 managed-csi-premium 스토리지 클래스는 주문형 버스팅이 사용하지 않도록 설정되며 크레딧 기반 버스팅을 사용합니다. 기본 managed-csi-premium 스토리지 클래스를 기반으로 하는 영구 볼륨 클레임에서 동적으로 만든 프리미엄 SSD에도 주문형 버스팅이 사용하지 않도록 설정됩니다.

주문형 버스팅이 사용하도록 설정된 프리미엄 SSD 영구 볼륨을 만들려면 다음 YAML 템플릿과 같이 enableBursting 매개 변수를 true로 설정하여 새 스토리지 클래스를 만들 수 있습니다. 주문형 버스팅을 사용하도록 설정하는 방법에 대한 자세한 내용은 주문형 버스팅를 참조하세요. 주문형 버스팅이 사용하도록 설정된 자체 스토리지 클래스 빌드에 대한 자세한 내용은 버스트 가능한 관리 CSI Premium Storage 클래스 만들기를 참조하세요.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: burstable-managed-csi-premium
provisioner: disk.csi.azure.com
parameters:
  skuname: Premium_LRS
  enableBursting: "true"
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true

Windows 컨테이너

Azure Disk CSI 드라이버는 Windows 노드와 컨테이너를 지원합니다. Windows 컨테이너를 사용하려면 Windows 컨테이너 빠른 시작에 따라 Windows 노드 풀을 추가합니다.

Windows 노드 풀이 있으면 이제 managed-csi와 같은 기본 제공 스토리지 클래스를 사용할 수 있습니다. 다음 kubectl apply 명령을 실행하여 타임스탬프를 data.txt 파일에 저장하는 Windows 기반 상태 저장 세트 예제를 배포할 수 있습니다.

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azuredisk-csi-driver/master/deploy/example/windows/statefulset.yaml

명령의 출력은 다음 예제와 유사합니다.

statefulset.apps/busybox-azuredisk created

볼륨 콘텐츠의 유효성을 검사하려면 다음 명령을 실행합니다.

kubectl exec -it busybox-azuredisk-0 -- cat c:\\mnt\\azuredisk\\data.txt # on Linux/MacOS Bash
kubectl exec -it busybox-azuredisk-0 -- cat c:\mnt\azuredisk\data.txt # on Windows Powershell/CMD

명령의 출력은 다음 예제와 유사합니다.

2020-08-27 08:13:41Z
2020-08-27 08:13:42Z
2020-08-27 08:13:44Z
(...)

다음 단계