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
    

동적으로 볼륨 프로비전

이 섹션에서는 워크로드에서 사용할 Azure Disk Storage의 세부 정보가 포함된 영구 볼륨을 하나 이상 프로비전하려는 클러스터 관리자를 위한 지침을 제공합니다. PVC(영구 볼륨 클레임)는 스토리지 클래스 개체를 사용하여 Azure Disk Storage 컨테이너를 동적으로 프로비전합니다.

동적 PersistentVolumes에 대한 스토리지 클래스 매개 변수

다음 표에는 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 데이터 디스크 호스트 캐시 설정 None, ReadOnly, ReadWrite 아니요 ReadOnly
resourceGroup Azure Disks의 리소스 그룹을 지정합니다. 기존 리소스 그룹 이름 아니요 비어 있으면 드라이버에서 현재 AKS 클러스터와 동일한 리소스 그룹 이름을 사용합니다.
DiskIOPSReadWrite UltraSSD 디스크 또는 프리미엄 SSD v2 IOPS 기능(최소: 2IOPS/GiB) 100~160000 아니요 500
DiskMBpsReadWrite UltraSSD 디스크 또는 프리미엄 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)] 범위 이내에 있어야 합니다. 아니요 accessModeReadWriteMany이면 기본값은 0입니다. 그렇지 않으면 기본값은 maxShares - 1입니다.

기본 제공 스토리지 클래스

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

각 AKS 클러스터에는 미리 생성된 스토리지 클래스 4개가 포함되며 그 중 2개는 Azure Disks를 사용하도록 구성됩니다.

  1. default 스토리지 클래스는 표준 SSD Azure Disks를 프로비저닝합니다.
    • 표준 SSD는 표준 스토리지를 지원하고 안정적인 성능을 계속 제공하면서도 비용 효율적인 스토리지를 제공합니다.
  2. managed-csi-premium 스토리지 클래스는 프리미엄 Azure Disks를 프로비저닝합니다.
    • 대기 시간이 짧은 SSD 기반 고성능은 디스크는 프리미엄 디스크를 지원합니다. 프로덕션 워크로드를 실행하는 VM에 이상적입니다. AKS에서 Azure Disk CSI 드라이버를 사용하는 경우 표준 SSD LRS(로컬 중복 스토리지)에서 지원되는 managed-csi 스토리지 클래스를 사용할 수도 있습니다.

데이터 손실의 위험으로 인해 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(영구 볼륨 클레임)은 스토리지 클래스를 기반으로 하는 스토리지를 자동으로 프로비전합니다. 이 경우 PVC는 미리 생성된 스토리지 클래스 중 하나를 사용하여 표준 또는 프리미엄 Azure 관리 디스크를 만들 수 있습니다.

  1. 파일 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을 사용합니다.

  1. kubectl apply 명령을 사용하여 영구 볼륨 클레임을 만들고 azure-pvc.yaml 파일을 지정합니다.

    kubectl apply -f azure-pvc.yaml
    

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

    persistentvolumeclaim/azure-managed-disk created
    

영구적 볼륨 사용

영구 볼륨 클레임을 만든 후에는 Pending 상태가 있는지 확인해야 합니다. Pending 상태는 Pod에서 사용할 준비가 되었음을 나타냅니다.

  1. kubectl describe pvc 명령을 사용하여 PVC 상태를 확인합니다.

    kubectl describe pvc azure-managed-disk
    

    명령 출력은 다음 요약 예제와 비슷합니다.

    Name:            azure-managed-disk
    Namespace:       default
    StorageClass:    managed-csi
    Status:          Pending
    [...]
    
  2. 파일 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
    
  3. kubectl apply 명령을 사용하여 Pod를 만듭니다.

     kubectl apply -f azure-pvc-disk.yaml
    

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

    pod/mypod created
    
  4. 이제 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 역할을 부여해야 합니다.

  1. az aks show 명령을 사용하여 리소스 그룹 이름을 식별하고 --query nodeResourceGroup 매개 변수를 추가합니다.

    az aks show --resource-group myResourceGroup --name myAKSCluster --query nodeResourceGroup -o tsv
    

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

    MC_myResourceGroup_myAKSCluster_eastus
    
  2. 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
    

볼륨으로 디스크 탑재

  1. 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
    
  2. 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
    
  3. kubectl apply 명령을 사용하여 PersistentVolumePersistentVolumeClaim을 만들고 생성된 YAML 파일 2개를 참조합니다.

    kubectl apply -f pv-azuredisk.yaml
    kubectl apply -f pvc-azuredisk.yaml
    
  4. 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
    
  5. 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
    
  6. 구성을 적용하고 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

다음 단계