在 Azure Kubernetes Service (AKS) 中使用 Azure 資料箱磁碟的容器儲存體介面 (CSI) 驅動程式

Azure 資料箱磁碟容器儲存體介面 (CSI) 驅動程式是 Azure Kubernetes Service (AKS) 用來管理 Azure 資料箱磁碟生命週期的 CSI 規格相容驅動程式。

CSI 是將任意區塊和檔案儲存系統公開給 Kubernetes 上容器化工作負載的標準。 藉由採用和使用 CSI,AKS 現在可以撰寫、部署及反覆運算外掛程式以在 Kubernetes 中公開新的或改善現有的儲存系統。 使用 AKS 中的 CSI 驅動程式可以避免觸及 Kubernetes 的核心程式碼並等候其發行版本週期。

若要透過 CSI 驅動程式的支援建立 AKS 叢集,請參閱在 AKS 上啟用 CSI 驅動程式。 本文說明如何使用 Azure 資料箱磁碟的 CSI 驅動程式版本 1。

注意

Azure 資料箱磁碟的 CSI 驅動程式 v2 (預覽版) 改善可擴縮性並減少 Pod 容錯移轉延遲。 此驅動程式使用共用磁碟在多個叢集節點上佈建附件複本,並與 Pod 排程器整合以確保在 Pod 容錯移轉時選擇具有附件複本的節點。 Azure 資料箱磁碟的 CSI 驅動程式 v2 (預覽版) 也提供微調效能的功能。 如果您有興趣參與預覽版,請提交要求:https://aka.ms/DiskCSIv2Preview。 此預覽版是在沒有服務等級協定的情況下提供,且在預覽期間,您可以預期偶爾會有重大的變更。 不建議針對生產工作負載使用預覽版。 如需詳細資訊,請參閱 Microsoft Azure 預覽版增補使用條款

注意

「樹狀結構驅動程式」 為屬於核心 Kube 程式碼一部分的現有儲存體驅動程式,以及屬於外掛程式的新 CSI 驅動程式。

Azure 資料箱磁碟的 CSI 驅動程式功能

除了樹狀結構驅動程式的功能之外,Azure 資料箱磁碟的 CSI 驅動程式也支援下列功能:

  • 改善連結和中斷連結磁碟並行期間的效能
    • 樹狀結構驅動程式依序連結或中斷連結磁碟,而 CSI 驅動程式則是批次連結或中斷連結磁碟。 當有多個磁碟要連結至一個節點時,效能會有明顯的改善。
  • 支援進階 SSD v1 和 v2。
    • PremiumV2_LRS 僅支援 None 快取模式
  • 支援區域備援儲存體 (ZRS) 磁碟
    • 支援 Premium_ZRSStandardSSD_ZRS 磁碟類型。 ZRS 磁碟可以在區域或非區域節點上排程,而不受限於磁碟區應該共置於與指定節點相同的區域中。 如需詳細資訊 (包括支援哪些區域),請參閱受控磁碟的區域備援儲存體
  • 快照式
  • 磁碟區複製
  • 不停機調整磁碟 PV 大小

注意

根據所使用的 VM SKU,Azure 資料箱磁碟 CSI 驅動程式可能具有每個節點的磁碟區限制。 針對某些功能強大的 VM (例如 16 個核心),每個節點的限制為 64 個磁碟區。 若要識別每個 VM SKU 的限制,請檢閱所提供之每個 VM SKU 的最大資料磁碟資料行。 如需所提供之 VM SKU 清單與其對應的詳細容量限制,請參閱一般用途虛擬機器大小

使用包含 Azure 磁碟的 CSI 永續性磁碟區

永續性磁碟區 (PV)代表一個已佈建來與 Kubernetes Pod 搭配使用的儲存體。 PV 可供一個或多個 Pod 使用,且可以動態或靜態方式佈建。 本文示範如何在 AKS 叢集中以動態方式建立 Azure 磁碟的 PV,以供單一 Pod 使用。 如需靜態佈建的資訊,請參閱使用 Azure 磁碟建立靜態磁碟區

如需 Kubernetes 磁碟區的詳細資訊,請參閱 AKS 中的應用程式適用的儲存體選項

使用內建的儲存類別,動態建立 Azure 磁碟 PV

儲存體類別可用來定義如何搭配永續性磁碟區動態建立儲存體單位。 如需 Kubernetes 儲存類別的詳細資訊,請參閱 Kubernetes 儲存類別

您在 AKS 上使用 Azure 資料箱磁碟的 CSI 驅動程式時,有額外兩個內建 StorageClasses 使用 Azure 資料箱磁碟的 CSI 儲存體驅動程式。 其他的 CSI 儲存類別會與叢集一同建立,與樹狀內預設儲存類別一起。

  • managed-csi:使用 Azure 標準 SSD 本機備援儲存體 (LRS) 來建立受控磁碟。
  • managed-csi-premium:使用 Azure Premium LRS 來建立受控磁碟。

這兩個儲存類別中的回收原則可確保刪除個別 PV 時,會刪除基礎 Azure 磁碟。 儲存類別也會將 PV 設定為可擴充。 您只需要以新的大小編輯永續性磁碟區宣告 (PV)。

如要使用這些儲存類別,請建立一個 PVC 與個別的 Pod 來參考使用這些類別。 PVC 可用來根據儲存體類別,動態佈建儲存體。 PVC 可以使用任一個預先建立的儲存類別,或使用者定義的儲存類別來建立所需 SKU 和大小的 Azure 受控磁碟。 當您建立 Pod 定義時,您會指定 PVC 應要求所需的儲存體。

透過執行 kubectl apply 命令,建立範例 Pod 和對應的 PVC:

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

此命令的輸出與下列範例類似:

persistentvolumeclaim/pvc-azuredisk created
pod/nginx-azuredisk created

Pod 處於執行中狀態之後,請執行下列命令建立名為 test.txt 的新檔案。

kubectl exec nginx-azuredisk -- touch /mnt/azuredisk/test.txt

為驗證磁碟已正確掛接,請執行下列命令,然後確認在輸出中看見 test.txt 檔案:

kubectl exec nginx-azuredisk -- ls /mnt/azuredisk

lost+found
outfile
test.txt

建立自訂儲存類別

預設的儲存類別適用於大部分的常見案例。 在某些情況下,您可能想要使用自有參數來自訂自己的儲存類別。 例如,您可能想要變更 volumeBindingMode 類別。

您可以使用 volumeBindingMode: Immediate 類別,保證在建立 PVC 之後立即發生。 當您的節點集區受到拓撲限制,例如,當使用可用性區域時,會繫結或佈建 PV,而不需要知道 Pod 的排程需求。

若要解決此案例,您可以使用 volumeBindingMode: WaitForFirstConsumer,這會延遲 PV 的繫結和佈建,直到建立使用 PVC 的 Pod 為止。 如此一來,PV 就會符合並在 Pod 的排程條件約束所指定的可用性區域 (或其他拓撲) 中佈建。 預設儲存類別會使用 volumeBindingMode: WaitForFirstConsumer 類別。

建立名為 sc-azuredisk-csi-waitforfirstconsumer.yaml 的檔案,然後貼上下列資訊清單。 儲存類別與 managed-csi 儲存類別相同,但具有不同的 volumeBindingMode 類別。

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: azuredisk-csi-waitforfirstconsumer
provisioner: disk.csi.azure.com
parameters:
  skuname: StandardSSD_LRS
allowVolumeExpansion: true
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer

透過執行 kubectl apply 命令,建立儲存類別,並指定您的 sc-azuredisk-csi-waitforfirstconsumer.yaml 檔案:

kubectl apply -f sc-azuredisk-csi-waitforfirstconsumer.yaml

此命令的輸出與下列範例類似:

storageclass.storage.k8s.io/azuredisk-csi-waitforfirstconsumer created

磁碟區快照

Azure 資料箱磁碟 CSI 驅動程式支援建立永續性磁碟區的快照集。 在這項功能中,驅動程式可以根據 incremental 參數中設定的值 (預設為 true),執行「完整」「累加」快照集

下表提供所有參數的詳細資訊。

名稱 意義 可用的值 必要 預設值
resourceGroup 用來儲存快照集快照的資源群組 EXISTING RESOURCE GROUP No 若未指定,快照集會儲存在與來源 Azure 磁碟相同的資源群組中
累加 擷取完整或累加式快照集 true, false No true
標記 Azure 磁碟標籤 標籤格式:'key1=val1,key2=val2' No ""
userAgent 用於客戶使用狀況屬性的使用者代理程式 No 產生的使用者代理程式格式為 driverName/driverVersion compiler/version (OS-ARCH)
subscriptionID 指定將於其中建立 Azure 磁碟的 Azure 訂用帳戶識別碼 Azure 訂用帳戶識別碼 No 若非空白,必須提供 resourceGroupincremental 必須設定為 false

建立磁碟區快照集

注意

繼續之前,請確定應用程式不會將資料寫入來源磁碟。

如需這項功能的範例,請使用 kubectl apply 命令建立磁碟區快照集類別

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

此命令的輸出與下列範例類似:

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

現在,讓我們從在本教學課程pvc-azuredisk開頭動態建立的 PV 中建立磁碟區快照集

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

此命令的輸出與下列範例類似:

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

若要確認已正確建立快照集,請執行下列命令:

kubectl describe volumesnapshot azuredisk-volume-snapshot

此命令的輸出與下列範例類似:

Name:         azuredisk-volume-snapshot
Namespace:    default
Labels:       <none>
Annotations:  API Version:  snapshot.storage.k8s.io/v1
Kind:         VolumeSnapshot
Metadata:
  Creation Timestamp:  2020-08-27T05:27:58Z
  Finalizers:
    snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection
    snapshot.storage.kubernetes.io/volumesnapshot-bound-protection
  Generation:        1
  Resource Version:  714582
  Self Link:         /apis/snapshot.storage.k8s.io/v1/namespaces/default/volumesnapshots/azuredisk-volume-snapshot
  UID:               dd953ab5-6c24-42d4-ad4a-f33180e0ef87
Spec:
  Source:
    Persistent Volume Claim Name:  pvc-azuredisk
  Volume Snapshot Class Name:      csi-azuredisk-vsc
Status:
  Bound Volume Snapshot Content Name:  snapcontent-dd953ab5-6c24-42d4-ad4a-f33180e0ef87
  Creation Time:                       2020-08-31T05:27:59Z
  Ready To Use:                        true
  Restore Size:                        10Gi
Events:                                <none>

根據磁碟區快照集建立新的 PV

您可以根據磁碟區快照集建立新的 PV。 使用在上一個步驟中建立的快照集,並建立新的 PV新的 Pod 來取用它。

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

此命令的輸出與下列範例類似:

persistentvolumeclaim/pvc-azuredisk-snapshot-restored created
pod/nginx-restored created

最後,讓我們執行下列命令,藉由檢查內容,確定這與之前建立的 PVC 相同:

kubectl exec nginx-restored -- ls /mnt/azuredisk

此命令的輸出與下列範例類似:

lost+found
outfile
test.txt

如同預期,我們仍然可以看到先前建立的 test.txt 檔案。

複製磁碟區

複製的磁碟區定義為現有 Kubernetes 磁碟區的複本。 如需在 Kubernetes 中複製磁碟區的詳細資訊,請參閱磁碟區複製的概念文件。

適用於 Azure 磁碟的 CSI 驅動程式支援磁碟區複製。 為了示範,請建立先前建立azuredisk-pvc複製磁碟區新的 Pod 來取用它

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

此命令的輸出與下列範例類似:

persistentvolumeclaim/pvc-azuredisk-cloning created
pod/nginx-restored-cloning created

您可以檢查複製磁碟區的內容,方法是執行下列命令並確認已建立 test.txt 檔案:

kubectl exec nginx-restored-cloning -- ls /mnt/azuredisk

此命令的輸出與下列範例類似:

lost+found
outfile
test.txt

不停機調整永久性磁碟區大小

您可以要求較大的 PVC 磁碟區。 編輯 PVC 物件,並指定較大的大小。 這項變更會觸發基礎磁碟區的擴充,該磁碟區會支援 PV。

注意

永遠不會建立新的 PV 來滿足宣告。 而會改為調整現有磁碟區的大小。

在 AKS 中,內建 managed-csi 儲存類別已支援擴充,因此請使用先前與此儲存類別一起建立的 PVC。 PVC 已要求 10 Gi 永續性磁碟區。 您可以透過執行下列命令進行確認:

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

此命令的輸出與下列範例類似:

Filesystem      Size  Used Avail Use% Mounted on
/dev/sdc        9.8G   42M  9.8G   1% /mnt/azuredisk

執行下列命令可透過增加 spec.resources.requests.storage 欄位的方式擴充 PVC:

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

注意

目前不支援壓縮持續性磁碟區。 嘗試修補比現有 PVC 大小更小的 PVC 會導致下列錯誤訊息:The persistentVolumeClaim "pvc-azuredisk" is invalid: spec.resources.requests.storage: Forbidden: field can not be less than previous value.

此命令的輸出與下列範例類似:

persistentvolumeclaim/pvc-azuredisk patched

執行下列命令以確認磁碟區大小已增加:

kubectl get pv

此命令的輸出與下列範例類似:

NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                                     STORAGECLASS   REASON   AGE
pvc-391ea1a6-0191-4022-b915-c8dc4216174a   15Gi       RWO            Delete           Bound    default/pvc-azuredisk                     managed-csi             2d2h
(...)

數分鐘後,請執行下列命令,確認 PVC 的大小:

kubectl get pvc pvc-azuredisk

此命令的輸出與下列範例類似:

NAME            STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc-azuredisk   Bound    pvc-391ea1a6-0191-4022-b915-c8dc4216174a   15Gi       RWO            managed-csi    2d2h

執行下列命令以確認 Pod 內的磁碟大小:

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

此命令的輸出與下列範例類似:

Filesystem      Size  Used Avail Use% Mounted on
/dev/sdc         15G   46M   15G   1% /mnt/azuredisk

隨選高載

隨需磁碟高載模型允許每當其需求超過目前的容量時,磁碟就會開始高載。 此模型會在磁碟高載時產生額外費用。 隨選高載僅適用於大於 512 GiB 的進階 SSD。 如需進階 SSD 佈建的 IOPS 和每個磁碟的輸送量詳細資訊,請參閱進階 SSD 大小。 另外,點數型高載是只有在磁碟在其點數貯體中累積高載點數時,磁碟才會高載。 當磁碟高載時,點數型高載不會產生額外的費用。 點數型高載僅適用於容量小於 512 GiB 的進階 SSD,以及容量小於 1024 GiB 的標準 SSD。 如需隨需高載的詳細資訊,請參閱隨需高載

重要

預設 managed-csi-premium 儲存類別的隨需高載為停用狀態,且使用點數型高載。 以預設 managed-csi-premium 儲存類別為基礎、透過永久性磁碟區宣告動態建立的任何進階 SSD,其隨需高載亦為停用狀態。

若要建立進階 SSD 永久性磁碟區搭配啟用的隨需高載,您可以建立新的儲存類別,搭配設定為 trueenableBursting 參數,如下列 YAML 範本所示。 如需隨需啟用高載的詳細資訊,請參閱隨需高載。 如需建立自有儲存類別搭配已啟用隨需高載的詳細資訊,請參閱建立可高載的受控 CSI 進階儲存類別

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: burstable-managed-csi-premium
provisioner: disk.csi.azure.com
parameters:
  skuname: Premium_LRS
  enableBursting: "true"
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true

Windows 容器

Azure 資料箱磁碟 CSI 驅動程式支援 Windows 節點和容器。 如果您想要使用 Windows 容器,請遵循 Windows 容器快速入門,新增 Windows 節點集區。

擁有 Windows 節點集區之後,您現在可以使用內建的儲存類別,例如 managed-csi。 您可以透過執行下列 kubectl apply 命令,部署範例 Windows 架構 StatefulSet,將時間戳記儲存至檔案 data.txt

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

此命令的輸出與下列範例類似:

statefulset.apps/busybox-azuredisk created

若要驗證磁碟區的內容,請執行下列命令:

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

此命令的輸出與下列範例類似:

2020-08-27 08:13:41Z
2020-08-27 08:13:42Z
2020-08-27 08:13:44Z
(...)

下一步