AKS(Azure Kubernetes Service)에서 Azure 디스크가 포함된 볼륨을 수동으로 만들어 사용
영구 볼륨은 Kubernetes Pod와 함께 사용할 수 있도록 프로비전된 스토리지 부분을 나타냅니다. Pod 하나 이상에서 영구 볼륨을 사용할 수 있으며 동적 또는 정적으로 프로비전할 수 있습니다. 이 문서에서는 AKS(Azure Kubernetes Service) 클러스터에서 Azure Disks를 사용하여 영구 볼륨을 동적으로 만드는 방법을 보여줍니다.
참고 항목
Azure 디스크는 액세스 모드 형식 ReadWriteOnce만 사용하여 탑재할 수 있으며, 이렇게 탑재한 디스크는 AKS의 한 노드에서 사용 가능합니다. 이 액세스 모드를 계속 사용하면 Pod가 같은 노드에서 실행될 때 Pod 여러 개가 볼륨에 액세스할 수 있습니다. 자세한 내용은 Kubernetes PersistentVolume 액세스 모드를 참조하세요.
이 문서는 다음을 수행하는 방법을 보여줍니다.
- CSI(Container Storage Interface) 드라이버를 설치하고 Pod에 연결할 Azure 관리 디스크를 하나 이상 동적으로 만들어 동적 PV(영구 볼륨)를 사용합니다.
- Azure 관리 디스크를 하나 이상 만들어 정적 PV를 사용하거나 기존 정적 PV를 사용하여 Pod에 연결합니다.
Kubernetes 볼륨에 대한 자세한 내용은 AKS의 애플리케이션에 대한 스토리지 옵션을 참조하세요.
시작하기 전에
Azure CLI 버전 2.0.59 이상이 설치 및 구성되어 있어야 합니다.
az --version
을 실행하여 버전을 찾습니다. 설치 또는 업그레이드해야 하는 경우 Azure CLI 설치를 참조하세요.Azure Disk CSI 드라이버에는 노드당 볼륨 제한이 있습니다. 볼륨 수는 노드/노드 풀의 크기에 따라 변경됩니다. kubectl get 명령을 실행하여 노드당 할당할 수 있는 볼륨 수를 확인합니다.
kubectl get CSINode <nodename> -o yaml
노드당 볼륨 제한이 워크로드에 문제가 있는 경우 CSI 드라이버 대신 영구 볼륨에 Azure Container Storage를 사용하는 것이 좋습니다.
동적으로 볼륨 프로비전
이 섹션에서는 워크로드에서 사용할 Azure Disk Storage의 세부 정보가 포함된 영구 볼륨을 하나 이상 프로비전하려는 클러스터 관리자를 위한 지침을 제공합니다. PVC(영구 볼륨 클레임)는 스토리지 클래스 개체를 사용하여 Azure Disk Storage 컨테이너를 동적으로 프로비전합니다.
동적 영구 볼륨에 대한 스토리지 클래스 매개 변수
다음 표에는 PersistentVolumeClaim에 대한 사용자 지정 스토리지 클래스를 정의하는 데 사용할 수 있는 매개 변수가 나와 있습니다.
속성 | 의미 | 사용 가능한 값 | 필수 | 기본값 |
---|---|---|---|---|
skuName | Azure Disks 스토리지 계정 유형(별칭: storageAccountType ) |
Standard_LRS , Premium_LRS , StandardSSD_LRS , PremiumV2_LRS , UltraSSD_LRS , Premium_ZRS StandardSSD_ZRS |
아니요 | StandardSSD_LRS |
fsType | 파일 시스템 유형 | Linux의 경우 ext4 , ext3 , ext2 , xfs , btrfs , Windows의 경우 ntfs |
아니요 | Linux의 경우 ext4 , Windows의 경우 ntfs |
cachingMode | Azure Data Disk 호스트 캐시 설정(PremiumV2_LRS 및 UltraSSD_LRS는 None 캐싱 모드만 지원) |
None , , ReadOnly ReadWrite |
아니요 | ReadOnly |
resourceGroup | Azure Disks의 리소스 그룹을 지정합니다. | 기존 리소스 그룹 이름 | 아니요 | 비어 있으면 드라이버에서 현재 AKS 클러스터와 동일한 리소스 그룹 이름을 사용합니다. |
DiskIOPSReadWrite | UltraSSD 디스크 또는 Premium SSD v2 IOPS 기능(최소: 2IOPS/GiB) | 100~160000 | 아니요 | 500 |
DiskMBpsReadWrite | UltraSSD 디스크 또는 Premium SSD v2 처리량 기능(최소: 0.032/GiB) | 1~2000 | 아니요 | 100 |
LogicalSectorSize | Ultra 디스크의 논리 섹터 크기(바이트)입니다. 지원되는 값은 512 및 4096입니다. 기본값은 4096입니다. | 512 , 4096 |
아니요 | 4096 |
tags | Azure Disks 태그 | 태그 형식: key1=val1,key2=val2 |
아니요 | "" |
diskEncryptionSetID | 미사용 데이터 암호화를 사용하도록 설정하는 데 사용할 디스크 암호화 집합의 ResourceId | 형식: /subscriptions/{subs-id}/resourceGroups/{rg-name}/providers/Microsoft.Compute/diskEncryptionSets/{diskEncryptionSet-name} |
아니요 | "" |
diskEncryptionType | 디스크 암호화 집합의 암호화 유형 | EncryptionAtRestWithCustomerKey (기본값), EncryptionAtRestWithPlatformAndCustomerKeys |
아니요 | "" |
writeAcceleratorEnabled | Azure 디스크의 쓰기 가속기 | true , false |
아니요 | "" |
networkAccessPolicy | 디스크 또는 스냅샷에 대한 SAS URI 생성을 방지하기 위한 NetworkAccessPolicy 속성 | AllowAll , , DenyAll AllowPrivate |
아니요 | AllowAll |
diskAccessID | 디스크에서 프라이빗 엔드포인트를 사용하기 위한 DiskAccess 리소스의 Azure 리소스 ID | 아니요 | `` | |
enableBursting | 디스크의 프로비전된 성능 목표를 초과하여 주문형 버스팅을 사용하도록 설정합니다. 주문형 버스팅은 디스크 크기가 512GB보다 큰 프리미엄 디스크에만 적용해야 합니다. Ultra 및 공유 디스크는 지원되지 않습니다. 버스팅은 기본적으로 사용하지 않도록 설정되어 있습니다. | true , false |
아니요 | false |
useragent | 고객 사용량 특성에 사용되는 사용자 에이전트 | 아니요 | driverName/driverVersion compiler/version (OS-ARCH) 형식으로 생성된 Useragent |
|
subscriptionID | Azure Disks가 만들어지는 Azure 구독 ID를 지정합니다. | Azure 구독 ID | 아니요 | 비어 있지 않은 경우 resourceGroup 을 제공해야 합니다. |
--- | 다음 매개 변수는 v2에만 해당됩니다. | --- | --- | --- |
maxShares | 디스크에 허용되는 총 공유 디스크 탑재 수입니다. 값을 2 이상으로 설정하면 첨부 파일 복제본을 사용할 수 있습니다. | 지원되는 값은 디스크 크기에 따라 달라집니다. 지원되는 값은 Azure 관리 디스크 공유를 참조하세요. | 아니요 | 1 |
maxMountReplicaCount | 유지 관리할 복제본 첨부 파일 수입니다. | 이 값은 [0..(maxShares - 1)] 범위 이내에 있어야 합니다. |
아니요 | accessMode 가 ReadWriteMany 이면 기본값은 0 입니다. 그렇지 않으면 기본값은 maxShares - 1 입니다. |
기본 제공 스토리지 클래스
스토리지 클래스는 스토리지 단위가 영구 볼륨에서 동적으로 생성되는 방법을 정의합니다. Kubernetes 스토리지 클래스에 대한 자세한 내용은 Kubernetes 스토리지 클래스를 참조하세요.
각 AKS 클러스터에는 미리 생성된 스토리지 클래스 4개가 포함되며 그 중 2개는 Azure Disks를 사용하도록 구성됩니다.
- default 스토리지 클래스는 표준 SSD Azure Disks를 프로비저닝합니다.
- 표준 SSD는 표준 스토리지를 지원하고 안정적인 성능을 계속 제공하면서도 비용 효율적인 스토리지를 제공합니다.
- managed-csi-premium 스토리지 클래스는 프리미엄 Azure Disks를 프로비저닝합니다.
- 대기 시간이 짧은 SSD 기반 고성능은 디스크는 프리미엄 디스크를 지원합니다. 프로덕션 워크로드를 실행하는 VM에 이상적입니다. AKS에서 Azure Disk CSI 드라이버를 사용하는 경우 표준 SSD LRS(로컬 중복 스토리지)에서 지원되는
managed-csi
스토리지 클래스를 사용할 수도 있습니다.
- 대기 시간이 짧은 SSD 기반 고성능은 디스크는 프리미엄 디스크를 지원합니다. 프로덕션 워크로드를 실행하는 VM에 이상적입니다. AKS에서 Azure Disk CSI 드라이버를 사용하는 경우 표준 SSD LRS(로컬 중복 스토리지)에서 지원되는
- Kubernetes 버전 1.29부터 효과적으로 AKS(Azure Kubernetes Service) 클러스터를 여러 가용성 영역에 배포할 때 AKS는 이제 ZRS(영역 중복 스토리지)를 활용하여 기본 제공 스토리지 클래스 내에 관리 디스크를 만듭니다.
- ZRS는 선택한 지역의 여러 Azure 가용성 영역에서 Azure 관리 디스크의 동기 복제를 보장합니다. 이 중복성 전략은 애플리케이션의 복원력을 강화하고 데이터 센터 오류로부터 데이터를 보호합니다.
- 그러나 ZRS(영역 중복 스토리지)는 LRS(로컬 중복 스토리지)에 비해 비용이 더 높다는 점에 유의해야 합니다. 비용 최적화가 우선 순위인 경우 LRS SKU 이름 매개 변수를 사용하여 새 스토리지 클래스를 만들고 영구 볼륨 클레임에 사용할 수 있습니다.
데이터 손실의 위험으로 인해 PVC 크기를 줄이는 것은 지원되지 않습니다. kubectl edit sc
명령을 사용하여 기존 스토리지 클래스를 편집하거나 고유한 사용자 지정 스토리지 클래스를 만들 수 있습니다. 예를 들어 크기가 4TiB인 디스크를 사용하려는 경우 디스크 캐싱이 4TiB 이상인 디스크에 대해 지원되지 않으므로 cachingmode: None
을 정의하는 스토리지 클래스를 만들어야 합니다. 스토리지 클래스 및 자체 스토리지 클래스 만들기에 대한 자세한 내용은 AKS의 애플리케이션에 대한 스토리지 옵션을 참조하세요.
kubectl get sc
명령을 사용하여 미리 생성된 스토리지 클래스를 확인할 수 있습니다. 다음 예제에서는 AKS 클러스터 내에서 사용할 수 있는 미리 생성된 스토리지 클래스를 보여줍니다.
kubectl get sc
명령의 출력은 다음 예제와 유사합니다.
NAME PROVISIONER AGE
default (default) disk.csi.azure.com 1h
managed-csi disk.csi.azure.com 1h
참고 항목
영구 볼륨 클레임은 GiB로 지정되지만 Azure 관리 디스크는 특정 크기에 대한 SKU로 청구됩니다. 이러한 SKU의 범위는 32GiB(S4 또는 P4 디스크)~32TiB(S80 또는 P80 디스크) 사이입니다(미리 보기). 프리미엄 관리 디스크의 처리량 및 IOPS 성능은 SKU 및 AKS 클러스터에서 노드의 인스턴스 크기에 따라 달라집니다. 자세한 내용은 Managed Disks의 가격 책정 및 성능을 참조하세요.
영구적 볼륨 클레임 만들기
영구 볼륨 클레임은 스토리지 클래스를 기반으로 스토리지를 자동으로 프로비전합니다. 이 경우 PVC는 미리 생성된 스토리지 클래스 중 하나를 사용하여 표준 또는 프리미엄 Azure 관리 디스크를 만들 수 있습니다.
파일
azure-pvc.yaml
을 만들고 다음 매니페스트에 복사합니다. 클레임을 사용하려면 ReadWriteOnce 액세스 권한이 있는 5GB 크기의azure-managed-disk
이라는 디스크가 필요합니다. managed-csi 스토리지 클래스를 스토리지 클래스로 지정합니다.apiVersion: v1 kind: PersistentVolumeClaim metadata: name: azure-managed-disk spec: accessModes: - ReadWriteOnce storageClassName: managed-csi resources: requests: storage: 5Gi
팁
프리미엄 스토리지를 사용하는 디스크를 만들려면 managed-csi 대신 storageClassName: managed-csi-premium
을 사용합니다.
kubectl apply
명령을 사용하여 영구 볼륨 클레임을 만들고 azure-pvc.yaml 파일을 지정합니다.kubectl apply -f azure-pvc.yaml
명령의 출력은 다음 예제와 유사합니다.
persistentvolumeclaim/azure-managed-disk created
영구적 볼륨 사용
영구 볼륨 클레임을 만든 후에는 Pending
상태가 있는지 확인해야 합니다. Pending
상태는 Pod에서 사용할 준비가 되었음을 나타냅니다.
kubectl describe pvc
명령을 사용하여 PVC 상태를 확인합니다.kubectl describe pvc azure-managed-disk
명령 출력은 다음 요약 예제와 비슷합니다.
Name: azure-managed-disk Namespace: default StorageClass: managed-csi Status: Pending [...]
파일
azure-pvc-disk.yaml
을 만들고 다음 매니페스트에 복사합니다. 이 매니페스트는 azure-managed-disk라는 영구 볼륨 클레임을 사용하여/mnt/azure
경로에 Azure Disk를 탑재하는 기본 NGINX Pod를 만듭니다. Windows Server 컨테이너의 경우 ‘D:’와 같이 Windows 경로 규칙을 사용하여 mountPath를 지정합니다.kind: Pod apiVersion: v1 metadata: name: mypod spec: containers: - name: mypod image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine resources: requests: cpu: 100m memory: 128Mi limits: cpu: 250m memory: 256Mi volumeMounts: - mountPath: "/mnt/azure" name: volume readOnly: false volumes: - name: volume persistentVolumeClaim: claimName: azure-managed-disk
kubectl apply
명령을 사용하여 Pod를 만듭니다.kubectl apply -f azure-pvc-disk.yaml
명령의 출력은 다음 예제와 유사합니다.
pod/mypod created
이제 Azure Disks가
/mnt/azure
디렉터리에 탑재된 Pod가 실행되고 있습니다.kubectl describe
명령을 사용하여 Pod 구성을 확인합니다.kubectl describe pod mypod
명령의 출력은 다음 예제와 유사합니다.
[...] Volumes: volume: Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace) ClaimName: azure-managed-disk ReadOnly: false default-token-smm2n: Type: Secret (a volume populated by a Secret) SecretName: default-token-smm2n Optional: false [...] Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 2m default-scheduler Successfully assigned mypod to aks-nodepool1-79590246-0 Normal SuccessfulMountVolume 2m kubelet, aks-nodepool1-79590246-0 MountVolume.SetUp succeeded for volume "default-token-smm2n" Normal SuccessfulMountVolume 1m kubelet, aks-nodepool1-79590246-0 MountVolume.SetUp succeeded for volume "pvc-faf0f176-8b8d-11e8-923b-deb28c58d242" [...]
Azure Ultra Disk 사용
Azure Ultra Disk를 사용하려면 AKS(Azure Kubernetes Service)에서 울트라 디스크 사용을 참조하세요.
Azure 태그 사용
Azure 태그 사용에 대한 자세한 내용은 AKS(Azure Kubernetes Service)에서 Azure 태그 사용을 참조하세요.
정적으로 볼륨 프로비전
이 섹션에서는 워크로드에서 사용할 Azure 디스크의 세부 정보가 포함된 영구 볼륨을 하나 이상 만들려는 클러스터 관리자를 위한 지침을 제공합니다.
영구 볼륨에 대한 정적 프로비전 매개 변수
다음 표에는 영구 볼륨을 정의하는 데 사용할 수 있는 매개 변수가 나와 있습니다.
속성 | 의미 | 사용 가능한 값 | 필수 | 기본값 |
---|---|---|---|---|
volumeHandle | Azure 디스크 URI | /subscriptions/{sub-id}/resourcegroups/{group-name}/providers/microsoft.compute/disks/{disk-id} |
예 | 해당 없음 |
volumeAttributes.fsType | 파일 시스템 유형 | Linux의 경우 ext4 , ext3 , ext2 , xfs , btrfs , Windows의 경우 ntfs |
아니요 | Linux의 경우 ext4 , Windows의 경우 ntfs |
volumeAttributes.partition | 기존 디스크의 파티션 번호(Linux에서만 지원됨) | 1 , , 2 3 |
아니요 | 비어 있음(파티션 없음) - 파티션 형식이 -part1 과 같은지 확인 |
volumeAttributes.cachingMode | 디스크 호스트 캐시 설정 | None , , ReadOnly ReadWrite |
아니요 | ReadOnly |
Azure 디스크 만들기
AKS에서 사용할 Azure 디스크를 만들 때는 노드 리소스 그룹에 디스크 리소스를 만들 수 있습니다. 이러한 방식을 사용하면 AKS 클러스터가 디스크 리소스에 액세스하고 해당 리소스를 관리할 수 있습니다. 이 방식 대신 별도의 리소스 그룹에 디스크를 만들어야 하는 경우에는 클러스터의 AKS(Azure Kubernetes Service) 관리 ID에 디스크 리소스 그룹에 대한 Contributor
역할을 부여해야 합니다.
az aks show
명령을 사용하여 리소스 그룹 이름을 식별하고--query nodeResourceGroup
매개 변수를 추가합니다.az aks show --resource-group myResourceGroup --name myAKSCluster --query nodeResourceGroup -o tsv
명령의 출력은 다음 예제와 유사합니다.
MC_myResourceGroup_myAKSCluster_eastus
az disk create
명령을 사용하여 디스크를 만듭니다. 노드 리소스 그룹 이름과 디스크 리소스 이름 지정합니다(예: myAKSDisk). 다음 예제에서는 20GiB 디스크를 만들고 생성된 디스크의 ID를 출력합니다. Windows Server 컨테이너에 사용할 디스크를 만들어야 하는 경우 디스크를 올바르게 포맷하는--os-type windows
매개 변수를 추가합니다.az disk create \ --resource-group MC_myResourceGroup_myAKSCluster_eastus \ --name myAKSDisk \ --size-gb 20 \ --query id --output tsv
참고 항목
Azure Disks 요금은 특정 크기의 SKU를 기준으로 청구됩니다. 이러한 SKU의 범위는 32GiB(S4 또는 P4 디스크)~32TiB(S80 또는 P80 디스크) 사이입니다(미리 보기). 프리미엄 관리 디스크의 처리량 및 IOPS 성능은 SKU 및 AKS 클러스터에서 노드의 인스턴스 크기에 따라 달라집니다. Managed Disks의 가격 책정 및 성능을 참조하세요.
다음 예제 출력에 나와 있는 것처럼 명령이 정상적으로 완료되면 디스크 리소스 ID가 표시됩니다. 다음 섹션에서는 디스크 ID를 사용하여 디스크를 탑재합니다.
/subscriptions/<subscriptionID>/resourceGroups/MC_myAKSCluster_myAKSCluster_eastus/providers/Microsoft.Compute/disks/myAKSDisk
볼륨으로 디스크 탑재
PersistentVolume을 사용하여 pv-azuredisk.yaml 파일을 만듭니다. 이전 단계의 디스크 리소스 ID로
volumeHandle
을 업데이트합니다. Windows Server 컨테이너의 경우 매개 변수 fsType에 대한 ntfs를 지정합니다.apiVersion: v1 kind: PersistentVolume metadata: annotations: pv.kubernetes.io/provisioned-by: disk.csi.azure.com name: pv-azuredisk spec: capacity: storage: 20Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: managed-csi csi: driver: disk.csi.azure.com volumeHandle: /subscriptions/<subscriptionID>/resourceGroups/MC_myAKSCluster_myAKSCluster_eastus/providers/Microsoft.Compute/disks/myAKSDisk volumeAttributes: fsType: ext4
PersistentVolume을 사용하는 PersistentVolumeClaim을 사용하여 pvc-azuredisk.yaml 파일을 만듭니다.
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-azuredisk spec: accessModes: - ReadWriteOnce resources: requests: storage: 20Gi volumeName: pv-azuredisk storageClassName: managed-csi
kubectl apply
명령을 사용하여 PersistentVolume 및 PersistentVolumeClaim을 만들고 생성된 YAML 파일 2개를 참조합니다.kubectl apply -f pv-azuredisk.yaml kubectl apply -f pvc-azuredisk.yaml
kubectl get pvc
명령을 사용하여 PersistentVolumeClaim이 생성되고 PersistentVolume에 바인딩되어 있는지 확인합니다.kubectl get pvc pvc-azuredisk
명령의 출력은 다음 예제와 유사합니다.
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE pvc-azuredisk Bound pv-azuredisk 20Gi RWO 5s
PersistentVolumeClaim을 참조하는 azure-disk-pod.yaml 파일을 만듭니다. Windows Server 컨테이너의 경우 ‘D:’와 같이 Windows 경로 규칙을 사용하여 mountPath를 지정합니다.
apiVersion: v1 kind: Pod metadata: name: mypod spec: nodeSelector: kubernetes.io/os: linux containers: - image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine name: mypod resources: requests: cpu: 100m memory: 128Mi limits: cpu: 250m memory: 256Mi volumeMounts: - name: azure mountPath: /mnt/azure volumes: - name: azure persistentVolumeClaim: claimName: pvc-azuredisk
구성을 적용하고
kubectl apply
명령을 사용하여 볼륨을 탑재합니다.kubectl apply -f azure-disk-pod.yaml
리소스 정리
이 문서에서 만든 리소스를 사용한 경우에는 kubectl delete
명령을 사용하여 제거할 수 있습니다.
# Remove the pod
kubectl delete -f azure-pvc-disk.yaml
# Remove the persistent volume claim
kubectl delete -f azure-pvc.yaml
다음 단계
- Azure Disks Storage용 CSI 드라이버를 사용하는 방법은 CSI 드라이버에서 Azure Disks Storage 사용을 참조하세요.
- 관련 모범 사례는 AKS에서 스토리지 및 백업에 대한 모범 사례를 참조하세요.
Azure Kubernetes Service