本文介绍如何在ACS集群中通过 image-cache-operator 组件自动制作镜像缓存。
准备工作
在集群组件管理中安装
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,需获取全局读Secret的RBAC权限。
自动创建镜像缓存时每个制作任务会占用Pod相同交换机中的IP地址,如果IP不足可能会导致新建Pod或镜像缓存失败。
Failed 状态的ImageCache CR 会进行重试,需及时清理与排查失败原因避免占用构建额度影响整体镜像缓存创建速度。
使用方式
方式一:通过 Pod 自动创建
使用image.alibabacloud.com/auto-image-cache: controller注解,在创建Pod时自动创建Pod所有容器的镜像缓存。
步骤一:创建示例资源
(可选)创建镜像所使用的
imagePullSecret。kubectl create secret docker-registry pull-secret --docker-server=<acrurl> --docker-username=<username> --docker-password=<password>请替换命令中的占位符为实际值。
<acrurl>:镜像仓库地址,如***-***-registry.cn-hangzhou.cr.aliyuncs.com。<username>:镜像仓库用户名。<password>:镜像仓库密码。
将以下内容保存为
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
步骤二:结果验证
查看 ImageCache 状态。
kubectl get imagecaches.image.alibabacloud.com预期输出中,若
Phase为Ready则说明镜像缓存已经制作成功。若为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
(可选)创建镜像所使用的
imagePullSecret。kubectl create secret docker-registry pull-secret --docker-server=<acrurl> --docker-username=<username> --docker-password=<password>请替换命令中的占位符为实际值。
<acrurl>:镜像仓库地址,如***-***-registry.cn-hangzhou.cr.aliyuncs.com。<username>:镜像仓库用户名。<password>:镜像仓库密码。
将以下内容保存为
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.networkConfigsecurityGroupId:拉取镜像缓存需要的安全组。
vSwitchIds:拉取镜像缓存需要的交换机,支持多个。
默认使用集群关联的vSwitch和安全组。
image.alibabacloud.com/cascade-delete-image-cache注解删除ImageCache CR后,是否删除镜像缓存。
true: 删除 CR 后镜像缓存会被删除。false:删除 CR 后镜像缓存不删除,需后续在镜像缓存控制台或 OpenAPI 进行删除。
步骤2:结果验证
查看
ImageCache状态。kubectl get imagecaches.image.alibabacloud.com image-cache-01预期输出中,若
Phase为Ready则说明镜像缓存已经制作成功。若为Failed,可通过kubectl describe imagecaches.image.alibabacloud.com image-cache-01命令查看Status字段中具体的报错信息。NAME PHASE IMAGECACHEID SIZE AGE image-cache-01 Ready imc-bp1anzjc0v90h8jm**** 1 6m39s进入镜像缓存控制台,可查看重新制作的同名 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
}
}主要参数说明:
参数项 | 说明 |
| Pod长时间未调度成功,创建镜像缓存的网络配置从NetworkConfig获取。 |
| 指定的镜像将不会自动创建镜像缓存。 |
| 自动创建的ImageCache CR超过 |
| GC周期,单位:分钟。 |