全部產品
Search
文件中心

Container Service for Kubernetes:在Knative中使用鏡像加速

更新時間:Nov 02, 2024

在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

  1. 使用以下樣本的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

  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建立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-idk8s.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-cacheAnnotation使用自動匹配的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