在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
步骤二:创建数据盘快照
将已完成组件和镜像缓存的数据盘创建为快照,供后续节点池扩容时复用。
步骤三:使用快照扩容节点并验证结果
创建一个节点池,应用此前创建的快照。核心配置如下:
操作系统:按需选择操作系统。
暂不支持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和容器镜像,还能缓存其他文件吗?
可以。任何存放在该数据盘路径下的文件都会被包含在快照中。请根据业务需求缓存其他依赖文件(如配置文件、数据模型等),但需注意管理快照的大小和内容的合规性。