支援NVMe(Non-Volatile Memory Express)協議的ESSD雲端硬碟稱為NVMe雲端硬碟。NVMe雲端硬碟支援多重掛載能力,最多可以同時掛載到16個ECS執行個體上;同時也基於多重掛載實現了符合NVMe協議規範的Reservation功能。這些特性可以協助您實現應用的多個副本間的資料共用以提升資料讀寫效能。本文通過簡單的樣本介紹如何在ACK叢集中使用NVMe雲端硬碟多重掛載及Reservation功能。
閱讀前提示
為了讓您更好地使用NVMe雲端硬碟多重掛載及Reservation功能,建議您在閱讀本文檔之前,瞭解以下內容:
NVMe協議介紹,請參見NVMe協議概述。
NVMe雲端硬碟介紹,請參見NVMe雲端硬碟概述。
應用情境
雲端硬碟多重掛載主要有以下應用情境:
使用限制
單個NVMe雲端硬碟支援同時掛載到同一可用性區域內的最多16個ECS執行個體。
ACK僅支援通過volumeDevices的方式掛載可從多個節點讀寫的雲端硬碟,即不能通過檔案系統訪問。
更多使用限制,請參見多重掛載使用限制。
前提條件
已建立ACK託管叢集,且叢集為1.20及以上版本。具體操作,請參見建立ACK託管叢集。
已安裝csi-plugin和csi-provisioner組件,且組件為v1.24.10-7ae4421-aliyun及以上版本。關於csi-plugin和csi-provisioner組件的升級操作,請參見管理CSI組件。
叢集至少包含2個在同一可用性區域的且支援使用多重掛載功能的節點,支援的執行個體規格類型系列詳見多重掛載使用限制。
已準備好業務應用且符合以下要求,然後將應用打包至容器鏡像中用於在ACK叢集中部署。
應用支援同時從多個副本中訪問同一雲端硬碟中的資料。
應用能自行通過標準的NVMe Reservation等功能確保資料的一致性。
計費說明
雲端硬碟多重掛載功能不會產生額外費用,支援NVMe協議的相關資源仍保持各資源原有的計費方式。關於雲端硬碟相關計費的更多資訊,請參見計費說明。
應用樣本
本文使用下方應用樣本的原始碼和Dockerfile,將其構建後上傳至鏡像倉庫以便後續在叢集中部署。該樣本應用中的多個副本共同管理一個租約,但僅有一個副本持有該租約。若該副本無法正常工作,其他副本將自動搶佔該租約。編寫應用注意事項如下:
樣本中使用
O_DIRECT
開啟塊裝置進行讀寫,避免任何緩衝對測試的影響。樣本中使用Linux核心提供的Reservation簡化介面,應用也可使用以下兩種方法執行與Reservation相關的命令,以下方法需要特權。
C代碼:
ioctl(fd, NVME_IOCTL_IO_CMD, &cmd);
命令列工具:
nvme-cli
關於NVMe Reservation功能的詳細資料,請參見NVMe Specification。
步驟一:部署應用並配置多重掛載
建立名為alicloud-disk-shared的StorageClass,並開啟雲端硬碟的多重掛載功能。
建立名為data-disk的PVC,並設定accessModes
為ReadWriteMany
;volumeMode
為Block
。
建立名為lease-test的StatefulSet應用,使用本文應用樣本的鏡像。
使用以下內容,建立lease.yaml檔案。
請將以下YAML中容器鏡像地址替換為您實際應用的鏡像地址。
重要由於NVMe Reservation在節點維度生效,同一節點上的多個Pod可能會互相干擾,所以本樣本中通過
podAntiAffinity
以避免多個Pod調度到同一個節點上。如果您的叢集中包括其他不使用NVMe協議的節點,您需要自行設定親和性,以確保將Pod調度到使用NVMe協議的節點上。
參數
使用多重掛載功能配置說明
普通掛載配置說明
StorageClass
parameters.multiAttach
設定為true,以開啟雲端硬碟的多重掛載功能。
無需配置
PVC
accessModes
ReadWriteMany
ReadWriteOnce
volumeMode
Block
Filesystem
儲存卷掛載方式
volumeDevices:直接通過塊裝置訪問雲端硬碟中的資料。
volumeMounts:主要用於掛載檔案系統類型的Volume。
執行以下命令,部署應用。
kubectl apply -f lease.yaml
步驟二:驗證多重掛載及Reservation效果
為了確保NVMe雲端硬碟的資料一致性,您可以在應用中通過Reservation控制讀寫權限,如果一個Pod進行寫操作,其他Pod就只能進行讀操作。
多個節點可讀寫同一個雲端硬碟
執行以下命令,查看Pod日誌。
kubectl logs -l app=lease-test --prefix -f
預期輸出:
[pod/lease-test-0/lease] Register as key 4745d0c5cd9a2fa4
[pod/lease-test-0/lease] Refreshed lease
[pod/lease-test-0/lease] Refreshed lease
[pod/lease-test-1/lease] Remote lease-test-0 refreshed lease
[pod/lease-test-0/lease] Refreshed lease
[pod/lease-test-1/lease] Remote lease-test-0 refreshed lease
[pod/lease-test-0/lease] Refreshed lease
[pod/lease-test-1/lease] Remote lease-test-0 refreshed lease
[pod/lease-test-0/lease] Refreshed lease
[pod/lease-test-1/lease] Remote lease-test-0 refreshed lease
預期輸出表明,Pod lease-test-1可以即時讀取到Pod lease-test-0的寫入的內容。
NVMe Reservation建立成功
執行以下命令,擷取雲端硬碟ID。
kubectl get pvc data-disk -ojsonpath='{.spec.volumeName}'
登入兩個節點中的任意一個節點,執行以下命令確認NVMe Reservation是否建立成功。
請替換以下代碼中
2zxxxxxxxxxxx
為您上一步擷取到的雲端硬碟ID中d-
之後的內容。nvme resv-report -c 1 /dev/disk/by-id/nvme-Alibaba_Cloud_Elastic_Block_Storage_2zxxxxxxxxxxx
預期輸出:
NVME Reservation status: gen : 3 rtype : 1 regctl : 1 ptpls : 1 regctlext[0] : cntlid : ffff rcsts : 1 rkey : 4745d0c5cd9a2fa4 hostid : 4297c540000daf4a4*****
預期輸出表明,NVMe Reservation已建立成功。
通過Reservation可阻斷異常節點的寫入IO
登入Pod lease-test-0所在的節點上執行以下命令,暫停該進程用於類比故障情境。
pkill -STOP -f /usr/local/bin/lease
等待30秒後,執行以下命令,再次查看日誌。
kubectl logs -l app=lease-test --prefix -f
預期輸出:
[pod/lease-test-1/lease] Remote lease-test-0 refreshed lease [pod/lease-test-1/lease] Remote is dead, preempting [pod/lease-test-1/lease] Register as key 4745d0c5cd9a2fa4 [pod/lease-test-1/lease] Refreshed lease [pod/lease-test-1/lease] Refreshed lease [pod/lease-test-1/lease] Refreshed lease
預期輸出表明,此時Pod lease-test-1已接管,持有租約成為服務的主節點。
再次登入Pod lease-test-0所在的節點上執行以下命令,恢複之前暫停進程。
pkill -CONT -f /usr/local/bin/lease
執行以下命令,再次查看日誌。
kubectl logs -l app=lease-test --prefix -f
預期輸出:
[pod/lease-test-0/lease] failed to write lease: Invalid exchange
預期輸出表明,Pod lease-test-0將無法再寫入該雲端硬碟,容器lease自動重啟。說明其寫入IO的操作已成功被Reservation阻斷。
相關文檔
如果您的NVMe雲端硬碟空間不滿足要求或磁碟已滿,請參見擴容雲端硬碟儲存卷。