Azure 容器儲存體是雲端式磁碟區管理、部署和協調流程服務,專為容器原生建置。 本文說明如何設定 Azure 容器儲存體,以使用本機 NVMe 磁碟作為 Kubernetes 工作負載的後端儲存體。 NVMe 專為儲存和 CPU 之間的高速資料傳輸而設計,提供高 IOPS 和吞吐量。
重要事項
本文適用於 Azure 容器儲存體 (2.x.x 版),目前僅支援本機 NVMe 磁碟作為備份儲存體。 如需舊版的詳細資訊,請參閱 Azure 容器儲存體 (1.x.x 版) 檔。
什麼是本地NVMe?
當你的應用程式需要亞毫秒的儲存延遲和高吞吐量時,你可以使用本地 NVMe 硬碟搭配 Azure 容器儲存來滿足效能需求。 暫時性表示磁碟部署在託管 AKS 叢集的本機虛擬機器 (VM) 上,而非儲存至 Azure 儲存體服務。 如果您停止/解除配置 VM,這些磁碟上的資料會遺失。 本機 NVMe 磁碟會在選取 Azure VM 系列時提供,例如儲存體最佳化的 VM。
根據預設,Azure 容器儲存體會在使用本機 NVMe 磁碟時建立 一般暫時磁碟區 。 對於需要 持續性磁碟區宣告的使用案例,您可以在持續性磁碟區宣告範本中新增註解 localdisk.csi.acstor.io/accept-ephemeral-storage: "true" 。
資料等量分割
為了最大化效能,Azure 容器儲存體會以每個 VM 為基礎,自動在所有可用的本機 NVMe 磁碟之間等量分配資料。 條帶化是一種將資料分割成小塊並同時均勻寫入多個磁碟的技術,可提高吞吐量並提高整體 I/O 效能。 此行為預設為啟用,無法停用。
由於這些等量分割裝置的效能集合,公開其他 NVMe 硬碟的較大 VM 大小,可以解鎖更高的 IOPS 和頻寬。 選取較大的 VM 系列可讓您的工作負載受益於額外的彙總輸送量,而無需額外的組態。
例如, Lsv3 系列 可從 Standard_L8s_v3 上的單一 1.92 TB NVMe 磁碟驅動器 (約 400,000 IOPS 和 2,000 MB/s) 調整至 Standard_L80s_v3 上的 10 個 NVMe 磁碟驅動器 (約 3,800,000 IOPS 和 20,000 MB/s)。
先決條件
如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶。
本文需要最新版本的 Azure CLI (2.77.0 或更新版本)。 請參閱如何安裝 Azure CLI。 請勿使用 Azure Cloud Shell,因為
az upgrade在 Cloud Shell 中不可用。 請務必以系統管理許可權執行本文中的命令。請閱讀安裝說明,並確保 Azure 容器儲存裝置安裝正確。
您需要 Kubernetes 命令列用戶端 。
kubectl您可以通過執行az aks install-cli命令來在本地安裝它。檢查您的目標區域是否受 Azure 容器儲存體區域支援。
選擇支援本機 NVMe 的 VM 類型
本地 NVMe 磁碟僅適用於特定類型的 VM,例如 存儲最佳化 VM 或 GPU 加速 VM。 如果您打算使用本機 NVMe 容量,請選擇其中一個 VM 大小。
執行下列命令,以取得與節點集區搭配使用的 VM 類型。 以您自己的值取代 <resource group> 和 <cluster name>。 您不需要提供 PoolName 或 VmSize 的值,因此請保留此處所示的查詢。
az aks nodepool list --resource-group <resource group> --cluster-name <cluster name> --query "[].{PoolName:name, VmSize:vmSize}" -o table
以下輸出是範例。
PoolName VmSize
---------- ---------------
nodepool1 standard_l8s_v3
附註
在 Azure 容器儲存體 (2.x.x 版) 中,您現在可以使用節點少於三個的叢集。
建立並連結一般暫時性磁碟區
如果你還沒安裝,請 安裝 Azure 容器儲存。
請遵循下列步驟,使用 Azure 容器儲存體建立和附加泛型暫時磁碟區。
1.建立儲存類別
不同於需要建立自訂儲存集區資源的舊版,Azure 容器儲存體 (2.x.x 版) 會使用標準 Kubernetes 儲存體類別。
請依照下列步驟,使用本機NVMe建立儲存類別。
使用您慣用的文字編輯器來建立 YAML 資訊清單檔,例如
code storageclass.yaml。貼上下列程式碼並儲存檔案。
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: local provisioner: localdisk.csi.acstor.io reclaimPolicy: Delete volumeBindingMode: WaitForFirstConsumer allowVolumeExpansion: true套用 YAML 資訊清單檔以建立存放集區。
kubectl apply -f storageclass.yaml
2. 驗證儲存類別
執行下列命令、確認已建立儲存類別:
kubectl get storageclass local
您應該會看到如下的輸出:
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
local localdisk.csi.acstor.io Delete WaitForFirstConsumer true 10s
3. 部署具有一般暫時磁碟區的 Pod
使用 Fio (英文) (彈性 I/O 測試器) 建立 Pod,以使用一般暫時性磁碟區進行基準測試和工作負載模擬。
使用您慣用的文字編輯器來建立 YAML 資訊清單檔,例如
code fiopod.yaml。貼上下列程式碼並儲存檔案。
kind: Pod apiVersion: v1 metadata: name: fiopod spec: nodeSelector: "kubernetes.io/os": linux containers: - name: fio image: mayadata/fio args: ["sleep", "1000000"] volumeMounts: - mountPath: "/volume" name: ephemeralvolume volumes: - name: ephemeralvolume ephemeral: volumeClaimTemplate: spec: volumeMode: Filesystem accessModes: ["ReadWriteOnce"] storageClassName: local resources: requests: storage: 10Gi套用 YAML 資訊清單檔以部署 Pod。
kubectl apply -f fiopod.yaml
4. 驗證部署並執行基準測試
檢查 Pod 是否正在運行:
kubectl get pod fiopod
您應該會看到 Pod 處於執行狀態。 運行後,您可以執行 Fio 基準測試:
kubectl exec -it fiopod -- fio --name=benchtest --size=800m --filename=/volume/test --direct=1 --rw=randrw --ioengine=libaio --bs=4k --iodepth=16 --numjobs=8 --time_based --runtime=60
建立並附加具有暫時儲存註釋的持續性磁碟區
雖然建議將一般暫時性磁碟區用於暫時性儲存體,但 Azure 容器儲存體也支援具有暫時性儲存體的持續性磁碟區,以與現有工作負載相容。
附註
Azure 容器儲存體 (2.x.x 版) 會使用新的註解 localdisk.csi.acstor.io/accept-ephemeral-storage: "true" ,而不是先前的 acstor.azure.com/accept-ephemeral-storage: "true"。
1. 建立儲存類別 (如果尚未建立)
如果你還沒安裝,請 安裝 Azure 容器儲存。
如果您未在上一節中建立使用本機NVMe的儲存類別、請立即建立一個:
使用您慣用的文字編輯器來建立 YAML 資訊清單檔,例如
code storageclass.yaml。貼上下列程式碼並儲存檔案。
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: local provisioner: localdisk.csi.acstor.io reclaimPolicy: Delete volumeBindingMode: WaitForFirstConsumer allowVolumeExpansion: true套用 YAML 資訊清單檔以建立存放集區。
kubectl apply -f storageclass.yaml
2. 部署具備持久性存儲的有狀態集
如果您需要使用未繫結至 Pod 生命週期的持續性磁碟區宣告,則必須新增 localdisk.csi.acstor.io/accept-ephemeral-storage: "true" 註釋。 磁碟區上的資料在節點本地端,如果刪除節點或將 Pod 移動到其他節點,則會遺失。
以下是使用具有暫存儲存體註釋的持續性磁碟區的 StatefulSet 範例:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: statefulset-lcd-lvm-annotation
labels:
app: busybox
spec:
podManagementPolicy: Parallel
serviceName: statefulset-lcd
replicas: 10
template:
metadata:
labels:
app: busybox
spec:
nodeSelector:
"kubernetes.io/os": linux
containers:
- name: statefulset-lcd
image: mcr.microsoft.com/azurelinux/busybox:1.36
command:
- "/bin/sh"
- "-c"
- set -euo pipefail; trap exit TERM; while true; do date -u +"%Y-%m-%dT%H:%M:%SZ" >> /mnt/lcd/outfile; sleep 1; done
volumeMounts:
- name: persistent-storage
mountPath: /mnt/lcd
updateStrategy:
type: RollingUpdate
selector:
matchLabels:
app: busybox
volumeClaimTemplates:
- metadata:
name: persistent-storage
annotations:
localdisk.csi.acstor.io/accept-ephemeral-storage: "true"
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: local
resources:
requests:
storage: 10Gi
儲存並套用此 YAML,以建立具有持續性磁碟區的 StatefulSet:
kubectl apply -f statefulset-pvc.yaml
管理儲存體
在本節中,您將瞭解如何檢查節點暫時磁碟容量、擴充儲存容量,以及刪除儲存資源。
檢查節點暫時磁碟容量
暫時性磁碟區會在單一節點上分配。 當您設定暫時性磁碟區大小時,大小應該小於單一節點暫時性磁碟的可用容量。
請確定 localdisk.csi.acstor.io 的 StorageClass 存在。 執行下列命令,以檢查每個節點暫時磁碟的可用容量。
kubectl get csistoragecapacities.storage.k8s.io -n kube-system -o custom-columns=NAME:.metadata.name,STORAGE_CLASS:.storageClassName,CAPACITY:.capacity,NODE:.nodeTopology.matchLabels."topology\.localdisk\.csi\.acstor\.io/node"
您應該會看到類似下列範例的結果:
NAME STORAGE_CLASS CAPACITY NODE
csisc-2pkx4 local 1373172Mi aks-storagepool-31410930-vmss000001
csisc-gnmm9 local 1373172Mi aks-storagepool-31410930-vmss000000
如果您遇到空容量輸出、請確認 localdisk.csi.acstor.io 的 StorageClass 存在。 只有在 localdisk.csi.acstor.io 的 StorageClass 存在之後,才會產生 csistoragecapacities.storage.k8s.io 資源。
擴充儲存容量
由於暫時磁碟儲存體會使用 AKS 叢集節點上的本機資源,因此擴充儲存體容量需要將節點新增至叢集。
若要將節點新增至叢集,請執行下列命令。 以您自己的值取代 <cluster-name>、<nodepool-name>、<resource-group> 和 <new-count>。
az aks nodepool scale --cluster-name <cluster-name> --name <nodepool-name> --resource-group <resource-group> --node-count <new-count>
刪除儲存資源
若要清除儲存體資源,您必須先刪除所有 PersistentVolumeClaims 和/或 PersistentVolume。 刪除 Azure 容器儲存體 StorageClass 不會自動移除現有的 PersistentVolumes/PersistentVolumeClaims。
若要刪除名為 local 的儲存類別、請執行下列命令:
kubectl delete storageclass local