在高密度部署有狀態業務(例如資料庫)或大量短生命週期的容器(例如持續整合、批處理)等情境中,每個Pod都需要大量的雲端硬碟來儲存資料,Pod的數量非常多,如果這些Pod同時被調度到同一個節點上,預設使用的串列掛載會導致Pod啟動時間顯著增加,您可以開啟雲端硬碟並行掛載功能來解決此類問題。
前提條件
ACK託管叢集為1.26及以上版本,且csi-plugin和csi-provisioner組件版本為1.30.4及以上。
已安裝配置阿里雲CLI,請參見安裝阿里雲CLI。
注意事項
僅支援擁有磁碟序號的雲端硬碟開啟並行掛載功能。關於如何查看磁碟序號,請詳見查看Block Storage序號。
2020年06月10日之前建立的雲端硬碟沒有可識別的序號資訊,無法開啟,因為該類雲端硬碟會導致無法正常掛載。
多個雲端硬碟從同一個節點上卸載時仍然是串列的。
開啟並行掛載後,ECS DescribeDisks等OpenAPI返回的
Device欄位,以及控制台上顯示的掛載點可能會不可靠,請避免在業務中使用該掛載路徑,您可以通過雲端硬碟的序號確認實際路徑。
開啟步驟
您可以通過自動化指令碼或手工配置開啟雲端硬碟並行掛載功能。
自動化指令碼配置
將以下指令碼儲存為enable_parallel_attach.sh檔案。
執行指令碼並行掛載雲端硬碟。
bash enable_parallel_attach.sh <叢集ID>
手工配置
新增叢集節點池配置中的ECS 標籤,使其鍵為
supportConcurrencyAttach,值為true,確保新建立的ECS執行個體有該標籤。登入Container Service管理主控台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇。
在節點池列表頁面,單擊目標節點池所在行操作列的編輯。
在編輯節點池頁面最下方的進階選項地區,增加ECS 標籤,其鍵為
supportConcurrencyAttach,值為true。
為叢集中所有存量節點的ECS執行個體添加標籤,使其鍵為
supportConcurrencyAttach,值為true。具體操作,請參見建立並綁定自訂標籤。在左側導覽列選擇營運管理 > 組件管理,單擊儲存頁簽,定位csi-provisioner組件,單擊組件右下方的配置,將FeatureGate設定為
DiskADController=true,DiskParallelAttach=true。說明DiskADController=true設定後,雲端硬碟相關attach和detach的操作交由csi-provisioner;DiskParallelAttach=true設定後,將開啟雲端硬碟並行掛載功能。待csi-provisioner配置完成後,將csi-plugin組件的FeatureGate設定為
DiskADController=true。
驗證雲端硬碟並行掛載效能
本樣本將在同一節點上建立大量掛載雲端硬碟的Pod,以驗證開啟並行掛載對Pod啟動速度的提升。
本文中提供的測試資料僅為理論值(參考值),實際資料以您的作業環境為準。
在ACK叢集中,添加一個支援多個雲端硬碟掛載的節點。例如,ecs.g7se.16xlarge類型的執行個體最多可掛載56塊雲端硬碟。
使用以下內容,建立測試應用attach-stress.yaml檔案,並將
<YOUR-HOSTNAME>替換為實際的節點名稱。執行以下命令,確認應用正常啟動,然後將副本數量縮容到0,以準備後續的批量掛載測試。
kubectl apply -f attach-stress.yaml kubectl rollout status sts attach-stress kubectl scale sts attach-stress --replicas 0預期輸出:
storageclass.storage.k8s.io/alibabacloud-disk created statefulset.apps/attach-stress created partitioned roll out complete: 1 new pods have been updated... statefulset.apps/attach-stress scaled執行以下命令,開始批量掛載測試,並統計Pod啟動所需的時間。
說明此時該叢集尚未開啟並行掛載功能,請根據您的節點最大支援的雲端硬碟數量調整測試的副本數。
date && \ kubectl scale sts attach-stress --replicas 28 && \ kubectl rollout status sts attach-stress && \ date預期輸出:
2024年10月15日 星期二 19時21分36秒 CST statefulset.apps/attach-stress scaled Waiting for 28 pods to be ready... Waiting for 27 pods to be ready... <省略……> Waiting for 3 pods to be ready... Waiting for 2 pods to be ready... Waiting for 1 pods to be ready... partitioned roll out complete: 28 new pods have been updated... 2024年10月15日 星期二 19時24分55秒 CST輸出表明,在未開啟並行掛載時,28個Pod全部啟動耗時超過3分鐘。
參考上文開啟步驟開啟該叢集的並行掛載功能。
執行以下命令,清理之前建立的Pod,準備下一輪測試。
說明清理時,觀察叢集中相關的
volumeattachments資源,等待它們被刪除後即可完成雲端硬碟的卸載,過程大約需要幾分鐘。kubectl scale sts attach-stress --replicas 0再次執行以下測試命令,統計開啟並行掛載後Pod啟動所需的時間,預期僅需要約40秒,較未開啟時的3分鐘,有明顯提升。
date && \ kubectl scale sts attach-stress --replicas 28 && \ kubectl rollout status sts attach-stress && \ date預期輸出:
2024年10月15日 星期二 20時02分54秒 CST statefulset.apps/attach-stress scaled Waiting for 28 pods to be ready... Waiting for 27 pods to be ready... <省略……> Waiting for 3 pods to be ready... Waiting for 2 pods to be ready... Waiting for 1 pods to be ready... partitioned roll out complete: 28 new pods have been updated... 2024年10月15日 星期二 20時03分31秒 CST
執行以下命令,清理叢集中的測試應用。
kubectl delete -f attach-stress.yaml