Share via


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

Azure Files CSI(Container Storage Interface) 드라이버는 AKS(Azure Kubernetes Service)에서 Azure 파일 공유의 수명 주기를 관리하는 데 사용하는 CSI 사양 규격 드라이버입니다. CSI는 임의 블록과 파일 스토리지 시스템을 Kubernetes의 컨테이너화된 워크로드에 공개하는 표준입니다.

CSI를 채택하고 사용하면 이제 AKS는 플러그 인을 작성, 배포 및 반복하여 Kubernetes에서 새로운 스토리지 시스템을 공개하거나 기존 스토리지 시스템을 개선할 수 있습니다. AKS에서 CSI 드라이버를 사용하면 핵심 Kubernetes 코드를 조정하고 릴리스 주기를 기다릴 필요가 없습니다.

CSI 드라이버를 지원하는 AKS 클러스터를 만들려면 AKS에서 CSI 드라이버 사용을 참조하세요.

참고 항목

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

Azure Files CSI 드라이버의 새로운 기능

원래의 인트리 드라이버 기능 외에도 Azure Files CSI 드라이버에서 지원하는 새로운 기능은 다음과 같습니다.

Azure Files에서 영구 볼륨 사용

PV(영구 볼륨)는 Kubernetes Pod와 함께 사용하도록 프로비전된 스토리지 부분을 나타냅니다. PV는 하나 이상의 Pod에서 사용할 수 있으며 동적 또는 정적으로 프로비저닝할 수 있습니다. 여러 Pod에서 동일한 스토리지 볼륨에 동시에 액세스해야 하는 경우 Azure Files에서 SMB(서버 메시지 블록) 또는 NFS 프로토콜을 사용하여 연결할 수 있습니다. 이 문서에서는 AKS 클러스터에서 여러 Pod에 사용할 Azure Files공유를 동적으로 만드는 방법을 설명합니다. 정적 프로비저닝은 Azure Files 공유를 사용하여 수동으로 볼륨 만들기 및 사용을 참조하세요.

Azure Files 공유를 사용하면 노드에 탑재할 수 있는 수에 제한이 없습니다.

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

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

스토리지 클래스는 Azure 파일 공유를 만드는 방법을 정의하는 데 사용됩니다. 스토리지 계정은 Azure Files 공유를 보관할 스토리지 클래스에서 사용할 수 있도록 자동으로 노드 리소스 그룹에 생성됩니다. skuName에 대해 다음 Azure Storage 중복 SKU 중 하나를 선택합니다.

  • Standard_LRS: 표준 로컬 중복 스토리지
  • Standard_GRS: 표준 지역 중복 스토리지
  • Standard_ZRS: 표준 영역 중복 스토리지
  • Standard_RAGRS: 표준 읽기 액세스 지역 중복 스토리지
  • Standard_RAGZRS: 표준 읽기 액세스 지역 영역 중복 스토리지
  • Premium_LRS: 프리미엄 로컬 중복 스토리지
  • Premium_ZRS - 프리미엄 영역 중복 스토리지

참고 항목

Azure Files는 Azure Premium 파일 공유를 지원합니다. 최소 파일 공유 용량은 100GiB입니다. 프리미엄 파일 공유는 I/O 집약적 워크로드에 대해 더 높은 성능, 짧은 대기 시간 디스크 지원을 제공하므로 표준 파일 공유 대신 Azure Premium 파일 공유를 사용하는 것이 좋습니다.

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

  • azurefile-csi: Azure Standard Storage를 사용하여 Azure 파일 공유를 만듭니다.
  • azurefile-csi-premium: Azure Premium Storage를 사용하여 Azure 파일 공유를 만듭니다.

두 스토리지 클래스의 회수 정책 때문에 각 PV가 삭제될 때 기본 Azure 파일 공유가 삭제됩니다. 또한 스토리지 클래스는 파일 공유를 확장 가능하도록 구성하므로 사용자는 영구적 볼륨 클레임(PVC)을 새 크기로 편집하기만 하면 됩니다.

이러한 스토리지 클래스를 사용하려면 해당 클래스를 참조하고 사용하는 PVC 및 해당 Pod를 만듭니다. PVC는 스토리지 클래스에 따라 스토리지를 자동으로 프로비전하는 데 사용됩니다. PVC는 미리 만든 스토리지 클래스 중 하나 또는 사용자 정의 스토리지 클래스를 사용하여 원하는 SKU와 크기에 맞는 Azure 파일 공유를 만들 수 있습니다. Pod 정의를 만들 때 원하는 스토리지를 요청하도록 PVC가 지정됩니다.

kubectl apply 명령을 실행하여 현재 날짜를 outfile에 출력하는 예제 PVC 및 Pod를 만듭니다.

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

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

persistentvolumeclaim/pvc-azurefile created
pod/nginx-azurefile created

Pod가 실행 중 상태이면 다음 명령을 실행하고 출력에 다음이 포함되어 있는지 확인하여 파일 공유가 올바르게 탑재되었는지 확인할 수 있습니다 outfile.

kubectl exec nginx-azurefile -- ls -l /mnt/azurefile

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

total 29
-rwxrwxrwx 1 root root 29348 Aug 31 21:59 outfile

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

기본 스토리지 클래스는 가장 일반적인 시나리오에 적합하지만 전부는 아닙니다. 경우에 따라 고유한 매개 변수를 사용하여 사용자 고유의 스토리지 클래스를 사용자 지정하려고 할 수 있습니다. 예를 들어 다음 매니페스트를 사용하여 파일 공유를 mountOptions 구성합니다.

fileModedirMode의 기본값은 Kubernetes 탑재 파일 공유의 경우 0777입니다. 스토리지 클래스 개체에 다른 탑재 옵션을 지정할 수 있습니다.

이름이 지정된 azure-file-sc.yaml파일을 만들고 다음 예제 매니페스트를 붙여넣습니다.

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: my-azurefile
provisioner: file.csi.azure.com
reclaimPolicy: Delete
volumeBindingMode: Immediate
allowVolumeExpansion: true
mountOptions:
  - dir_mode=0640
  - file_mode=0640
  - uid=0
  - gid=0
  - mfsymlinks
  - cache=strict # https://linux.die.net/man/8/mount.cifs
  - nosharesock
parameters:
  skuName: Standard_LRS

kubectl apply 명령을 실행하여 스토리지 클래스를 만듭니다.

kubectl apply -f azure-file-sc.yaml

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

storageclass.storage.k8s.io/my-azurefile created

Azure Files CSI 드라이버는 영구 볼륨 및 기본 파일 공유의 스냅샷 만들기를 지원합니다.

참고 항목

이 드라이버는 스냅샷 만들기만 지원하고, 스냅샷에서 복원은 지원하지 않습니다. 스냅샷은 Azure Portal 또는 CLI에서 복원할 수 있습니다. 스냅샷 만들기 및 복원에 대한 자세한 내용은 Azure Files의 공유 스냅샷 개요를 참조하세요.

kubectl apply 명령을 사용하여 볼륨 스냅샷 클래스 를 만듭니다.

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

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

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

이 자습서pvc-azurefile의 시작 부분에서 동적으로 만든 PVC에서 볼륨 스냅샷 만듭니다.

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

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

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

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

kubectl describe volumesnapshot azurefile-volume-snapshot

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

Name:         azurefile-volume-snapshot
Namespace:    default
Labels:       <none>
Annotations:  API Version:  snapshot.storage.k8s.io/v1beta1
Kind:         VolumeSnapshot
Metadata:
  Creation Timestamp:  2020-08-27T22:37:41Z
  Finalizers:
    snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection
    snapshot.storage.kubernetes.io/volumesnapshot-bound-protection
  Generation:        1
  Resource Version:  955091
  Self Link:         /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/azurefile-volume-snapshot
  UID:               c359a38f-35c1-4fb1-9da9-2c06d35ca0f4
Spec:
  Source:
    Persistent Volume Claim Name:  pvc-azurefile
  Volume Snapshot Class Name:      csi-azurefile-vsc
Status:
  Bound Volume Snapshot Content Name:  snapcontent-c359a38f-35c1-4fb1-9da9-2c06d35ca0f4
  Ready To Use:                        false
Events:                                <none>

영구 볼륨 크기 조정

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

참고 항목

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

영구 볼륨 축소는 현재 지원되지 않습니다.

AKS에서 기본 제공 azurefile-csi 스토리지 클래스는 이미 확장을 지원하므로 이 스토리지 클래스와 함께 이전에 만든 PVC를 사용합니다. PVC는 100GiB 파일 공유를 요청했습니다. 다음을 실행하여 확인할 수 있습니다.

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

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

Filesystem                                                                                Size  Used Avail Use% Mounted on
//f149b5a219bd34caeb07de9.file.core.windows.net/pvc-5e5d9980-da38-492b-8581-17e3cad01770  100G  128K  100G   1% /mnt/azurefile

spec.resources.requests.storage 필드를 늘려 PVC를 확장합니다.

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

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

persistentvolumeclaim/pvc-azurefile patched

PVC와 Pod 내의 파일 시스템이 모두 새 크기를 표시하는지 확인합니다.

kubectl get pvc pvc-azurefile
NAME            STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS    AGE
pvc-azurefile   Bound    pvc-5e5d9980-da38-492b-8581-17e3cad01770   200Gi      RWX            azurefile-csi   64m

kubectl exec -it nginx-azurefile -- df -h /mnt/azurefile
Filesystem                                                                                Size  Used Avail Use% Mounted on
//f149b5a219bd34caeb07de9.file.core.windows.net/pvc-5e5d9980-da38-492b-8581-17e3cad01770  200G  128K  200G   1% /mnt/azurefile

프라이빗 Azure Files 스토리지(프라이빗 엔드포인트)에서 영구 볼륨 사용

Azure Files 리소스가 프라이빗 엔드포인트로 보호되는 경우 사용자 고유의 스토리지 클래스를 만들어야 합니다. 프라이빗 엔드포인트 IP 주소를 연결 문자열 FQDN으로 확인하도록 DNS 설정을 구성했는지 확인합니다. 다음 매개 변수를 사용자 지정합니다.

  • resourceGroup: 스토리지 계정이 배포되는 리소스 그룹입니다.
  • storageAccount: 스토리지 계정 이름입니다.
  • server: 스토리지 계정의 프라이빗 엔드포인트의 FQDN입니다.

이름이 지정된 private-azure-file-sc.yaml파일을 만든 다음 다음 예제 매니페스트를 파일에 붙여넣습니다. <resourceGroup><storageAccountName>에 대한 값을 대체합니다.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: private-azurefile-csi
provisioner: file.csi.azure.com
allowVolumeExpansion: true
parameters:
  resourceGroup: <resourceGroup>
  storageAccount: <storageAccountName>
  server: <storageAccountName>.file.core.windows.net
reclaimPolicy: Delete
volumeBindingMode: Immediate
mountOptions:
  - dir_mode=0777
  - file_mode=0777
  - uid=0
  - gid=0
  - mfsymlinks
  - cache=strict  # https://linux.die.net/man/8/mount.cifs
  - nosharesock  # reduce probability of reconnect race
  - actimeo=30  # reduce latency for metadata-heavy workload

다음 명령을 사용하여 스토리지 클래스를 만듭니다.kubectl apply

kubectl apply -f private-azure-file-sc.yaml

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

storageclass.storage.k8s.io/private-azurefile-csi created

이름이 지정된 private-pvc.yaml파일을 만든 다음 파일에 다음 예제 매니페스트를 붙여넣습니다.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: private-azurefile-pvc
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: private-azurefile-csi
  resources:
    requests:
      storage: 100Gi

kubectl apply 명령을 사용하여 PVC를 만듭니다.

kubectl apply -f private-pvc.yaml

NFS 파일 공유

Azure Files는 NFS v4.1 프로토콜을 지원합니다. Azure Files에 대한 NFS 버전 4.1 지원은 가용성 및 내구성이 뛰어난 분산 복원력 있는 스토리지 플랫폼을 기반으로 구축된 완전 관리형 NFS 파일 시스템을 서비스로 제공합니다.

이 옵션은 현재 위치 데이터 업데이트를 사용하는 임의 액세스 워크로드에 최적화되어 있으며 전체 POSIX 파일 시스템 지원을 제공합니다. 이 섹션에서는 AKS 클러스터에서 Azure 파일 CSI 드라이버를 사용하여 NFS 공유를 사용하는 방법을 보여 줍니다.

필수 조건

  • AKS 클러스터 컨트롤 플레 인 ID(즉, AKS 클러스터 이름)가 VNet 및 NetworkSecurityGroup의 기여자 역할에 추가됩니다.
  • AKS 클러스터의 서비스 주체 또는 MSI(관리 서비스 ID)를 스토리지 계정에 기여자 역할에 추가해야 합니다.

참고 항목

선택한 VNet에 대한 액세스를 허용하는 대신 프라이빗 엔드포인트를 사용할 수 있습니다.

읽기 및 쓰기 크기 옵션 최적화

이 섹션에서는 rsizewsize 옵션을 사용하여 Azure Files CSI 드라이버로 NFS 성능 튜닝에 접근하는 방법에 대한 정보를 제공합니다. rsize 및 wsize 옵션은 NFS 작업의 최대 전송 크기를 설정합니다. 탑재 시 rsize 또는 wsize가 지정되지 않은 경우 클라이언트와 서버는 이 두 옵션이 지원하는 가장 큰 크기로 조정됩니다. 현재 Azure NetApp Files 및 최신 Linux 배포판은 모두 1,048,576바이트(1MiB)의 읽기 및 쓰기 크기를 지원합니다.

최적의 성능은 효율적인 클라이언트-서버 통신을 기반으로 합니다. mount 읽기 및 쓰기 옵션 크기 값을 늘리거나 줄이면 NFS 성능이 개선될 수 있습니다. 클라이언트와 서버 간에 전송되는 읽기/쓰기 패킷의 기본 크기는 NFS 버전 2의 경우 8KB이고 NFS 버전 3 및 4의 경우 32KB입니다. 이러한 기본값은 너무 크거나 너무 작을 수 있습니다. rsize 및 wsize를 줄이면 각 NFS 읽기 회신 및 쓰기 요청에 대해 더 작은 패킷을 전송하여 혼잡한 네트워크에서 NFS 성능을 개선시킬 수 있습니다. 그러나 이로 인해 네트워크를 통해 데이터를 전송하는 데 필요한 패킷 수가 증가하여 클라이언트와 서버의 총 네트워크 트래픽과 CPU 사용률이 증가할 수 있습니다.

처리량을 줄이지 않고 대기 시간을 늘리지 않으면서 효율적인 패킷 전송을 유지하는 rsize 및 wsize를 찾기 위해 테스트를 수행해야 합니다.

rsize 및 wsize 최적화에 대한 자세한 내용은 Azure NetApp Files에 대한 Linux NFS 탑재 옵션 모범 사례를 참조하세요.

예를 들어, 최대 rsizewsize를 256KiB로 구성하려면 스토리지 클래스에서 mountOptions를 다음과 같이 구성합니다.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: azurefile-csi-nfs
provisioner: file.csi.azure.com
allowVolumeExpansion: true
parameters:
  protocol: nfs
mountOptions:
  - nconnect=4
  - noresvport
  - actimeo=30
  - rsize=262144
  - wsize=262144

NFS 파일 공유 스토리지 클래스 만들기

nfs-sc.yaml이라는 파일을 만들고 아래 매니페스트를 복사합니다. 지원되는 mountOptions목록은 NFS 탑재 옵션을 참조 하세요.

참고 항목

vers, minorversionsec Azure File CSI 드라이버에 의해 구성됩니다. 이러한 속성에 대한 매니페스트의 값 지정은 지원되지 않습니다.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: azurefile-csi-nfs
provisioner: file.csi.azure.com
allowVolumeExpansion: true
parameters:
  protocol: nfs
mountOptions:
  - nconnect=4
  - noresvport
  - actimeo=30

파일을 편집하고 저장한 후 kubectl apply 명령을 사용하여 스토리지 클래스를 만듭니다.

kubectl apply -f nfs-sc.yaml

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

storageclass.storage.k8s.io/azurefile-csi-nfs created

NFS 기반 파일 공유를 사용하여 배포 만들기

kubectl apply 명령을 사용하여 타임스탬프를 파일 data.txt에 저장하는 상태 저장 세트 예를 배포할 수 있습니다.

kubectl apply -f

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: statefulset-azurefile
  labels:
    app: nginx
spec:
  podManagementPolicy: Parallel  # default is OrderedReady
  serviceName: statefulset-azurefile
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      nodeSelector:
        "kubernetes.io/os": linux
      containers:
        - name: statefulset-azurefile
          image: mcr.microsoft.com/oss/nginx/nginx:1.19.5
          command:
            - "/bin/bash"
            - "-c"
            - set -euo pipefail; while true; do echo $(date) >> /mnt/azurefile/outfile; sleep 1; done
          volumeMounts:
            - name: persistent-storage
              mountPath: /mnt/azurefile
  updateStrategy:
    type: RollingUpdate
  selector:
    matchLabels:
      app: nginx
  volumeClaimTemplates:
    - metadata:
        name: persistent-storage
      spec:
        storageClassName: azurefile-csi-nfs
        accessModes: ["ReadWriteMany"]
        resources:
          requests:
            storage: 100Gi

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

statefulset.apps/statefulset-azurefile created

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

kubectl exec -it statefulset-azurefile-0 -- df -h

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

Filesystem      Size  Used Avail Use% Mounted on
...
/dev/sda1                                                                                 29G   11G   19G  37% /etc/hosts
accountname.file.core.windows.net:/accountname/pvc-fa72ec43-ae64-42e4-a8a2-556606f5da38  100G     0  100G   0% /mnt/azurefile
...

참고 항목

NFS 파일 공유는 프리미엄 계정에 있으므로 최소 파일 공유 크기는 100GiB입니다. 스토리지 크기가 작은 PVC를 만들 경우 다음과 유사한 오류가 발생할 수 있습니다. 파일 공유를 만들지 못했습니다. ... size (5)...

Windows 컨테이너

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

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

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

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

statefulset.apps/busybox-azurefile created

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

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

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

2020-08-27 22:11:01Z
2020-08-27 22:11:02Z
2020-08-27 22:11:04Z
(...)

다음 단계