AKS(Azure Kubernetes Service)에서 Azure Files CSI(Container Storage Interface) 드라이버 사용
Azure Files CSI(Container Storage Interface) 드라이버는 Azure Files 공유의 수명 주기를 관리하기 위해 AKS(Azure Kubernetes Service)에서 사용하는 CSI 사양 호환 드라이버입니다. CSI는 임의 블록과 파일 스토리지 시스템을 Kubernetes의 컨테이너화된 워크로드에 공개하는 표준입니다.
CSI를 채택하고 사용하면 이제 AKS는 플러그 인을 작성, 배포 및 반복하여 Kubernetes에서 새로운 스토리지 시스템을 공개하거나 기존 스토리지 시스템을 개선할 수 있습니다. AKS에서 CSI 드라이버를 사용하면 핵심 Kubernetes 코드를 조정하고 릴리스 주기를 기다릴 필요가 없습니다.
CSI 드라이버를 지원하는 AKS 클러스터를 만들려면 AKS에서 CSI 드라이버 사용을 참조하세요.
참고 항목
인트리 드라이버는 플러그 인인 새로운 CSI 드라이버와 비교하여 핵심 Kubernetes 코드의 일부인 현재 스토리지 드라이버를 나타냅니다.
Azure Files CSI 드라이버의 새로운 기능
원래의 인트리 드라이버 기능 외에도 Azure Files CSI 드라이버에서 지원하는 새로운 기능은 다음과 같습니다.
- NFS(네트워크 파일 시스템) 버전 4.1
- 프라이빗 엔드포인트
- 병렬로 대용량 파일 공유 생성.
Azure Files에서 영구적 볼륨 사용
PV(영구 볼륨)는 Kubernetes Pod와 함께 사용하기 위해 프로비저닝된 스토리지 부분을 나타냅니다. PV는 하나 이상의 Pod에서 사용할 수 있으며 동적 또는 정적으로 프로비저닝할 수 있습니다. 여러 Pod에서 동일한 스토리지 볼륨에 동시에 액세스해야 하는 경우 Azure Files에서 SMB(서버 메시지 블록) 또는 NFS 프로토콜을 사용하여 연결할 수 있습니다. 이 문서에서는 AKS 클러스터에서 여러 Pod에 사용할 Azure Files공유를 동적으로 만드는 방법을 설명합니다. 고정 프로비저닝의 경우 Azure Files 공유를 사용하여 수동으로 볼륨 만들기 및 사용을 참조하세요.
참고 항목
Azure File CSI 드라이버는 키 기반(NTLM v2) 인증을 사용하여 SMB 파일 공유의 탑재만 허용하므로 Azure 파일 공유 설정의 최대 보안 프로필을 지원하지 않습니다. 반면, NFS 파일 공유를 탑재하는 데는 키 기반 인증이 필요하지 않습니다.
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 프리미엄 파일 공유를 사용하는 것이 좋습니다.
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
을 구성합니다.
fileMode 및 dirMode의 기본값은 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 드라이버는 영구적 볼륨의 스냅샷 및 기본 파일 공유 의 스냅샷 생성을 지원합니다.
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의 볼륨 스냅샷 pvc-azurefile
을 만듭니다.
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
Pod 내의 PVC와 파일 시스템이 모두 새 크기를 나타내는지 확인합니다.
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에 대한 액세스를 허용하는 대신 프라이빗 엔드포인트를 사용할 수 있습니다.
읽기 및 쓰기 크기 옵션 최적화
이 섹션에서는 rsize 및 wsize 옵션을 사용하여 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 탑재 옵션 모범 사례를 참조하세요.
예를 들어, 최대 rsize 및 wsize를 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
, minorversion
, sec
는 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 파일 공유는 Premium 계정에 있으므로 최소 파일 공유 크기는 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
(...)
다음 단계
- Azure Disks용 CSI 드라이버를 사용하는 방법을 알아보려면 CSI 드라이버와 함께 Azure Disks 사용을 참조하세요.
- Azure Blob Storage용 CSI 드라이버를 사용하는 방법을 알아보려면 CSI 드라이버에서 Azure Blob Storage 사용을 참조하세요.
- 스토리지 모범 사례에 대한 자세한 내용은 Azure Kubernetes Service의 스토리지 및 백업 모범 사례를 참조하세요.
Azure Kubernetes Service