本文主要介绍容器服务(VKE)提供的镜像懒加载能力,减少读取容器镜像文件的时间,支持快速启动容器应用。
背景信息 容器的标准镜像格式由 OCI image format spec 标准定义。容器镜像层是经过压缩的 TAR 归档文件,在启动容器前,容器运行时服务或者客户端需要将整个容器镜像的所有分层下载到本地,然后按照层的顺序串行地解压,为容器运行时提供联合文件系统(Union File System)。上述过程是一个非常耗时的过程,且消耗时间一般和容器镜像大小、镜像层间的大小差异正相关。然而在某些应用场景下,容器应用在启动阶段不需要读取全部的容器镜像文件,例如,容器应用在启动阶段连接外部数据库、从外部存储下载依赖文件等,此类场景需要容器尽快达到就绪状态。
针对以上问题和场景,VKE 提供镜像懒加载功能。借助镜像懒加载,容器可以获得秒级的启动就绪速度,启动速度几乎不受镜像大小的限制。
适用场景 具有如下特点的场景,适合使用镜像懒加载功能:
容器镜像较大,应用运行后访问的镜像内容具有明显的局部热点。 容器镜像拉取时间占整体容器运行时间的比重较大。 容器镜像变更比较频繁。 使用说明 为避免部分容器镜像 I/O(Input/Output)不能命中预取缓存,导致拖慢容器应用的运行时间,建议您在生产环境中使用该功能前,请先在测试环境中测试下目标容器应用是否适合使用镜像懒加载技术。 建议镜像懒加载方案和 P2P 镜像加速方案一起使用,以降低大规模扩容时对镜像中心的压力。相关信息,请参见 P2P 镜像加速方案 。 容器启动后,懒加载功能仍然需要从镜像中心下载镜像数据。如果镜像中心在镜像启动后故障,将导致容器应用无法正确地读取到镜像内容,导致容器应用发生不可预知的错误。 仅 Containerd 版本为 1.4.13-vke.3 及以上版本的节点才可用镜像懒加载功能。Containerd 版本查看方法,请参见 FAQ 。 弹性容器实例(VCI)场景暂不支持镜像懒加载功能。 使用方法 容器服务提供两种制作懒加载镜像方案:
方案一 :通过 CR 提供的镜像转化规则,转换容器镜像的格式,生成懒加载格式的 Nydus 镜像,再到 VKE 的工作负载中使用 Nydus 镜像。方案二 :自行转换容器镜像的格式,生成懒加载格式的 Nydus 镜像,再到 VKE 的工作负载中使用 Nydus 镜像。方案一:结合 CR 提供的镜像转化功能使用镜像懒加载 结合 CR 提供的镜像转化功能使用镜像懒加载的过程如下所示:
在 CR 标准版中创建懒加载转化规则。详细操作,请参见 创建镜像懒加载转化规则 。 在容器服务的节点池上开启镜像懒加载功能。
有如下三种方式,开启节点池的镜像懒加载功能:
创建集群时,在 ② 节点池配置(可选) 步骤的 高级配置 模块下,支持开启镜像懒加载能力。详细操作,请参见 创建集群 。 创建节点池时,在 ① 节点池配置 步骤的 高级配置 模块下,支持开启镜像懒加载能力。详细操作,请参见 创建节点池 。 已有节点池,支持通过编辑节点池配置,开启镜像懒加载能力。详细操作,请参见 编辑节点池 。注意
已有节点池开启镜像懒加载功能后,仅对新扩容的节点生效,对存量节点不生效。因此请扩容节点池。详细操作,请参见 扩缩容节点池 。
集群中安装容器镜像加速组件 image-accelerator。详细操作,请参见 image-accelerator 组件 。 将符合规则的镜像推送至镜像仓库,自动生成 Nydus 镜像副本。推送镜像的说明,请参见 推送和拉取镜像 。注意
将镜像转化为 Nydus 类型镜像时,原始镜像的 Tag 长度需要小于等于 122 字符(为-nydus
后缀预留 6 个字符位置),否则会转化失败。 向同一个 OCI 制品仓库推送同名的镜像将默认覆盖存量的镜像。请仔细确认待推送的镜像名称是否与镜像仓库中已存在的镜像同名。 在工作负载中使用镜像懒加载功能。下文以无状态负载(Deployment)为例。详细操作,请参见 创建无状态负载 。
使用已生成的 Nydus 镜像副本,作为工作负载的容器镜像。 为 Pod 添加特定的标签(Label),标签 Key 为vke.volcengine.com/image-accelerate-mode
、Value 为lazyload
。 查看工作负载的 Pod 实例状态,查看是否已将 Pod 调度到开启镜像懒加载功能的节点池节点。 方案二:自行转换镜像格式使用镜像懒加载 自行转换镜像格式使用镜像懒加载的过程如下所示:
在本地安装 GitHub 社区镜像转换工具。VERSION=v2.1.6
wget https://github.com/dragonflyoss/image-service/releases/download/${VERSION}/nydus-static-${VERSION}-linux-amd64.tgz
tar -xf nydus-static-${VERSION}-linux-amd64.tgz
cd nydus-static
install nydus-image nydusify /usr/local/bin
转换镜像格式为 Nydus 镜像。
使用docker login
登录镜像中心。可以是开源镜像中心、您的第三方仓库或者火山引擎镜像仓库实例。 从镜像中心获取待转换的源镜像地址。 使用镜像转换工具,转换源镜像,生成对应的 Nydus 镜像,并将生成的 Nydus 镜像推送到目标镜像地址。nydusify convert --source ${SOURCE_IMAGE} --target ${TARGET_IMAGE}
注意
请将命令中的${SOURCE_IMAGE}
替换为上一步获取的源镜像地址(镜像地址格式例如doc-cn-beijing.cr.volces.com/vke/nginx-demo:v1.0
);将${TARGET_IMAGE}
替换为推送已生成的 Nydus 镜像的目标镜像地址。 请确保您已登录目标镜像地址(${TARGET_IMAGE}
)对应的镜像中心,并对其 OCI 制品仓库、命名空间等拥有读写权限。 向同一个 OCI 制品仓库推送同名的镜像将默认覆盖存量的镜像。请仔细确认待推送的镜像名称是否与镜像中心中已存在的镜像同名。 在容器服务的节点池上开启镜像懒加载功能。
有如下三种方式,开启节点池的镜像懒加载功能:
创建集群时,在 ② 节点池配置(可选) 步骤的 高级配置 模块下,支持开启镜像懒加载能力。详细操作,请参见 创建集群 。 创建节点池时,在 ① 节点池配置 步骤的 高级配置 模块下,支持开启镜像懒加载能力。详细操作,请参见 创建节点池 。 已有节点池,支持通过编辑节点池配置,开启镜像懒加载能力。详细操作,请参见 编辑节点池 。注意
已有节点池开启镜像懒加载功能后,仅对新扩容的节点生效,对存量节点不生效。因此请扩容节点池。详细操作,请参见 扩缩容节点池 。
集群中安装容器镜像加速组件 image-accelerator。详细操作,请参见 image-accelerator 组件 。 在工作负载中使用镜像懒加载功能。下文以无状态负载(Deployment)为例。详细操作,请参见 创建无状态负载 。
使用已生成的 Nydus 镜像副本,作为工作负载的容器镜像。 为 Pod 添加特定的标签(Label),标签 Key 为vke.volcengine.com/image-accelerate-mode
、Value 为lazyload
。 查看工作负载的 Pod 实例状态,查看是否已将 Pod 调度到开启镜像懒加载功能的节点池节点。 附录 镜像加速方案选择对比 为了加快 Pod 启动速度,容器服务 VKE 提供了不同的方案进行优化。
对比项 镜像懒加载 P2P 加速 自定义节点镜像和预热(邀测) 方案说明 利用镜像读取数据热点,按需加载所需数据,提升容器启动效率。 利用计算节点的内网带宽资源,在节点之间分发镜像,减少对容器镜像仓库的压力。 通过对容器镜像进行拆分,将变动频率低的内容下沉到节点镜像,从而减小容器镜像大小。节点镜像通过预热方式加快节点的就绪。 适用场景 容器镜像大,数据局部热点明显,镜像变更频繁的场景。 容器镜像大且频繁变更的场景。 底层镜像变动频率低的场景。 受限因素
容器内应用读取容器镜像内容的范围。 镜像中心可靠性。 节点镜像缓存预热。
综上所述,自定义节点镜像和预热在使用流程上多了镜像拆分和节点镜像预热的步骤。但在预热后,整体拉取镜像的时间和性能,不会受其他因素影响。因此在镜像变动频繁的场景,可以使用 P2P 加速 或镜像懒加载方案,也可以结合使用该两个方案。
镜像懒加载监控 容器服务提供 Nydus 监控能力,支持通过该能力监控和观测镜像懒加载相关的 Nydus Daemon 数量、Nydus Daemon 内存用量等。详细说明,请参见 镜像加速观测 。