在Knative中通过镜像部署服务时,ACK集群会从远程仓库拉取镜像并创建新的Pod,如果镜像较大,会在拉镜像阶段消耗较多时间。推荐您使用ECI提供的镜像缓存(ImageCache)功能,预先将待使用的镜像制作成缓存快照,然后基于该快照来创建ECI Pod,减少启动耗时。
功能介绍
在创建ECI实例(Pod)时,大部分时间消耗在镜像下载阶段。为加速实例创建速度,ECI提供镜像缓存功能。您可以预先将需要使用的镜像制作成缓存快照,然后基于该快照来创建ECI实例(Pod),避免或者减少镜像层的下载,从而提升实例创建速度。经实测,以使用Docker Hub的Flink镜像(约386.26 MB)创建Pod为例,正常创建ECI实例(Pod)过程中,镜像准备阶段需要耗时50s。使用镜像缓存后,镜像准备阶段可以缩短至5s,极大节约实例创建耗时。
此数据为理论值。创建Pod的实际提升速度由Pod中使用的镜像个数、镜像大小和镜像仓库网络因素等决定。
在ACK集群中,ECI以CRD的方式将镜像缓存功能,对应的CRD为ImageCache。ImageCache CRD是Cluster级别的资源,在不同命名空间下创建Pod时均可以使用ImageCache加速Pod的创建。
关于镜像缓存的基本功能、使用方式、计费说明等详细信息,请参见镜像缓存概述。
步骤一:创建ImageCache
使用以下示例的YAML内容,创建名为imagecache-secrets-test.yaml文件以加速拉取镜像,减少ECI实例的启动耗时。
apiVersion: eci.alibabacloud.com/v1 kind: ImageCache metadata: name: imagecache-sample-test annotations: k8s.aliyun.com/eci-image-cache: "true" # 开启镜像缓存复用。 spec: images: - registry.cn-shanghai.aliyuncs.com/eci_open/nginx:1.14.2 - registry.cn-shanghai.aliyuncs.com/eci_open/busybox:1.30 imageCacheSize: 25 retentionDays: 7
说明如果您已经创建过镜像缓存,且新创建的镜像缓存与已有镜像缓存中的镜像层重复,可开启镜像缓存复用,加速镜像缓存的创建。
关于以上代码参数和ImageCache的更多信息,请参见管理ImageCache。
执行以下命令,创建ImageCache。
kubectl create -f imagecache-secrets-test.yaml
执行以下命令,查看ImageCache状态。
kubectl get imagecache imagecache-sample-test
预期输出:
NAME AGE CACHEID PHASE PROGRESS imagecache-sample-test 20h imc-2zeditzeoemfhqor**** Ready 100%
步骤二:使用ImageCache加速创建Pod
使用ImageCache创建Pod包括明确指定和自动匹配两种方式,您可以在Pod级别的metadata
中添加Annotation来配置。
k8s.aliyun.com/eci-image-snapshot-id
:明确指定使用哪个镜像缓存创建Pod。k8s.aliyun.com/eci-image-cache
:根据匹配策略自动选择最优的ImageCache创建Pod。
如果同时设置k8s.aliyun.com/eci-image-snapshot-id
和k8s.aliyun.com/eci-image-cache
,则明确指定方式的优先级高于自动匹配方式。
明确指定
创建Knative Service时,您可以添加Annotationk8s.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
Annotation使用自动匹配的ImageCache来加速创建Pod。
ECI将基于您已有的ImageCache列表,按照以下顺序进行匹配,选择最优的ImageCache来创建Pod:
过滤筛选出您在当前地域下的所有镜像缓存,且镜像缓存的大小满足ECI实例临时存储空间大小的限制。
根据匹配策略选择最优的镜像缓存,匹配策略的优先级从高到低依次为:镜像匹配度、镜像大小、创建时间。
镜像匹配度:优先选择匹配度高的镜像缓存,匹配度指的是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