在AI、巨量資料等需要頻繁擴容的業務情境中,新節點加入叢集時,拉取組件和業務鏡像會消耗大量時間。為提升節點就緒速度,可將組件、鏡像等預先緩衝至資料盤快照,使新節點可以從本地磁碟直接載入資料,從而提升擴容效率。
工作原理
預設擴容流程中,從建立節點到業務應用在其上成功運行,其耗時主要集中在以下受網路影響的階段:
系統鏡像拉取:容器運行時(containerd)需要拉取系統Pod所需的鏡像,如Terway、kube-proxy等。
業務鏡像拉取:節點就緒後,業務Pod被調度到該節點,容器運行時需要拉取業務應用的容器鏡像。
當節點池使用資料盤快照擴容時,上述“網路拉取”過程會轉為“本地載入”:
加速節點就緒:初始化指令碼會優先檢查本地路徑。由於快照預置了系統鏡像,節點可跳過下載和拉取過程,儘快進入就緒狀態。
加速業務啟動:由於快照中已預先緩衝業務鏡像,當Pod被調度到新節點時,容器運行時可在本地找到所需鏡像,實現業務的快速啟動。
步驟一:準備用於建立快照的節點
建立一個包含ACK核心組件與業務鏡像的ECS執行個體,並為其資料盤建立快照。
準備用於製作快照的ECS執行個體。
在叢集中建立一個節點池,其核心配置如下。在此過程中,ACK會自動將Terway、kube-proxy等系統組件鏡像儲存至資料盤。
登入方式:配置金鑰組或密碼,以便後續登入執行個體。
期望節點數:設定為1。
資料盤:至少添加一塊資料盤。
如已通過白名單申請初始化設定功能,需選擇格式化,且作為容器運行時佔用目錄,以便將容器運行時環境預置到資料盤中。
等待節點就緒後,將建立的節點從叢集中移除。移除時,ECS執行個體仍需保留,請勿勾選同時釋放 ECS。
登入保留的ECS執行個體,將所需的組件和鏡像檔案手動添加到資料盤中。
登入ECS執行個體,執行
lsblk -f命令,查看資料盤掛載路徑,如/var/lib/container。緩衝kubelet組件。
進入資料盤掛載目錄,建立用於存放ACK組件的緩衝目錄。
cd /var/lib/container mkdir -p ack設定地區和叢集版本環境變數。
# 樣本以 cn-shanghai 地區和 1.34.1-aliyun.1 版本為例,請按實際情況替換 export REGION="cn-shanghai" export KUBE_VERSION="1.34.1-aliyun.1"下載、解壓並移動kubelet二進位檔案至緩衝目錄。
wget http://aliacs-k8s-$REGION.oss-$REGION-internal.aliyuncs.com/public/pkg/kubernetes/kubernetes-$KUBE_VERSION-linux-amd64.tar.gz tar -xvf kubernetes-$KUBE_VERSION-linux-amd64.tar.gz mv pkg/kubernetes /var/lib/container/ack/清理下載的臨時檔案,保持快照精簡。
rm kubernetes-$KUBE_VERSION-linux-amd64.tar.gz rm -rf pkg
(可選) 緩衝業務鏡像。
將業務中頻繁使用的鏡像拉取到本地。這些鏡像也將被包含在快照中,從而加速業務Pod的啟動。
# 如果環境中有 Docker,也可使用 docker pull # 樣本以 Nginx 鏡像為例 crictl pull anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
步驟二:建立資料盤快照
將已完成組件和鏡像緩衝的資料盤建立為快照,供後續節點池擴容時複用。
訪問ECS控制台-執行個體,將目標執行個體設定為停止狀態。
關於停止執行個體的配置說明,請參見停止執行個體(普通停機)。
執行個體已停止後,進入執行個體詳情頁,單擊Block Storage頁簽。
找到作為容器運行時目錄的資料盤,在其操作列,單擊建立快照,按照頁面提示完成快照的配置。
關於快照的配置說明,請參見建立快照。
步驟三:使用快照擴容節點並驗證結果
建立一個節點池,應用此前建立的快照。核心配置如下:
作業系統:按需選擇作業系統。
暫不支援ContainerOS3.5及以上版本。
期望節點數:設定為1及以上。
資料盤:
選擇用資料盤快照,按照頁面提示選擇此前建立的快照。
如已通過白名單申請初始化設定功能,需選擇格式化,且作為容器運行時佔用目錄(此格式化流程會保留快照中的資料)。
執行個體自訂資料:對於非ContainerOS作業系統,添加以下指令碼以跳過
yum更新,加快節點初始化速度。touch /var/.skip-yum
等待新節點就緒後,登入節點,檢查緩衝是否已成功生效。
檢查鏡像緩衝是否生效。
查看kubelet日誌,若已緩衝的鏡像未出現拉取記錄,則表明緩衝生效。
# 若該命令無輸出,或輸出中不包含預置鏡像(如 Terway、kube-proxy)的拉取記錄,則證明緩衝生效。 journalctl -u kubelet | grep "pulled image"檢查kubelet緩衝是否生效。
查看
ack-deploy日誌,未出現check cached kubernetes failed即表示成功。# 如果該命令無輸出,表明緩衝的 kubelet 被成功使用 cat /var/log/ack-deploy.log |grep "check cached kubernetes failed"
計費說明
製作快照的臨時ECS執行個體、其掛載的雲端硬碟以及最終產生的快照,均會產生對應計費。
常見問題
如果叢集升級了版本,原來的快照還能用嗎?
不推薦繼續使用。快照中緩衝的kubelet版本可能與新叢集版本不相容,會導致節點無法正常註冊。叢集升級後,建議重新製作資料盤快照。
除了kubelet和容器鏡像,還能緩衝其他檔案嗎?
可以。任何存放在該資料盤路徑下的檔案都會被包含在快照中。請根據業務需求緩衝其他依賴檔案(如設定檔、資料模型等),但需注意管理快照的大小和內容的合規性。