按需加载容器镜像

重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

传统容器运行需要将全量镜像数据下载后再解包,然而容器启动可能仅使用其中部分的内容,导致容器启动耗时长。通过容器镜像服务企业版的按需加载功能,允许仅下载和解压容器启动所必需的部分,而不是整个镜像,从而大幅提高应用部署速度和提升弹性体验。

前提条件

  • 已创建ACK、ACK Edge集群ACK Serverless集群和容器计算服务ACS。更多信息,请参见创建ACK托管集群创建ACK Edge集群创建集群创建ACS集群

    说明

    仅支持在版本≥1.16.9的托管版、专有版,≥1.26.3的ACK Edge集群ACK Serverless集群上使用加速镜像。且创建集群时操作系统为Alibaba Cloud Linux 2.1903、Alibaba Cloud Linux 3.2104、Alibaba Cloud Linux 3.2104 LTS 64 bit ARM edition、Alibaba Cloud Linux UEFI 2.1903、CentOS 7.9。

  • 已创建企业版实例,更多信息,请参见创建企业版实例

    说明

    在镜像加速中,两种模式支持的企业版实例规格有所不同:

    • 完整模式:支持的企业版实例为标准版或高级版。

    • 仅索引模式:支持的企业版实例为基础版、标准版或高级版。

  • 已在企业版实例中配置ACK或ACK Serverless集群对应的专有网络。加速镜像需要在专有网络中使用,更多信息,请参见配置专有网络的访问控制

背景信息

通过容器镜像服务企业版的按需加载功能,您可以在业务部署中使用加速镜像版本,实现镜像数据免全量下载和在线解压,大幅提升应用分发效率和弹性体验。镜像的加速效果与镜像大小、镜像仓库网络等因素有关。经实测,基于Docker Hub的nodebb镜像(1.34 GB)启动应用在镜像拉取阶段需耗费36s,整体应用启动时间38s。基于加速镜像启动应用在镜像拉取阶段仅需4s,整体应用启动时间仅需9s。

使用限制

  • 如果您的容器运行时为Containerd,则支持加速镜像仓库使用自定义域名,而Docker由于自身限制暂不支持加速镜像仓库自定义域名的使用。更多信息,请参见通过自定义域名访问容器镜像服务企业版实例

  • 仅索引模式不支持在FC和SAE的场景下使用。

地域限制

金融云与政务云地域不支持按需加载功能。

转换加速镜像

目前支持仓库级别配置,自动将推送的原始镜像转换为加速镜像。镜像转换时间取决于您的镜像大小,原始镜像不受任何影响。

说明

加速镜像的命名空间和仓库名称与原始镜像保持一致,tag格式为原始镜像tag加_accelerated后缀。

  1. 登录容器镜像服务控制台

  2. 在顶部菜单栏,选择所需地域。

  3. 在左侧导航栏,选择实例列表

  4. 实例列表页面单击目标企业版实例。

  5. 在企业版实例管理页左侧导航栏中选择仓库管理 > 镜像仓库

  6. 在镜像仓库页面单击目标镜像仓库名称或目标镜像仓库右侧操作列下的管理

  7. 在基本信息页面左上角单击编辑

  8. 修改基本信息对话框中,开启镜像加速,并选择所需模式后,单击确定

    • 完整模式:容器启动的加速效果较为显著,转换生成的加速镜像体积约为130%原镜像体积,1GB原始镜像生成加速镜像的时间约为25秒,已生成的镜像层不会重复生成。

    • 仅索引模式:容器启动的加速效果约为70%完整模式加速效果,加速镜像体积约为3%原镜像体积,1GB原始镜像生成加速镜像时间约为3秒,已生成索引的镜像层不会重复生成。

      重要

      仅索引模式正在公测中,建议您使用前先在测试环境进行验证,验证适用您的业务场景后再应用到生产环境中。

      说明
      • 仅索引模式目前仅适用于tartgz压缩的镜像,不适用于其他压缩方式(如zstd压缩)的镜像。

      • 仅索引模式需要绑定原始镜像使用,使用时原始镜像不可删除,完整模式可以独立使用加速镜像。

      • 仅索引模式不支持Docker运行时使用。

    在完成镜像加速转换设置后,您后续推送的镜像将自动触发镜像转换任务。若您希望接收镜像转换完成的通知,可以配置事件通知。例如将表达式设置为_accelerated$,更多信息,请参见事件通知

安装镜像加速组件

为了启动加速容器,需要在Worker节点安装按需加载相关的镜像存储插件。

  1. 为节点添加镜像加速标签。

    在创建Worker节点时,您可以为节点添加镜像加速标签(alibabacloud.com/image-accelerate-enabled: true),以便在节点初始化时开启镜像加速能力。设置镜像加速标签后,在节点初始化过程中会自动安装镜像存储插件。

    说明
    • 加速容器需运行在加速节点上,加速节点可同时支持普通容器与加速容器的运行。

    • 如果是为存量节点设置该标签,则不会生效。

    • 如果是为virtual-kubelet虚拟节点设置该标签,则会直接生效。

    • 集群创建时添加镜像加速标签。

      您可以在创建集群时,设置标签为alibabacloud.com/image-accelerate-enabled: true。更多信息,请参见创建ACK托管集群

    • 扩容节点时添加镜像加速标签。

      您可以设置节点池新扩容的节点的标签为alibabacloud.com/image-accelerate-enabled: true。更多信息,请参见创建节点池

      说明

      您可以创建单独的节点池以便统一管理具备镜像加速能力的节点。

    • 添加已有节点时添加镜像加速标签。

      您可以在添加已有节点时,设置标签为alibabacloud.com/image-accelerate-enabled: true。更多信息,请参见添加已有节点

  2. 安装镜像加速组件。

    1. 登录容器服务管理控制台

    2. 在控制台左侧导航栏,单击集群

    3. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择运维管理 > 组件管理

    4. 组件管理页面的其他区域找到aliyun-acr-acceleration-suite,单击右侧的安装

    5. 提示对话框中单击确定

      • 集群管理页面左侧导航栏,选择工作负载 > 守护进程集,在守护进程集页面,查看组件守护进程安装详情。

      • 集群管理页面左侧导航栏,选择工作负载 > 无状态,在无状态页面查看组件无状态应用安装详情。

      当目标组件的容器组数量显示全部启动完成,表示组件安装成功。

卸载镜像加速组件

重要

卸载前请确保目前无正在运行的加速容器。

  1. 登录容器服务管理控制台

  2. 集群列表页面,单击目标集群名称或者目标集群右侧操作列下的详情

  3. 在集群管理页左侧导航栏选择运维管理 > 组件管理

  4. 组件管理页面其他区域找到aliyun-acr-acceleration-suite,单击右侧的卸载

  5. 提示对话框中单击确定

启用加速镜像

  1. 设置镜像仓库访问凭证。

    • 镜像免密插件方式。

      • 若已使用免密插件,且企业版实例的免密配置正确,无需其他操作。

      • 若未使用免密插件,您可使用免密插件,更多信息,请参见使用免密组件拉取容器镜像

    • 指定镜像拉取凭证Secret的名称前缀方式。

      警告

      请确保您的镜像拉取密钥权限按最小权限原则配置,仅包含拉取本集群所需业务镜像的权限。更多详情,请参见授予RAM用户自定义策略

      创建名称以acr-credential-开头的、类型为kubernetes.io/dockerconfigjson的Secret。

      kubectl create secret docker-registry acr-credential-test --docker-server=<RegistryVpcDomain> --docker-username=<UserName> --docker-password=<Password>
    • 指定镜像拉取凭证Secret的标签方式。

      说明

      仅镜像加速组件的版本不小于0.2.6支持该方式。

      创建kubernetes.io/dockerconfigjson的Secret,并为其打上images.alibabacloud.com/accelerated: true的标签。

      kubectl create secret docker-registry <SecretName> --docker-server=<RegistryVpcDomain> --docker-username=<UserName> --docker-password=<Password>
      kubectl label secrets <SecretName>  images.alibabacloud.com/accelerated="true"
  2. 添加镜像加速标签。

    您可以为应用负载添加镜像加速标签,例如Pod、Deployment等。也可以为ACK或ACK Serverless集群的命名空间设置标签,该命名空间内的所有符合加速条件的应用负载会启用按需加载容器镜像,无需再修改所有符合加速条件的应用负载的YAML文件。根据实际情况选择任一方式添加镜像加速标签。

    说明

    标签的名称为k8s.aliyun.com/image-accelerate-mode,值为on-demand

    • 为应用负载添加镜像加速标签。

      以下以Pod为例设置标签。执行以下命令,为Deployment管理的Pod设置标签。

      kubectl edit deployment <Deployment名称> -n  <Deployment命名空间> 

      在Deployment的YAML描述文件中添加标签 k8s.aliyun.com/image-accelerate-mode: on-demand

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: nginx-deployment
        labels:
          app: nginx
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: nginx
        template:
          metadata:
            labels:
              app: nginx
              # enable on-demand mode
              k8s.aliyun.com/image-accelerate-mode: on-demand
          spec:
            containers:
             # your ACR instacne image
             - image: test-registry-vpc.cn-hangzhou.cr.aliyuncs.com/test/nginx:latest
               name: test
               command: ["sleep", "3600"]
    • 为命名空间添加镜像加速标签

      • 通过控制台添加镜像加速标签。

        1. 登录容器服务管理控制台

        2. 在控制台左侧导航栏中,单击集群

        3. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情

        4. 在集群管理页左侧导航栏单击命名空间与配额

        5. 命名空间页面单击目标命名空间操作列的编辑

        6. 编辑命名空间对话框中设置标签变量名称k8s.aliyun.com/image-accelerate-mode标签变量值on-demand,然后单击确定

      • 通过命令行添加镜像加速标签。

    kubectl label namespaces <YOUR-NAMESPACE> k8s.aliyun.com/image-accelerate-mode=on-demand

    设置加速标签后,如果您已完成普通镜像到加速镜像的转换,在相应命名空间内创建和更新pod时,加速组件会自动将Pod的原始镜像地址替换为加速镜像地址,并添加nodeSelector,将Pod调度到加速节点。