Azure 容器儲存體是針對容器原生建置的雲端式磁碟區管理、部署和協調流程服務。 本文說明如何設定 Azure 容器儲存體 (1.x.x 版) 以使用暫時性磁碟搭配本機 NVMe,做為 Kubernetes 工作負載的後端儲存體。 最後,您將擁有一個使用本地 NVMe 作為存儲的 Pod。
這很重要
本文涵蓋 Azure 容器儲存體 (1.x.x 版) 中可用的特性和功能。 Azure 容器儲存體 (2.x.x 版) 現已推出。 如果您已經使用 Azure 容器儲存體 (2.x.x 版),請參閱 本文 以設定本機 NVMe。
什麼是臨時磁碟?
當您的應用程式需要亞毫秒儲存體延遲,且不需要資料持久性時,您可以使用暫時性磁碟搭配 Azure 容器儲存體來符合效能需求。 暫時性表示磁碟會部署在裝載 AKS 叢集的本機虛擬機器 (VM) 上,而不是儲存至 Azure 儲存體服務。 如果您停止/解除配置 VM,這些磁碟上的資料將會遺失。
有兩種類型的臨時磁盤可用:本地 NVMe 和 臨時 SSD。 NVMe 專為儲存和 CPU 之間的高速資料傳輸而設計。 當您的應用程式需要比臨時 SSD 更高的 IOPS 或輸送量,或需要更多儲存空間時,請選擇 NVMe。 請注意,Azure 容器儲存體僅支援本機 NVMe 的同步資料複寫。
由於這些磁碟的暫時性本質,Azure 容器儲存體在使用暫時性磁碟時,預設支援使用 一般暫時性磁碟區 。 不過,某些使用案例可能需要 持續性磁碟區 ,即使資料不持久;例如,如果您想要使用硬式編碼以使用持續性磁碟區的現有 YAML 檔案或部署範本,且您的工作負載支援應用程式層級複寫以實現持久性。 在這種情況下,您可以 更新 Azure 容器儲存體安裝 ,並在持續性磁碟區宣告定義中新增註解 acstor.azure.com/accept-ephemeral-storage=true ,以支援從暫時性磁碟儲存集區建立持續性磁碟區。
先決條件
如尚未擁有 Azure 訂用帳戶,請在開始之前先建立免費帳戶。
本文需要最新版本的 Azure CLI。 請參閱 如何安裝 Azure CLI。 如果您在 Azure Cloud Shell 中使用 Bash 環境,則可能已安裝最新版本。 如果您打算在本機執行命令,而不是在 Azure Cloud Shell 中執行命令,請務必使用系統管理許可權執行命令。 如需詳細資訊,請參閱開始使用 Azure Cloud Shell。
您將需要 Kubernetes 命令列用戶端 。
kubectl如果您使用 Azure Cloud Shell,則已安裝,或者您可以執行az aks install-cli命令在本機安裝它。檢查 Azure 容器儲存體區域是否支援您的目標區域。
選擇支援本機NVMe的VM類型
本機 NVMe 磁碟僅適用於特定類型的 VM,例如 儲存體最佳化型 VM SKU 或 GPU 加速型 VM SKU。 如果您打算使用本機 NVMe 容量,請選擇其中一個 VM SKU。
執行下列命令,以取得與節點集區搭配使用的 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
我們建議每個 VM 至少有四個虛擬 CPU (vCPU),而且每個節點集區至少有三個節點。
建立並附加一般暫時磁碟區
請遵循下列步驟來建立並附加一般暫時磁碟區。
1. 建立儲存池
首先,建立儲存集區,這是 Kubernetes 叢集的邏輯儲存分組,方法是在 YAML 資訊清單檔案中定義它。
如果您使用 az aks create 或 az aks update 命令啟用 Azure 容器儲存體,您可能已經有一個儲存體集區。 用 kubectl get sp -n acstor 來取得儲存區清單。 如果您已經有想要使用的儲存池,您可以略過本節,並繼續顯示 可用的儲存類別。
請依照下列步驟,使用本機NVMe建立儲存集區。
使用您最愛的文字編輯器來建立 YAML 資訊清單檔案,例如
code acstor-storagepool.yaml。貼上以下程式碼並儲存檔案。 儲存區 名稱 值可以是您想要的任何值。
apiVersion: containerstorage.azure.com/v1 kind: StoragePool metadata: name: ephemeraldisk-nvme namespace: acstor spec: poolType: ephemeralDisk: diskType: nvme套用 YAML 資訊清單檔案來建立儲存集區。
kubectl apply -f acstor-storagepool.yaml儲存集區建立完成後,您會看到如下訊息:
storagepool.containerstorage.azure.com/ephemeraldisk-nvme created您也可以執行此指令來檢查儲存區的狀態。 取代
<storage-pool-name>成您的儲存區 名稱 值。 在此範例中,值會是 ephemeraldisk-nvme。kubectl describe sp <storage-pool-name> -n acstor
建立儲存體集區時,Azure 容器儲存體會使用命名慣例 acstor-<storage-pool-name>,代表您建立儲存體類別。
2. 顯示可用的儲存類別
當儲存資源池可供使用時、您必須選取儲存體類別、以定義在建立及部署磁碟區時動態建立儲存體的方式。
執行 kubectl get sc 來顯示可用的儲存類別。 您應該會看到名為 的儲存類別 acstor-<storage-pool-name>。
$ kubectl get sc | grep "^acstor-"
acstor-azuredisk-internal disk.csi.azure.com Retain WaitForFirstConsumer true 65m
acstor-ephemeraldisk-nvme containerstorage.csi.azure.com Delete WaitForFirstConsumer true 2m27s
這很重要
請勿使用標示為 內部的儲存體類別。 這是 Azure 容器儲存體運作所需的內部儲存體類別。
3. 使用一般暫時性磁碟區部署 Pod
使用 Fio (彈性 I/O 測試器) 建立 Pod 以進行基準測試和工作負載模擬,該 Pod 使用一般暫時磁碟區。
使用您最愛的文字編輯器來建立 YAML 資訊清單檔案,例如
code acstor-pod.yaml。貼上以下程式碼並儲存檔案。
kind: Pod apiVersion: v1 metadata: name: fiopod spec: nodeSelector: acstor.azure.com/io-engine: acstor containers: - name: fio image: nixery.dev/shell/fio args: - sleep - "1000000" volumeMounts: - mountPath: "/volume" name: ephemeralvolume volumes: - name: ephemeralvolume ephemeral: volumeClaimTemplate: metadata: labels: type: my-ephemeral-volume spec: accessModes: [ "ReadWriteOnce" ] storageClassName: acstor-ephemeraldisk-nvme # replace with the name of your storage class if different resources: requests: storage: 1Gi當您變更磁碟區的儲存大小時,請確定大小小於單一節點暫時性磁碟的可用容量。 請參閱 檢查節點暫時磁碟容量。
套用 YAML 清單檔案以部署 Pod。
kubectl apply -f acstor-pod.yaml您應該會看到類似下列的輸出:
pod/fiopod created檢查 Pod 是否正在執行,且暫時性磁碟區宣告已成功繫結至 Pod:
kubectl describe pod fiopod kubectl describe pvc fiopod-ephemeralvolume檢查 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
您現在已部署使用本機 NVMe 做為儲存體的 Pod,並可用於 Kubernetes 工作負載。
建立和附加持久化磁碟區
若要從暫時性磁碟儲存區建立持續性磁區,您必須在持續性磁區宣告 (PVC) 中包含註釋作為保護措施,以確保即使資料是暫時性,您也打算使用持續性磁區。 此外,在建立永續性磁碟區宣告之前,您需要在叢集上啟用具有 --ephemeral-disk-volume-type 值的 PersistentVolumeWithAnnotation 旗標。
請遵循下列步驟來建立並附加持續磁碟區。
1. 更新您的 Azure 容器儲存體安裝
執行下列命令來更新您的 Azure 容器儲存體安裝,以允許從暫時性磁碟儲存集區建立持續性磁碟區。
az aks update -n <cluster-name> -g <resource-group> --enable-azure-container-storage ephemeralDisk --storage-pool-option NVMe --ephemeral-disk-volume-type PersistentVolumeWithAnnotation
2. 建立儲存池
建立儲存集區,這是 Kubernetes 叢集的邏輯儲存分組,方法是在 YAML 資訊清單檔案中定義它。
如果您使用 az aks create 或 az aks update 命令啟用 Azure 容器儲存體,您可能已經有一個儲存體集區。 用 kubectl get sp -n acstor 來取得儲存區清單。 如果您已經有想要使用的儲存池,您可以略過本節,並繼續顯示 可用的儲存類別。
請依照下列步驟,使用本機NVMe建立儲存集區。
使用您最愛的文字編輯器來建立 YAML 資訊清單檔案,例如
code acstor-storagepool.yaml。貼上以下程式碼並儲存檔案。 儲存區 名稱 值可以是您想要的任何值。
apiVersion: containerstorage.azure.com/v1 kind: StoragePool metadata: name: ephemeraldisk-nvme namespace: acstor spec: poolType: ephemeralDisk: diskType: nvme套用 YAML 資訊清單檔案來建立儲存集區。
kubectl apply -f acstor-storagepool.yaml儲存集區建立完成後,您會看到如下訊息:
storagepool.containerstorage.azure.com/ephemeraldisk-nvme created您也可以執行此指令來檢查儲存區的狀態。 取代
<storage-pool-name>成您的儲存區 名稱 值。 在此範例中,值會是 ephemeraldisk-nvme。kubectl describe sp <storage-pool-name> -n acstor
建立儲存體集區時,Azure 容器儲存體會使用命名慣例 acstor-<storage-pool-name>,代表您建立儲存體類別。
3. 顯示可用的儲存類別
當儲存資源池可供使用時、您必須選取儲存體類別、以定義在建立及部署磁碟區時動態建立儲存體的方式。
執行 kubectl get sc 來顯示可用的儲存類別。 您應該會看到名為 的儲存類別 acstor-<storage-pool-name>。
$ kubectl get sc | grep "^acstor-"
acstor-azuredisk-internal disk.csi.azure.com Retain WaitForFirstConsumer true 65m
acstor-ephemeraldisk-nvme containerstorage.csi.azure.com Delete WaitForFirstConsumer true 2m27s
這很重要
請勿使用標示為 內部的儲存體類別。 這是 Azure 容器儲存體運作所需的內部儲存體類別。
4. 建立永續性磁碟區宣告
持續性磁碟區宣告可用來根據儲存類別自動佈建儲存體。 請遵循下列步驟,使用新的儲存類別建立 PVC。
使用您最愛的文字編輯器來建立 YAML 資訊清單檔案,例如
code acstor-pvc.yaml。貼上以下程式碼並儲存檔案。 PVC
name值可以是您想要的任何值。apiVersion: v1 kind: PersistentVolumeClaim metadata: name: ephemeralpvc annotations: acstor.azure.com/accept-ephemeral-storage: "true" spec: accessModes: - ReadWriteOnce storageClassName: acstor-ephemeraldisk-nvme # replace with the name of your storage class if different resources: requests: storage: 100Gi當您變更磁碟區的儲存大小時,請確定大小小於單一節點暫時性磁碟的可用容量。 請參閱 檢查節點暫時磁碟容量。
使用 YAML 清單檔來建立 PVC。
kubectl apply -f acstor-pvc.yaml您應該會看到類似下列的輸出:
persistentvolumeclaim/ephemeralpvc created您可以執行下列命令來驗證PVC的狀態:
kubectl describe pvc ephemeralpvc
建立 PVC 後,就可以由 Pod 使用。
5. 部署 Pod 並連結永續性磁碟區
使用 Fio(彈性 I/O 測試器)建立 Pod 進行效能測試和工作負載模擬,並指定持久性磁碟區的掛載路徑。 對於 claimName,請使用您在建立持續性磁碟區宣告時使用的 名稱 值。
使用您最愛的文字編輯器來建立 YAML 資訊清單檔案,例如
code acstor-pod.yaml。貼上以下程式碼並儲存檔案。
kind: Pod apiVersion: v1 metadata: name: fiopod spec: nodeSelector: acstor.azure.com/io-engine: acstor volumes: - name: ephemeralpv persistentVolumeClaim: claimName: ephemeralpvc containers: - name: fio image: nixery.dev/shell/fio args: - sleep - "1000000" volumeMounts: - mountPath: "/volume" name: ephemeralpv套用 YAML 清單檔案以部署 Pod。
kubectl apply -f acstor-pod.yaml您應該會看到類似下列的輸出:
pod/fiopod created檢查 Pod 是否正在執行,且永續性磁碟區宣告已成功繫結至 Pod:
kubectl describe pod fiopod kubectl describe pvc ephemeralpvc檢查 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
您現在已部署使用本機 NVMe 的 Pod,並可將其用於 Kubernetes 工作負載。
管理磁碟卷與存放池
在本節中,您將瞭解如何檢查單一節點暫時磁碟的可用容量、如何擴充或刪除儲存集區,以及如何最佳化效能。
檢查節點暫時磁碟容量
暫時性磁碟區會在單一節點上分配。 當您設定暫時性磁碟區大小時,大小應該小於單一節點暫時性磁碟的可用容量。
執行下列命令,以檢查單一節點暫時磁碟的可用容量。
kubectl get diskpool -n acstor
您應該會看到類似以下的輸出:
NAME CAPACITY AVAILABLE USED RESERVED READY AGE
ephemeraldisk-nvme-diskpool-jaxwb 75660001280 75031990272 628011008 560902144 True 21h
ephemeraldisk-nvme-diskpool-wzixx 75660001280 75031990272 628011008 560902144 True 21h
ephemeraldisk-nvme-diskpool-xbtlj 75660001280 75031990272 628011008 560902144 True 21h
在此範例中,單一節點的暫時磁碟可用容量為 75031990272 位元組或 69 GiB。
擴充儲存區
您可以擴充由本機NVMe支援的儲存池、以快速擴展、無需停機。 目前不支援壓縮存放集區。
由於暫時磁碟所支援的儲存體集區會使用 AKS 叢集節點 (VM) 上的本機儲存體資源,因此擴充儲存體集區需要將另一個節點新增至叢集。 請遵循下列指示來擴充儲存區。
執行下列命令,將節點新增至 AKS 叢集。 將
<cluster-name>、<nodepool name>和<resource-group-name>取代為您自己的值。 若要取得節點集區的名稱,請執行kubectl get nodes。az aks nodepool add --cluster-name <cluster name> --name <nodepool name> --resource-group <resource group> --node-vm-size Standard_L8s_v3 --node-count 1 --labels acstor.azure.com/io-engine=acstor執行
kubectl get nodes,您會看到節點已新增至叢集。執行,
kubectl get sp -A您應該會看到儲存池的容量有所增加。
刪除儲存區
如果您想要刪除儲存集區,請執行下列命令。 取代 <storage-pool-name> 為儲存區名稱。
kubectl delete sp -n acstor <storage-pool-name>
使用本機NVMe時最佳化效能
根據工作負載的效能需求,您可以從三個不同的效能層中進行選擇: 基本、 標準和 進階。 您的選取會影響 Azure 容器儲存體元件在安裝節點中取用的 vCPU 數目。 標準 是預設設定,如果您未更新效能層。
這三個層提供不同範圍的 IOPS。 下表包含您預期每一層的指導方針。 我們使用流行的基準測試工具 FIO 通過以下配置來實現這些數字:
- AKS:節點 SKU - Standard_L16s_v3
- FIO:區塊大小 - 4 KiB;隊列深度 - 32;Numjobs - 分配給容器存儲組件的核心數;訪問模式 - 隨機;工作集大小 - 32 GiB
| 梯級 | vCPU 數目 | 100% 讀取 IOPS | 100 % 寫入 IOPS |
|---|---|---|---|
Basic |
VM 核心總數的 12.5% | 高達 120,000 | 高達 90,000 |
Standard (預設值) |
VM 核心總數的 25% | 高達 220,000 | 高達 180,000 |
Premium |
VM 核心總數的 50% | 高達 550,000 | 高達 360,000 |
備註
RAM 和 Hugepage 使用量會在所有層級保持一致:1 GiB 的 RAM 和 2 GiB 的 Hugepage。
識別最符合您需求的效能層之後,您可以執行下列命令來更新 Azure 容器儲存體安裝的效能層。 替換 <performance tier> 為基本、標準或進階。
az aks update -n <cluster-name> -g <resource-group> --enable-azure-container-storage <storage-pool-type> --ephemeral-disk-nvme-perf-tier <performance-tier>