在 Azure Kubernetes Service (AKS) 中,使用 Azure 檔案容器儲存體介面 (CSI) 驅動程式
Azure 檔案儲存體容器儲存體介面 (CSI) 驅動程式為相容於 CSI 規格的驅動程式,Azure Kubernetes Service (AKS) 用其來管理檔案儲存體共用的生命週期。 CSI 是將任意區塊和檔案儲存系統公開給 Kubernetes 上容器化工作負載的標準。
藉由採用和使用 CSI,AKS 現在可以撰寫、部署及反覆運算外掛程式以在 Kubernetes 中公開新的或改善現有的儲存系統。 使用 AKS 中的 CSI 驅動程式可以避免觸及 Kubernetes 的核心程式碼並等候其發行版本週期。
若要建立 CSI 驅動程式支援的 AKS 叢集,請參閱在 AKS 上啟用 CSI 驅動程式。
注意
「樹狀結構驅動程式」 為屬於核心 Kube 程式碼一部分的現有儲存體驅動程式,以及屬於外掛程式的新 CSI 驅動程式。
Azure 檔案儲存體 CSI 驅動程式新功能
除了原有的樹狀內驅動程式功能之外,Azure 檔案儲存體的 CSI 驅動程式也支援下列新功能:
- 網路檔案系統 (NFS) 版本 4.1
- 私人端點
- 平行建立大型檔案共用掛接。
搭配 Azure 檔案儲存體使用永續性磁片區
永續性磁碟區 (PV) 代表的是佈建來與 Kubernetes Pod 搭配使用的儲存體。 PV 可供一個或多個 Pod 使用,且可以動態或靜態方式佈建。 如果多個 Pod 需要同時存取相同的儲存體磁碟區,您可以使用 Azure 檔案儲存體來透過伺服器訊息區 (SMB) 或 NFS 通訊協定來進行連線。 本文會示範如何在 Azure Kubernetes Service (AKS) 叢集中以動態方式建立 Azure 檔案儲存體共用,以供多個 Pod 使用。 如需靜態佈建,請參閱手動建立和使用 Azure 檔案儲存體共用的磁碟區。
注意
請注意,Azure 檔案 CSI 驅動程式只允許使用金鑰型 (NTLM v2) 驗證掛接 SMB 檔案共用,因此不支援 Azure 檔案共用設定的最大安全性設定檔。 另一方面,掛接 NFS 檔案共用不需要金鑰型驗證。
使用 Azure 檔案儲存體共用時,節點上可以掛接的數量沒有任何限制。
如需 Kubernetes 磁碟區的詳細資訊,請參閱 AKS 中的應用程式適用的儲存體選項。
使用內建的儲存類別,以動態方式建立 Azure 檔案儲存體 PV
儲存體類別可用來定義 Azure 檔案共用的建立方式。 節點資源群組中會自動建立儲存體帳戶,以供儲存類別用來保存 Azure 檔案儲存體共用。 針對 skuName,請選擇下列 Azure 儲存體備援:
- Standard_LRS:標準本地備援儲存體
- Standard_GRS:標準異地備援儲存體
- Standard_ZRS:標準區域備援儲存體
- Standard_RAGRS:標準讀取權限異地備援儲存體
- Standard_RAGZRS:標準讀取權限異地區域備援儲存體
- Premium_LRS:進階本地備援儲存體
- Premium_ZRS:進階區域備援儲存體
注意
Azure 檔案儲存體支援 Azure 進階檔案共用。 檔案共用容量下限為 100 GiB。 我們建議使用 Azure 進階檔案共用,而不是標準檔案共用,因為進階檔案共用可對 I/O 密集工作負載提供高效能、低延遲磁碟支援。
當您在 AKS 上使用儲存體 CSI 驅動程式時,有兩個額外的內建 StorageClasses
使用 Azure 檔案儲存體 CSI 儲存體驅動程式。 其他的 CSI 儲存類別會與叢集一同建立,與樹狀內預設儲存類別一起。
azurefile-csi
:使用 Azure 標準儲存體來建立 Azure 檔案共用。azurefile-csi-premium
:使用 Azure 進階儲存體來建立 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
。
Kubernetes 掛接檔案共用的 fileMode 和 dirMode 預設值為 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 檔案儲存體 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
驗證 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 檔案儲存體儲存體 (私人端點) 使用永續性磁片區
如果您的 Azure 檔案儲存體資源受到私人端點的保護,則必須建立自己的儲存體類別。 請務必設定您的 DNS 設定,以將私人端點 IP 位址解析為連接字串的 FQDN。 自訂下列參數:
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 檔案儲存體支援 NFS v4.1 通訊協定。 Azure 檔案儲存體的 NFS 版本 4.1 支援提供完全受控的 NFS 檔案系統即服務,其組建於高可用性且高持久性的分散式復原儲存體平台上。
此選項已針對具有就地資料更新的隨機存取工作負載進行最佳化,並提供完整的 POSIX 檔案系統支援。 本節說明如何在 AKS 叢集上使用 NFS 共用與 Azure 檔案 CSI 驅動程式。
必要條件
- 您的 AKS 叢集控制平面身分識別 (即您的 AKS 叢集名稱) 已新增至虛擬網路和 NetworkSecurityGroup 中的參與者角色。
- 您的 AKS 叢集服務主體或受控服務識別 (MSI) 必須加入儲存體帳戶的參與者角色。
注意
您可以使用私人端點,而不是允許存取選取的虛擬網路。
最佳化讀取和寫入大小選項
本節提供如何使用 Azure 檔案儲存體 CSI 驅動程式搭配 rsize 和 wsize 選項,以接近效能微調 NFS 的相關資訊。 rsize 和 wsize 選項設定 NFS 作業的傳輸大小上限。 如果掛接上未指定 rsize 或 wsize,用戶端和伺服器會議定兩者都支援的大小上限。 目前,Azure NetApp Files 和新式 Linux 發行版本支援的讀取和寫入大小高達 1,048,576 位元組 (1 MiB)。
最佳效能是以高效率的用戶端-伺服器通訊為基礎。 增加或減少 掛接 讀取和寫入選項大小值可以改善 NFS 效能。 NFS 第 2 版用戶端和伺服器之間傳輸之讀取/寫入封包的預設大小為 8 KB,NFS 第 3 版和 4 版為 32 KB。 這些預設值可能太大或太小。 減少 rsize 和 wsize 可能會藉由針對每個 NFS 讀取回復和寫入要求傳送較小的封包,來改善擁擠網路中 NFS 效能。 不過,這可能會增加在網路上傳送資料所需的封包數目,增加客戶端和伺服器上的網路流量和 CPU 使用率總計。
請務必執行測試,以尋找可在不會降低輸送量及增加延遲的情況下,又能維持高效率封包傳輸的 rsize 和 wsize。
如需最佳化 rsize 和 wsize 的詳細資訊,請參閱 Azure NetApp 檔案儲存體的 Linux NFS 掛接選項最佳做法。
例如,若要設定最大 rsize 和 wsize 為 256-KiB,請在儲存體類別中設定 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 檔案儲存體 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 命令部署 Stateful Set 範例,將時間戳記儲存至檔案 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,可能會遇到與下列類似的錯誤:無法建立檔案共用...大小 (5)...。
Windows 容器
Azure 檔案儲存體 CSI 驅動程式也支援 Windows 節點和容器。 若要使用 Windows 容器,請遵循 Windows 容器快速入門,新增 Windows 節點集區。
有了 Windows 節點集區之後,便可以使用內建的儲存類別,例如 azurefile-csi
,或建立自訂的儲存類別。 您可以透過執行 kubectl apply 命令,部署 Windows 架構 StatefulSet 範例,將時間戳記儲存至檔案 data.txt
:
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 檔案儲存體的 CSI 驅動程式,請參閱使用 Azure 磁碟搭配 CSI 驅動程式。
- 若要了解如何針對 Azure Blob 儲存體使用 CSI 驅動程式,請參閱使用 Azure Blob 儲存體搭配 CSI 驅動程式。
- 如需儲存體最佳做法的詳細資訊,請參閱 Azure Kubernetes Service 中的儲存體和備份的最佳做法。