在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