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

Last reviewed 2023-07-21 UTC

本教學課程適用於將容器部署至 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 資訊清單,建議您善用其映像檔轉換器,依摘要部署映像檔。

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

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

目標

  • 使用 Skaffold 建構及推送映像檔,並在 Kubernetes 資訊清單中插入映像檔名稱和摘要。
  • 使用摘要用戶端函式和變異准入 Webhook,將摘要新增至 Kubernetes Pod 和 Pod 範本中的映像檔。
  • 使用 kpt 設定器,將 Kubernetes 資訊清單中的映像檔標記換成映像檔摘要。
  • 使用 kustomize 生成含有映像檔摘要的 Kubernetes 資訊清單。
  • 使用 gke-deploy 將 Kubernetes 資訊清單中的映像檔標記解析為摘要。
  • 使用 ko 建構及推送映像檔,並在 Kubernetes 資訊清單中插入映像檔名稱和摘要。

費用

在本文件中,您會使用 Google Cloud的下列計費元件:

如要根據預測用量估算費用,請使用 Pricing Calculator

初次使用 Google Cloud 的使用者可能符合免費試用資格。

完成本文所述工作後,您可以刪除已建立的資源,避免繼續計費。詳情請參閱清除所用資源一節。

事前準備

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  2. Make sure that billing is enabled for your Google Cloud project.

  3. Enable the Artifact Registry API.

    Enable the API

  4. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

  5. 在 Cloud Shell 中,為 Google Cloud CLI 設定預設專案:

    gcloud config set project PROJECT_ID
    

    PROJECT_ID 替換為您的 [專案 ID]。

  6. 在 Artifact Registry 中建立容器映像檔存放區:

    gcloud artifacts repositories create REPOSITORY \
        --location=LOCATION \
        --repository-format=docker
    

    更改下列內容:

    • REPOSITORY:您要用於存放區的名稱,例如 digest-tutorial
    • LOCATIONArtifact Registry 位置,例如 us-central1
  7. 為本教學課程中使用的 CLI 工具設定 Artifact Registry 位置的驗證機制:

    gcloud auth configure-docker LOCATION-docker.pkg.dev
    

使用 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. 建立參照映像檔 gcr.io/google-containers/echoserver 的 Kubernetes 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. 使用 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. 建立參照映像檔 gcr.io/google-containers/echoserver 的 Kubernetes 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. 使用 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 是映像檔摘要值。

清除所用資源

如要避免付費,最簡單的方法就是刪除您為了本教學課程所建立的 Google Cloud 專案。或者,您也可以刪除個別資源。

刪除專案

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

刪除資源

如要保留您在本教學課程中使用的 Google Cloud 專案,請刪除個別的資源:

  1. 在 Cloud Shell 中,刪除您在本教學課程中建立的檔案:

    cd
    rm -rf ~/container-image-digests-tutorial
    
  2. 刪除 Artifact Registry 中的容器映像檔存放區:

    gcloud artifacts repositories delete REPOSITORY \
        --location=LOCATION --async --quiet
    

後續步驟