通过数据盘快照加速ACK节点扩容

AI、大数据等需要频繁扩容的业务场景中,新节点加入集群时,拉取组件和业务镜像会消耗大量时间。为提升节点就绪速度,可将组件、镜像等预先缓存至数据盘快照,使新节点可以从本地磁盘直接加载数据,从而提升扩容效率。

工作原理

默认扩容流程中,从创建节点到业务应用在其上成功运行,其耗时主要集中在以下受网络影响的阶段:

  • 系统镜像拉取:容器运行时(containerd)需要拉取系统Pod所需的镜像,如Terway、kube-proxy等。

  • 业务镜像拉取:节点就绪后,业务Pod被调度到该节点,容器运行时需要拉取业务应用的容器镜像。

当节点池使用数据盘快照扩容时,上述“网络拉取”过程会转为“本地加载”:

  • 加速节点就绪:初始化脚本会优先检查本地路径。由于快照预置了系统镜像,节点可跳过下载和拉取过程,尽快进入就绪状态。

  • 加速业务启动:由于快照中已预先缓存业务镜像,当Pod被调度到新节点时,容器运行时可在本地找到所需镜像,实现业务的快速启动。

步骤一:准备用于创建快照的节点

创建一个包含ACK核心组件与业务镜像的ECS实例,并为其数据盘创建快照。

  1. 准备用于制作快照的ECS实例。

    1. 在集群中创建一个节点池,其核心配置如下。在此过程中,ACK会自动将Terway、kube-proxy等系统组件镜像保存至数据盘。

      • 登录方式:配置密钥对或密码,以便后续登录实例。

      • 期望节点数:设置为1。

      • 数据盘:至少添加一块数据盘。

        如已通过白名单申请初始化设置功能,需选择格式化,且作为容器运行时占用目录,以便将容器运行时环境预置到数据盘中。

    2. 等待节点就绪后,将创建的节点从集群中移除。移除时,ECS实例仍需保留,请勿勾选同时释放 ECS

  2. 登录保留的ECS实例,将所需的组件和镜像文件手动添加到数据盘中。

    1. 登录ECS实例,执行lsblk -f命令,查看数据盘挂载路径,如/var/lib/container

    2. 缓存kubelet组件。

      1. 进入数据盘挂载目录,创建用于存放ACK组件的缓存目录。

        cd /var/lib/container
        mkdir -p ack
      2. 设置地域和集群版本环境变量。

        # 示例以 cn-shanghai 地域和 1.34.1-aliyun.1 版本为例,请按实际情况替换
        export REGION="cn-shanghai"
        export KUBE_VERSION="1.34.1-aliyun.1"
      3. 下载、解压并移动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/
      4. 清理下载的临时文件,保持快照精简。

        rm kubernetes-$KUBE_VERSION-linux-amd64.tar.gz
        rm -rf pkg
  3. (可选) 缓存业务镜像。

    将业务中频繁使用的镜像拉取到本地。这些镜像也将被包含在快照中,从而加速业务Pod的启动。

    # 如果环境中有 Docker,也可使用 docker pull
    # 示例以 Nginx 镜像为例
    crictl pull anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6

步骤二:创建数据盘快照

将已完成组件和镜像缓存的数据盘创建为快照,供后续节点池扩容时复用。

  1. 访问ECS控制台-实例,将目标实例设置为停止状态。

    关于停止实例的配置说明,请参见停止实例
  2. 实例已停止后,进入实例详情页,单击块存储页签。

  3. 找到作为容器运行时目录的数据盘,在其操作列,单击创建快照,按照页面提示完成快照的配置。

    关于快照的配置说明,请参见手动创建单个快照

步骤三:使用快照扩容节点并验证结果

  1. 创建一个节点池,应用此前创建的快照。核心配置如下:

    • 操作系统:按需选择操作系统。

      暂不支持ContainerOS3.5及以上版本。
    • 期望节点数:设置为1及以上。

    • 数据盘

      • 选择用数据盘快照,按照页面提示选择此前创建的快照。

      • 如已通过白名单申请初始化设置功能,需选择格式化,且作为容器运行时占用目录(此格式化流程会保留快照中的数据)。

    • 实例自定义数据对于非ContainerOS操作系统,添加以下脚本以跳过yum更新,加快节点初始化速度。

      touch /var/.skip-yum
  2. 等待新节点就绪后,登录节点,检查缓存是否已成功生效。

    1. 检查镜像缓存是否生效。

      查看kubelet日志,若已缓存的镜像未出现拉取记录,则表明缓存生效。

      # 若该命令无输出,或输出中不包含预置镜像(如 Terway、kube-proxy)的拉取记录,则证明缓存生效。
      journalctl -u kubelet | grep "pulled image"
    2. 检查kubelet缓存是否生效。

      查看ack-deploy日志,未出现check cached kubernetes failed即表示成功。

      # 如果该命令无输出,表明缓存的 kubelet 被成功使用
      cat /var/log/ack-deploy.log |grep "check cached kubernetes failed"

计费说明

制作快照的临时ECS实例、其挂载的云盘以及最终生成的快照,均会产生对应计费

请在操作完成后及时释放临时ECS实例,定期管理快照生命周期,删除不再使用的快照以节省成本。

常见问题

如果集群升级了版本,原来的快照还能用吗?

不推荐继续使用。快照中缓存的kubelet版本可能与新集群版本不兼容,会导致节点无法正常注册。集群升级后,建议重新制作数据盘快照。

除了kubelet和容器镜像,还能缓存其他文件吗?

可以。任何存放在该数据盘路径下的文件都会被包含在快照中。请根据业务需求缓存其他依赖文件(如配置文件、数据模型等),但需注意管理快照的大小和内容的合规性。

相关文档

节点初始化流程