當需要多個節點並發讀寫訪問同一塊雲端硬碟,實現高效資料共用、快速容錯移轉時,您可以通過多重掛載功能將單個ESSD、ESSD AutoPL等類型雲端硬碟掛載至同一可用性區域內支援NVMe協議的多個節點,或將單個ESSD同城冗餘等類型雲端硬碟掛載至同一地區內的多個節點。本文通過簡單的樣本介紹如何在ACK叢集中使用NVMe雲端硬碟多重掛載及Reservation功能。
閱讀前提示
為了讓您更好地使用NVMe雲端硬碟多重掛載及Reservation功能,建議您在閱讀本文檔之前,瞭解以下內容:
NVMe協議介紹,請參見NVMe協議概述。
雲端硬碟多重掛載功能的介紹及使用限制,請參見雲端硬碟多重掛載功能。
應用情境
雲端硬碟多重掛載主要有以下應用情境:
使用限制
單個NVMe雲端硬碟支援同時掛載到同一可用性區域內的最多16個ECS執行個體。
如需從多節點同時讀寫的雲端硬碟,需通過volumeDevices方式掛載。這種方式將雲端硬碟作為塊裝置掛載,不支援常用的通過檔案系統訪問的方式。
更多使用限制,請參見多重掛載使用限制。
前提條件
已建立ACK託管叢集,且叢集為1.20及以上版本。具體操作,請參見建立ACK託管叢集。
已安裝csi-plugin和csi-provisioner組件,且組件為v1.24.10-7ae4421-aliyun及以上版本。關於csi-plugin和csi-provisioner組件的升級操作,請參見管理csi-plugin和csi-provisioner組件。
叢集至少包含2個在同一可用性區域的且支援使用多重掛載功能的節點,支援的執行個體規格類型系列詳見多重掛載使用限制。
已準備好業務應用且符合以下要求,然後將應用打包至容器鏡像中用於在ACK叢集中部署。
應用支援同時從多個副本中訪問同一雲端硬碟中的資料。
應用能自行通過標準的NVMe Reservation等功能確保資料的一致性。
計費說明
雲端硬碟多重掛載功能不會產生額外費用,支援NVMe協議的相關資源仍保持各資源原有的計費方式。關於雲端硬碟相關計費的更多資訊,請參見Block Storage卷。
應用樣本
本文使用下方應用樣本的原始碼和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雲端硬碟空間不滿足要求或磁碟已滿,請參見擴容雲端硬碟儲存卷。