在 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 檔案儲存體共用時,節點上可以掛接的數量沒有任何限制。

如需 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 驅動程式支援建立永續性磁片區和基礎檔案共用的快照集。

注意

此驅動程式僅支援建立快照集,不支援從快照集執行還原。 快照集可以從 Azure 入口網站 或 CLI 還原。 如需建立和還原快照集的詳細資訊,請參閱 Azure 檔案的共用快照集概觀

使用 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 驅動程式搭配 rsizewsize 選項,以接近效能微調 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 掛接選項最佳做法

例如,若要設定最大 rsizewsize 為 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 掛接選項

注意

versminorversionsec 是由 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
(...)

下一步