使用image-cache-operator自动制作镜像缓存

更新时间:
复制为 MD 格式

本文介绍如何在ACS集群中通过 image-cache-operator 组件自动制作镜像缓存。

准备工作

  1. 创建ACS集群

  2. 获取集群kubeconfig并通过kubectl工具连接集群

  3. 在集群组件管理中安装 image-cache-operator 组件。

    建议将rbac.secret设置为true,组件会自动读取Pod引用的imagePullSecrets信息,作为拉取镜像时的权限认证。

使用限制

  • 通过Pod自动创建的镜像缓存,在使用原镜像tag重新推送至镜像仓库后,镜像缓存不会更换为新版本。

  • 集群中ImageCache CR状态不一定反映对应镜像缓存的实际状态,例如在控制台删除镜像缓存后,ImageCache CR状态不变且不会删除。

  • 通过创建ImageCache CR方式建立镜像缓存,可指定注解image.alibabacloud.com/cascade-delete-image-cache=true,表示删除CR时级联删除远端镜像缓存。这种情况下删除CR后,远端镜像缓存会被强删,导致正在使用该镜像缓存的Pod拉取镜像失败。

  • 集群中ImageCache CR超过配置的上限数时,operator会定期清理,不会删除远端镜像缓存。详细内容,请参见operator配置说明

  • 修改operator配置的ConfigMap后,需重启operator生效。

  • 该组件由于需要获取imagePullSecret,需获取全局读SecretRBAC权限。

  • 自动创建镜像缓存时每个制作任务会占用Pod相同交换机中的IP地址,如果IP不足可能会导致新建Pod或镜像缓存失败。

  • Failed 状态的ImageCache CR 会进行重试,需及时清理与排查失败原因避免占用构建额度影响整体镜像缓存创建速度。

使用方式

方式一:通过 Pod 自动创建

使用image.alibabacloud.com/auto-image-cache: controller注解,在创建Pod时自动创建Pod所有容器的镜像缓存。

步骤一:创建示例资源

  1. (可选)创建镜像所使用的imagePullSecret

    kubectl create secret docker-registry pull-secret --docker-server=<acrurl> --docker-username=<username> --docker-password=<password>

    请替换命令中的占位符为实际值。

    1. <acrurl>:镜像仓库地址,如***-***-registry.cn-hangzhou.cr.aliyuncs.com

    2. <username>:镜像仓库用户名。

    3. <password>:镜像仓库密码。

  2. 将以下内容保存为imc-pod.yaml,然后执行kubectl apply -f imc-pod.yaml创建示例Pod。

    apiVersion: v1
    kind: Pod
    metadata:
      labels:
        alibabacloud.com/compute-class: performance
        alibabacloud.com/compute-qos: default
        alibabacloud.com/acs: 'true'
      annotations:
        image.alibabacloud.com/auto-image-cache: controller # 声明开启自动创建
      name: image-cache-01
      namespace: default
    spec:
      imagePullSecrets:
      - name: pull-secret
      containers:
      - image: registry.openanolis.cn/openanolis/nginx:1.14.1-8.6
        name: main
        resources:
          limits:
            cpu: "4"
            memory: 8Gi
          requests:
            cpu: "4"
            memory: 8Gi

步骤二:结果验证

  1. 查看 ImageCache 状态。

    kubectl get imagecaches.image.alibabacloud.com

    预期输出中,若PhaseReady则说明镜像缓存已经制作成功。若为Failed,可通过kubectl describe imagecaches.image.alibabacloud.com <image-cache-name>命令查看Status字段中具体的报错信息。

    NAME                           PHASE   IMAGECACHEID               SIZE   AGE
    image-cache-4612197a7706****   Ready   imc-bp11oilzhe191fve****   1      119m
    也可通过镜像缓存控制台查看自动创建的镜像缓存。

方式二:通过ImageCache CRD创建

ImageCache CR是集群级资源。通过 CRD 方式提交的相同 tag 的镜像,会重新制作镜像缓存。

步骤1:提交 ImageCache CRD

  1. (可选)创建镜像所使用的imagePullSecret

    kubectl create secret docker-registry pull-secret --docker-server=<acrurl> --docker-username=<username> --docker-password=<password>

    请替换命令中的占位符为实际值。

    1. <acrurl>:镜像仓库地址,如***-***-registry.cn-hangzhou.cr.aliyuncs.com

    2. <username>:镜像仓库用户名。

    3. <password>:镜像仓库密码。

  2. 将以下内容保存为imc-crd.yaml,然后执行kubectl apply -f imc-crd.yaml创建ImageCache资源对象。

    apiVersion: image.alibabacloud.com/v1
    kind: ImageCache
    metadata:
      name: image-cache-01
      annotations: 
        image.alibabacloud.com/cascade-delete-image-cache: "false" # 删除该CR时是否删除镜像缓存
    spec:
      imagePullCredentials:
      - secretName: pull-secret
        secretNamespace: default
      images:
      - registry.cn-hangzhou.aliyuncs.com/eci_open/nginx:latest
      networkConfig:
        securityGroupId: sg-bp1hfv5fwpyx4ry0****
        vSwitchIds:
        - vsw-bp169dodwplgfpc86****

    主要参数说明:

    参数项

    说明

    spec.imagePullCredentials

    制作镜像缓存需要的 Secret,用于拉取镜像。

    spec.images

    制作镜像缓存关联的 image,当前只支持单镜像。

    spec.networkConfig

    • securityGroupId:拉取镜像缓存需要的安全组。

    • vSwitchIds:拉取镜像缓存需要的交换机,支持多个。

    默认使用集群关联的vSwitch和安全组。

    image.alibabacloud.com/cascade-delete-image-cache注解

    删除ImageCache CR后,是否删除镜像缓存。

    • true: 删除 CR 后镜像缓存会被删除。

    • false:删除 CR 后镜像缓存不删除,需后续在镜像缓存控制台或 OpenAPI 进行删除。

步骤2:结果验证

  1. 查看ImageCache状态。

    kubectl get imagecaches.image.alibabacloud.com image-cache-01

    预期输出中,若PhaseReady则说明镜像缓存已经制作成功。若为Failed,可通过kubectl describe imagecaches.image.alibabacloud.com image-cache-01命令查看Status字段中具体的报错信息。

    NAME             PHASE   IMAGECACHEID               SIZE   AGE
    image-cache-01   Ready   imc-bp1anzjc0v90h8jm****   1      6m39s
  2. 进入镜像缓存控制台,可查看重新制作的同名 tag 的镜像缓存。

operator配置说明

集群中ImageCache CR超过配置的上限数时,image-cache-operator会定期清理自动创建的CR,详细配置请参考ConfigMap中的ImageCacheGCConfig

apiVersion: v1
kind: ConfigMap
metadata:
  name: acs-image-cache-config
  namespace: kube-system
data:
  acs-config: |
    {
      "NetworkConfig": {
        "vSwitchIds": ["vSwitch1", "vSwitch2"],
        "securityGroupId": "XXX"
      },
      "IgnoreAutoCacheImages": ["image-1", "image-2"],
      "ImageCacheGCConfig": {
        "threshold": 1000,
        "period": 1
      }
    }

主要参数说明:

参数项

说明

NetworkConfig

Pod长时间未调度成功,创建镜像缓存的网络配置从NetworkConfig获取。

IgnoreAutoCacheImages

指定的镜像将不会自动创建镜像缓存。

ImageCacheGCConfig.threshold

自动创建的ImageCache CR超过threshold时,清理超出部分且ReadyCR。

ImageCacheGCConfig.period

GC周期,单位:分钟。