阿里云以CRD的方式将ECI的镜像缓存功能提供给Kubernetes用户,以便Kubernetes用户也可以使用该功能来加速创建Pod。本文介绍如何在Knative中使用镜像缓存CRD加速创建Pod。

背景信息

在创建ECI实例(Pod)时,大部分时间消耗在镜像下载阶段。为加速实例创建速度,ECI提供镜像缓存功能。您可以预先将需要使用的镜像制作成缓存快照,然后基于该快照来创建ECI实例(Pod),避免或者减少镜像层的下载,从而提升实例创建速度。经实测,以使用Docker Hub的flink镜像(约386.26 MB)创建Pod为例,正常创建ECI实例(Pod)过程中,镜像准备阶段需要耗时50s。使用镜像缓存后,镜像准备阶段可以缩短至5s,极大节约实例创建耗时。

说明
  • 创建Pod的具体提升速度由Pod中使用的镜像个数、镜像大小和镜像仓库网络因素等决定。为方便Kubernetes用户也可以使用到ECI的镜像缓存功能,阿里云以CRD的方式将镜像缓存功能提供给Kubernetes用户,对应的CRD为ImageCache。
  • ImageCache CRD在kubernetes集群中为Cluster级别资源,被集群内所有Namespace共享。

步骤一:创建ImageCache

  1. 使用以下示例的YAML内容,创建名为imagecache-secrets-test.yaml文件。
    apiVersion: eci.alibabacloud.com/v1
    kind: ImageCache
    metadata:
      name: imagecache-sample-test
      annotations:
        k8s.aliyun.com/eci-image-cache: "true" #开启镜像缓存复用。
    spec:
      images:
      - centos:latest
      - busybox:latest
      imagePullSecrets:
      - default:secret1
      - default:secret2
      - kube-system:secret3
      imageCacheSize:
       25
      retentionDays:
       7
    说明 如果您已经创建过镜像缓存,且新创建的镜像缓存与已有镜像缓存存在重复的镜像层,可开启镜像缓存复用,加速镜像缓存的创建。
  2. 执行以下命令,创建ImageCache。
    kubectl create -f imagecache-secrets-test.yaml
  3. 执行以下命令,查看ImageCache状态。
    kubectl get imagecache imagecache-sample-test
    预期输出:
    NAME                              AGE   CACHEID                               PHASE   PROGRESS
    imagecache-sample-test            20h   imc-2zeditzeoemfhqor****              Ready    100%

步骤二:使用ImageCache加速创建Pod

ImageCache资源是Cluster级别,因此在不同的Namespace下创建Pod时,均可以使用ImageCache加速创建Pod。

使用ImageCache创建Pod包括明确指定和自动匹配两种方式,您可以在Pod级别的metadata中添加注解来配置,相关注解如下:

  • k8s.aliyun.com/eci-image-snapshot-id:明确指定使用哪个镜像缓存创建Pod。
  • k8s.aliyun.com/eci-image-cache:根据匹配策略自动匹配最优的ImageCache创建Pod。
说明 如果同时设置k8s.aliyun.com/eci-image-snapshot-idk8s.aliyun.com/eci-image-cache,则明确指定方式的优先级高于自动匹配方式。
  • 方式一:明确指定

    创建Knative Service时,您可以通过添加k8s.aliyun.com/eci-image-snapshot-id注解的方式,声明使用指定的ImageCache来加速创建Pod。

    注意 请确保指定的ImageCache的状态为Ready,其它状态的ImageCache会导致Pod创建失败。
    Knative Service示例如下:
    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: helloworld-go
    spec:
      template:
        metadata:
          labels:
            app: helloworld-go
          annotations:
            k8s.aliyun.com/eci-image-snapshot-id: imc-2ze5tm5gehgtiiga****  #明确指定ImageCache。
        spec:
          containers:
            - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/helloworld-go:73fbdd56
  • 方式二:自动匹配

    创建Knative Service时,您可以通过添加k8s.aliyun.com/eci-image-cache注解的方式,声明使用自动匹配的ImageCache来加速创建Pod。

    ECI将基于您已有的ImageCache列表,按照以下顺序进行匹配,选择最优的ImageCache来创建Pod:
    1. 过滤筛选出您在当前地域下的所有镜像缓存,且镜像缓存的大小满足ECI实例临时存储空间大小的限制。
    2. 根据匹配策略选择最优的镜像缓存,匹配策略的优先级从高到低依次为:镜像匹配度、镜像大小、创建时间。
      • 镜像匹配度:优先选择匹配度高的镜像缓存,匹配度指的是ECI实例和镜像缓存两者在镜像仓库和版本上的匹配情况。
      • 镜像大小:优先选择镜像大小最接近的镜像缓存。
      • 创建时间:优先选择最新创建的镜像缓存。
      说明 如果没有匹配到镜像缓存,系统将在创建ECI实例(Pod)的同时自动创建镜像缓存。创建时将正常拉取镜像,建议您将容器的镜像拉取策略配置为按需拉取(IfNotPresent),以避免镜像层重复下载,影响镜像缓存的使用效果。
    Knative Service示例如下:
    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: helloworld-go
    spec:
      template:
        metadata:
          labels:
            app: helloworld-go
          annotations:
            k8s.aliyun.com/eci-image-cache: "true"  #开启自动匹配ImageCache。
        spec:
          containers:
            - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/helloworld-go:73fbdd56

相关操作

  • 查询集群下所有ImageCache列表:
    kubectl get imagecache
  • 查看某个ImageCache的详细信息:
    kubectl get imagecache/<imagecache_name> -o yaml

    <imagecache_name>替换成您实际要查看的ImageCache名称。

  • 删除ImageCache:
    kubectl delete imagecache/<imagecache_name>

    <imagecache_name>替换成您实际要删除的ImageCache名称。