在 Kubernetes 資訊清單中使用容器映像檔摘要

本教學課程適用於將容器部署至 Kubernetes 的開發人員和作業人員,說明如何使用容器映像檔摘要識別容器映像檔。容器映像檔摘要會以不重複且不可變動的方式識別容器映像檔。

與使用映像檔標記相比,使用映像檔摘要部署容器映像檔有許多優點。如要進一步瞭解映像檔摘要,請先參閱使用容器映像檔摘要的隨附文件,再繼續本教學課程。

Kubernetes Pod 規格中容器的 image 引數會接受含有摘要的映像檔。這個引數適用於您使用 Pod 規格的任何位置,例如 Deployment、StatefulSet、DaemonSet、ReplicaSet、CronJob 和 Job 資源的 template 區段。

如要使用摘要部署映像檔,請使用映像檔名稱,後面加上 @sha256: 和摘要值。以下是使用摘要的映像檔的 Deployment 資源範例。Deployment 是 Kubernetes API 物件,可讓您執行多個 Pod 副本,並將這些副本分散到叢集中的節點。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: echo-deployment
spec:
  selector:
    matchLabels:
      app: echo
  template:
    metadata:
      labels:
        app: echo
    spec:
      containers:
      - name: echoserver
        image: gcr.io/google-containers/echoserver@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229
        ports:
        - containerPort: 8080

使用映像檔摘要的缺點之一是,您必須先將映像檔發布至登錄檔,才能得知摘要值。建構新映像檔時,摘要值會變更,因此每次部署時,您都需要更新 Kubernetes 資訊清單。

本教學課程說明如何使用 Skaffoldkptdigesterkustomizegke-deployko 等工具,在資訊清單中使用映像檔摘要。

建議

本文說明在 Kubernetes 部署中,使用映像檔摘要的幾種方式。本文所述工具是互補的。 舉例來說,您可以搭配使用 kpt 函式的輸出內容和 kustomize,為不同環境建立變體。Skaffold 可以使用 ko 建構映像檔,並使用 kubectl 或 kpt 將映像檔部署至 Kubernetes 叢集。

這兩項工具互補的原因在於,它們會根據 Kubernetes 資源模型 (KRM) 執行結構化編輯。這個模型可讓您插入工具,並逐步使用這些工具建立程序和管道,協助您部署應用程式和服務。

首先,建議您採用最適合現有工具和程序的做法:

  • Skaffold 可將摘要新增至圖片參照。只要稍微變更設定,就能啟用這項功能。採用 Skaffold 可帶來其他好處,例如抽象化不同工具建構及部署容器映像檔的方式。

  • 在 Kubernetes 叢集中,您可以將摘要工具做為變動性許可控制器 Webhook,為所有部署作業新增摘要,對目前建構及部署容器映像檔的程序影響極小。此外,由於只需要在命名空間中新增標籤,因此採用二進位授權時,也更簡單方便。

  • 如果您需要彈性工具來操控 Kubernetes 資訊清單,就很適合選用 kpt。摘要工具可用於 kpt 管道中的用戶端 KRM 函式

  • 如果您已使用 kustomize 管理各環境的 Kubernetes 資訊清單,建議您善用其映像檔轉換器,依摘要部署映像檔。

  • ko 是建構及發布 Go 應用程式映像檔的絕佳方式,而且 KnativeTektonsigstore 等開放原始碼專案也使用這項工具。

如果您未使用本文所述的任何工具,建議您先從 Skaffold 和摘要網路鉤子著手。Skaffold 是開發人員和發布團隊常用的工具,可與本教學課程中說明的其他工具整合。您可以視需求變化,善用這些整合選項。digester Kubernetes Webhook 可為整個叢集啟用以摘要為基礎的部署作業,與 Skaffold 互補。

使用 Skaffold

Skaffold 是一項指令列工具,可持續開發及部署應用程式到 Kubernetes 叢集。

使用 Skaffold 建構映像檔、將映像檔推送至 Artifact Registry,並在 Kubernetes 資訊清單範本中,將 image 預留位置值替換為推送映像檔的名稱、標記和摘要:

  1. 在 Cloud Shell 中,建立並前往目錄,儲存您在本節中建立的檔案:

    mkdir -p ~/container-image-digests-tutorial/skaffold
    cd ~/container-image-digests-tutorial/skaffold
    
  2. 複製 Skaffold Git 存放區:

    git clone https://github.com/GoogleContainerTools/skaffold.git
    
  3. 前往 getting-started 範例的目錄:

    cd skaffold/examples/getting-started
    
  4. 簽出與 Skaffold 版本相符的 Git 標記:

    git checkout $(skaffold version)
    
  5. 查看 skaffold.yaml 設定檔:

    cat skaffold.yaml
    

    檔案內容類似下列範例:

    apiVersion: skaffold/v4beta6
    kind: Config
    build:
      artifacts:
      - image: skaffold-example
    manifests:
      rawYaml:
      - k8s-pod.yaml

    build.artifacts 區段包含預留位置圖片名稱。Skaffold 會在輸入資訊清單檔案中尋找這個預留位置。

    manifests 區段會告知 Skaffold 從目前目錄讀取名為 k8s-pod.yaml 的輸入資訊清單。

    如要查看所有可用選項的總覽,請參閱 skaffold.yaml 參考說明文件

  6. 查看 Kubernetes 資訊清單範本:

    cat k8s-pod.yaml
    

    檔案如下:

    apiVersion: v1
    kind: Pod
    metadata:
      name: getting-started
    spec:
      containers:
      - name: getting-started
        image: skaffold-example

    image 欄位中的 skaffold-example 預留位置值與 skaffold.yaml 檔案中 image 欄位的值相符。Skaffold 會在算繪的輸出內容中,將這個預留位置值替換為完整的映像檔名稱和摘要。

  7. 建構映像檔並推送至 Artifact Registry:

    skaffold build \
        --default-repo=LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY \
        --file-output=artifacts.json \
        --interactive=false \
        --push=true \
        --update-check=false
    

    這個指令使用下列標記:

    • --file-output 旗標會指定 Skaffold 儲存建構映像檔相關資訊的檔案,包括摘要值。
    • --push 旗標會指示 Skaffold 將建構的映像檔推送至 --default-repo 旗標指定的容器映像檔登錄檔。
    • --interactive--update-check 旗標都設為 false。 在非互動式環境 (例如建構管道) 中,請將這些旗標設為 false,但在本機開發時,請保留預設值 (兩個旗標都設為 true)。

    如果您使用 Cloud Deploy 部署至 GKE,請在建立發布版本時,使用 --file-output 旗標中的檔案做為 --build-artifacts 旗標的值。

  8. 使用上一步中容器映像檔的名稱、標記和摘要,算繪展開的 Kubernetes 資訊清單:

    skaffold render \
        --build-artifacts=artifacts.json \
        --digest-source=none \
        --interactive=false \
        --offline=true \
        --output=rendered.yaml \
        --update-check=false
    

    這個指令使用下列標記:

    • --build-artifacts 標記會參照上一步驟中 skaffold build 指令的輸出檔案。
    • --digest-source=none 旗標表示 Skaffold 會使用 --build-artifacts 旗標中提供的檔案摘要值,而不是從容器映像檔登錄檔解析摘要。
    • --offline=true 標記表示您可以執行指令,不必存取 Kubernetes 叢集。
    • --output 標記用於指定已算繪資訊清單的輸出檔案。
  9. 查看轉譯後的資訊清單:

    cat rendered.yaml
    

    輸出結果會與下列內容相似:

    apiVersion: v1
    kind: Pod
    metadata:
      name: getting-started
    spec:
      containers:
      - image: LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/skaffold-example:TAG@sha256:DIGEST
        name: getting-started

    輸出內容會顯示下列值:

    • TAG:Skaffold 指派給映像檔的標記。
    • DIGEST:圖片摘要值

使用摘要器

Digester 會在 Kubernetes Pod 和 Pod 範本規格中,將摘要新增至容器和 init 容器映像檔。Digester 會取代使用標記的容器映像檔參照:

spec:
  containers:
  - image: gcr.io/google-containers/echoserver:1.10

使用圖片摘要的參照:

spec:
  containers:
  - image: gcr.io/google-containers/echoserver:1.10@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229

Digester 可以做為 Kubernetes 叢集中的變動准入 Webhook 執行,也可以做為用戶端 KRM 函式,搭配 kpt 或 kustomize 指令列工具執行。

使用消化器 KRM 函式

  1. 在 Cloud Shell 中,建立並前往目錄,儲存您在本節中建立的檔案:

    mkdir -p ~/container-image-digests-tutorial/digester-fn
    cd ~/container-image-digests-tutorial/digester-fn
    
  2. 下載摘要二進位檔:

    mkdir -p ${HOME}/bin
    export PATH=${HOME}/bin:${PATH}
    DIGESTER_VERSION=$(curl -sL https://api.github.com/repos/google/k8s-digester/releases/latest | jq -r .tag_name)
    curl -L "https://github.com/google/k8s-digester/releases/download/${DIGESTER_VERSION}/digester_$(uname -s)_$(uname -m)" --output ${HOME}/bin/digester
    chmod +x ${HOME}/bin/digester
    
  3. 建立 Kubernetes Pod 資訊清單,使用 1.10 標記參照 gcr.io/google-containers/echoserver 映像檔:

    cat << EOF > pod.yaml
    apiVersion: v1
    kind: Pod
    metadata:
      name: echo
    spec:
      containers:
      - name: echoserver
        image: gcr.io/google-containers/echoserver:1.10
        ports:
        - containerPort: 8080
    EOF
    
  4. 使用 kpt 執行 digester KRM 函式,並使用目前目錄中的資訊清單 (.):

    kpt fn eval . --exec digester
    

    執行這項指令時,kpt 會就地更新目前目錄中的資訊清單。如要讓 kpt 在控制台上顯示更新後的資訊清單,但不要變更資訊清單檔案,請新增 --output unwrap 旗標。

  5. 查看更新後的資訊清單:

    cat pod.yaml
    

    檔案如下:

    apiVersion: v1
    kind: Pod
    metadata:
      name: echo
    spec:
      containers:
        - name: echoserver
          image: gcr.io/google-containers/echoserver:1.10@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229
          ports:
            - containerPort: 8080

使用摘要器許可控制器 Webhook

  1. 在 Cloud Shell 中,建立並前往目錄,儲存您在本節中建立的檔案:

    mkdir -p ~/container-image-digests-tutorial/digester-webhook
    cd ~/container-image-digests-tutorial/digester-webhook
    
  2. 使用 kind 建立本機 Kubernetes 叢集:

    kind create cluster
    

    kind 是一項指令列工具,可使用 Docker 執行本機 Kubernetes 叢集。

  3. 部署摘要 Webhook:

    DIGESTER_VERSION=$(curl -sL https://api.github.com/repos/google/k8s-digester/releases/latest | jq -r .tag_name)
    kustomize build "https://github.com/google/k8s-digester.git/manifests?ref=${DIGESTER_VERSION}" | kubectl apply -f -
    
  4. 在 kind 叢集中建立名為 digester-demo 的 Kubernetes 命名空間:

    kubectl create namespace digester-demo
    
  5. digest-resolution: enabled 標籤新增至 digester-demo 命名空間:

    kubectl label namespace digester-demo digest-resolution=enabled
    

    摘要 Webhook 會將摘要新增至具有這個標籤的命名空間中的 Pod。

  6. 建立 Kubernetes Deployment 資訊清單,使用標記 1.10 參照映像檔 gcr.io/google-containers/echoserver

    cat << EOF > deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: echo-deployment
    spec:
      selector:
        matchLabels:
          app: echo
      template:
        metadata:
          labels:
            app: echo
        spec:
          containers:
          - name: echoserver
            image: gcr.io/google-containers/echoserver:1.10
            ports:
            - containerPort: 8080
    EOF
    
  7. digester-demo 命名空間中套用資訊清單:

    kubectl apply --filename deployment.yaml --namespace digester-demo \
        --output jsonpath='{.spec.template.spec.containers[].image}{"\n"}'
    

    --output 旗標會指示 kubectl 將映像檔名稱輸出至控制台,後面加上換行字元。輸出內容如下:

    gcr.io/google-containers/echoserver:1.10@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229

    這項輸出內容顯示,摘要器 Webhook 已將映像檔摘要新增至 Deployment 資源的 Pod 範本規格。

  8. 刪除 kind 叢集,釋出 Cloud Shell 工作階段中的資源:

    kind delete cluster
    

使用 kpt 設定器

kpt 是一種指令列工具,可管理、操控、自訂及套用 Kubernetes 資源資訊清單。

建構新映像檔時,您可以使用 kpt 函式目錄中的 create-settersapply-setters KRM 函式,更新 Kubernetes 資訊清單中的映像檔摘要。

  1. 在 Cloud Shell 中,建立並前往目錄,儲存您在本節中建立的檔案:

    mkdir -p ~/container-image-digests-tutorial/kpt
    cd ~/container-image-digests-tutorial/kpt
    
  2. 在目前目錄中建立 kpt 套件:

    kpt pkg init --description "Container image digest tutorial"
    
  3. 建立 Kubernetes Pod 資訊清單,使用 1.10 標記參照 gcr.io/google-containers/echoserver 映像檔:

    cat << EOF > pod.yaml
    apiVersion: v1
    kind: Pod
    metadata:
      name: echo
    spec:
      containers:
      - name: echoserver
        image: gcr.io/google-containers/echoserver:1.10
        ports:
        - containerPort: 8080
    EOF
    
  4. 使用 kpt 為資訊清單欄位建立名為 echoimage 的設定器,現有值為 gcr.io/google-containers/echoserver:1.10

    kpt fn eval . \
        --image gcr.io/kpt-fn/create-setters@sha256:0220cc87f29ff9abfa3a3b5643aa50f18d355d5e9dc9e1f518119633ddc4895c \
        -- "echoimage=gcr.io/google-containers/echoserver:1.10"
    
  5. 查看資訊清單:

    cat pod.yaml
    

    檔案如下:

    apiVersion: v1
    kind: Pod
    metadata:
      name: echo
    spec:
      containers:
      - name: echoserver
        image: gcr.io/google-containers/echoserver:1.10 # kpt-set: ${echoimage}
        ports:
        - containerPort: 8080
  6. 取得容器映像檔的摘要值:

    DIGEST=$(gcloud container images describe \
        gcr.io/google-containers/echoserver:1.10 \
        --format='value(image_summary.digest)')
    
  7. 設定新欄位值:

    kpt fn eval . \
        --image gcr.io/kpt-fn/apply-setters@sha256:4d4295727183396f0c3c6a75d2560254c2f9041a39e95dc1e5beffeb49cc1a12 \
        -- "echoimage=gcr.io/google-containers/echoserver:1.10@$DIGEST"
    

    執行這項指令時,kpt 會在資訊清單中就地替換 image 欄位值。

  8. 查看更新後的資訊清單:

    cat pod.yaml
    

    檔案如下:

    apiVersion: v1
    kind: Pod
    metadata:
      name: echo
    spec:
      containers:
      - name: echoserver
        image: gcr.io/google-containers/echoserver:1.10@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229 # kpt-set: ${echoimage}
        ports:
        - containerPort: 8080

使用 kustomize 映像檔轉換器

kustomize 是一種指令列工具,可讓您使用疊加層、修補程式和轉換器自訂 Kubernetes 資訊清單。

您可以使用 kustomize image transformer,更新現有資訊清單中的映像檔名稱、標記和摘要。

下列 kustomization.yaml 片段說明如何設定圖片轉換器,針對 Pod 規格 image 值與轉換器 name 值相符的圖片,使用轉換器 digest 值:

images:
- name: gcr.io/google-containers/echoserver
  digest: sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229

如要搭配使用 kustomize 映像檔轉換器和映像檔摘要,請按照下列步驟操作:

  1. 在 Cloud Shell 中,建立並前往目錄,儲存您在本節中建立的檔案:

    mkdir -p ~/container-image-digests-tutorial/kustomize
    cd ~/container-image-digests-tutorial/kustomize
    
  2. 建立 kustomization.yaml 檔案:

    kustomize init
    
  3. 建立 Kubernetes 資訊清單,其中包含參照映像檔 gcr.io/google-containers/echoserver 的 Pod 規格,並使用標記 1.10

    cat << EOF > pod.yaml
    apiVersion: v1
    kind: Pod
    metadata:
      name: echo
    spec:
      containers:
      - name: echoserver
        image: gcr.io/google-containers/echoserver:1.10
        ports:
        - containerPort: 8080
    EOF
    
  4. kustomization.yaml 檔案中將資訊清單新增為資源:

    kustomize edit add resource pod.yaml
    
  5. 使用圖片轉換器更新圖片的摘要:

    kustomize edit set image \
        gcr.io/google-containers/echoserver@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229
    
  6. kustomization.yaml 檔案中查看圖片轉換器:

    cat kustomization.yaml
    

    檔案如下:

    apiVersion: kustomize.config.k8s.io/v1beta1
    kind: Kustomization
    resources:
    - pod.yaml
    images:
    - digest: sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229
      name: gcr.io/google-containers/echoserver
  7. 查看產生的資訊清單:

    kustomize build .
    

    輸出內容如下:

    apiVersion: v1
    kind: Pod
    metadata:
      name: echo
    spec:
      containers:
      - image: gcr.io/google-containers/echoserver@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229
        name: echoserver
        ports:
        - containerPort: 8080
  8. 如要執行 kustomize 轉換器,並將產生的資訊清單套用至 Kubernetes 叢集,請使用 kubectl apply 指令搭配 --kustomize 標記:

    kubectl apply --kustomize .
    

    如要稍後套用輸出內容,可以將 kustomize build 指令的輸出內容重新導向至檔案。

正在使用 gke-deploy

gke-deploy 是搭配 Google Kubernetes Engine (GKE) 使用的指令列工具。gke-deploy 會包裝 kubectl 指令列工具,並可修改您按照 Google 建議做法建立的資源。

如果您使用 gke-deploy 子指令 preparerungke-deploy 會將圖片標記解析為摘要,並預設將含有圖片摘要的擴充資訊清單儲存至 output/expanded/aggregated-resources.yaml 檔案。

您可以使用 gke-deploy run 將映像檔標記替換為摘要,並將擴充資訊清單套用至 GKE 叢集。雖然這項指令很方便,但也有缺點:映像檔標記會在部署時替換。您決定部署標記與實際部署標記之間的時間差,可能導致與標記相關聯的圖片發生變更,進而部署非預期的圖片。如為實際工作環境的部署作業,建議您分別執行產生及套用資訊清單的步驟。

如要將 Kubernetes 部署資訊清單中的映像檔標記替換為映像檔摘要,請按照下列步驟操作:

  1. 在 Cloud Shell 中,建立並前往目錄,儲存您在本節中建立的檔案:

    mkdir -p ~/container-image-digests-tutorial/gke-deploy
    cd ~/container-image-digests-tutorial/gke-deploy
    
  2. 安裝 gke-deploy

    go install github.com/GoogleCloudPlatform/cloud-builders/gke-deploy@latest
    
  3. 建立 Kubernetes Deployment 資訊清單,使用標記 1.10 參照映像檔 gcr.io/google-containers/echoserver

    cat << EOF > deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: echo-deployment
    spec:
      selector:
        matchLabels:
          app: echo
      template:
        metadata:
          labels:
            app: echo
        spec:
          containers:
          - name: echoserver
            image: gcr.io/google-containers/echoserver:1.10
            ports:
            - containerPort: 8080
    EOF
    
  4. 根據 deployment.yaml 資訊清單產生擴充資訊清單:

    gke-deploy prepare \
        --filename deployment.yaml \
        --image gcr.io/google-containers/echoserver:1.10 \
        --version 1.10
    
  5. 查看展開的資訊清單:

    cat output/expanded/aggregated-resources.yaml
    

    輸出內容如下:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app.kubernetes.io/managed-by: gcp-cloud-build-deploy
        app.kubernetes.io/version: "1.10"
      name: echo-deployment
      namespace: default
    spec:
      selector:
        matchLabels:
          app: echo
      template:
        metadata:
          labels:
            app: echo
            app.kubernetes.io/managed-by: gcp-cloud-build-deploy
            app.kubernetes.io/version: "1.10"
        spec:
          containers:
          - image: gcr.io/google-containers/echoserver@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229
            name: echoserver
            ports:
            - containerPort: 8080

    在展開的資訊清單中,圖片標記會由摘要取代。

    您透過 gke-deploy 指令使用的 --version 引數,會設定展開資訊清單中部署和 Pod 範本中繼資料的app.kubernetes.io/version 標籤值。

    如要瞭解如何搭配 Cloud Build 使用 gke-deploy,請參閱 Cloud Build gke-deploy 說明文件

正在使用 ko

ko 是指令列工具和程式庫,用於建構 Go 容器映像檔,並將其部署至 Kubernetes 叢集。ko 會建構映像檔,而不需要使用 Docker Daemon,因此您可以在無法安裝 Docker 的環境中使用。

ko 子指令 build 會建構映像檔,並將其發布至容器映像檔登錄檔,或載入至本機 Docker Daemon。

ko 子指令 resolve 會執行下列動作:

  • 透過 --filename 引數提供的 Kubernetes 資訊清單,找出 image 欄位中的預留位置,藉此識別要建構的映像檔。
  • 建構及發布圖片。
  • image 值預留位置替換為所建構映像檔的名稱和摘要。
  • 列印展開的資訊清單。

ko 子指令 applycreaterun 會執行與 resolve 相同的步驟,然後使用展開的資訊清單執行 kubectl applycreaterun

如要從 Go 原始碼建構映像檔,並將映像檔的摘要新增至 Kubernetes 部署資訊清單,請執行下列操作:

  1. 在 Cloud Shell 中,建立並前往目錄,儲存您在本節中建立的檔案:

    mkdir -p ~/container-image-digests-tutorial/ko
    cd ~/container-image-digests-tutorial/ko
    
  2. 下載 ko 並新增至 PATH

    mkdir -p ${HOME}/bin
    export PATH=${HOME}/bin:${PATH}
    KO_VERSION=$(curl -sL https://api.github.com/repos/ko-build/ko/releases/latest | jq -r .tag_name | cut -c2-)
    curl -L "https://github.com/ko-build/ko/releases/download/v${KO_VERSION}/ko_${KO_VERSION}_$(uname -s)_$(uname -m).tar.gz" | tar -zxC ${HOME}/bin ko
    
  3. 在名為 app 的新目錄中,建立模組名稱為 example.com/hello-world 的 Go 應用程式:

    mkdir -p app/cmd/ko-example
    
    cd app
    
    go mod init example.com/hello-world
    
    cat << EOF > cmd/ko-example/main.go
    package main
    
    import "fmt"
    
    func main() {
        fmt.Println("hello world")
    }
    EOF
    
  4. 定義 ko 用於發布圖片的圖片存放區:

    export KO_DOCKER_REPO=LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY
    

    本範例使用 Artifact Registry,但您也可以搭配其他容器映像檔登錄檔使用 ko

  5. 如要建構及發布應用程式的映像檔,請執行下列其中一個步驟:

    • 提供 Go 主要套件的路徑,為應用程式建構及發布映像檔:

      ko build --base-import-paths ./cmd/ko-example
      

      選用引數 --base-import-paths 表示 ko 會使用主要套件目錄的簡短名稱做為圖片名稱。

      ko 會以以下格式將映像檔名稱和摘要列印至 stdout

      LOCATION-docker.pkg.dev/PROJECT_ID/ko-example@sha256:DIGEST

      在這個輸出內容中,DIGEST 是映像檔摘要值。

    • 使用 ko 將資訊清單預留位置,替換為所建構及發布映像檔的名稱和摘要:

      1. 建立 Kubernetes Pod 資訊清單。資訊清單會使用預留位置 ko://IMPORT_PATH_OF_YOUR_MAIN_PACKAGE 做為 image 欄位的值:

        cat << EOF > ko-pod.yaml
        apiVersion: v1
        kind: Pod
        metadata:
          name: ko-example
        spec:
          containers:
          - name: hello-world
            image: ko://example.com/hello-world/cmd/ko-example
        EOF
        
      2. 為應用程式建構及發布映像檔,並將資訊清單預留位置替換為映像檔名稱和摘要:

        ko resolve --base-import-paths --filename ko-pod.yaml
        

        ko 會將資訊清單連同映像檔名稱和摘要列印到 stdout

        apiVersion: v1
        kind: Pod
        metadata:
          name: ko-example
        spec:
          containers:
          - name: hello-world
            image: LOCATION-docker.pkg.dev/PROJECT_ID/ko-example@sha256:DIGEST

        在這個輸出內容中,DIGEST 是映像檔摘要值。