開始在 Cloud Deploy 中使用 Skaffold

本文說明如何開始使用 Skaffold 做為 Cloud Deploy 的一部分,包括:

  • 設定 Skaffold 以搭配 Cloud Deploy 推送管道使用
  • 搭配使用 Skaffold 和 Cloud Deploy 與第三方算繪工具,例如 Helm 和 Kustomize
  • (選用) 使用 Skaffold 進行本機開發
  • (選用) 使用 Skaffold 進行持續整合和持續部署 (CI/CD)

為何要使用 Skaffold?

想瞭解 Cloud Deploy 為何使用 Skaffold,以及為何需要管理 Skaffold 設定嗎?快來閱讀相關資源

我熟悉 CI/CD,但目前未使用 Skaffold

Skaffold 是一項開放原始碼的指令列工具,可提高開發人員的工作效率。可自動化調度管理持續開發、持續整合 (CI) 和持續推送軟體更新 (CD)。

Skaffold 透過插入式架構提供宣告式和可攜性設定,讓您在算繪階段使用不同的工具。

建立版本時,Cloud Deploy 會呼叫 Skaffold 來轉譯資訊清單。在部署時,Cloud Deploy 會再次呼叫 Skaffold,將這些資訊清單套用至階段中的每個目標,以部署應用程式。部署完成後,Skaffold 會執行健康狀態檢查,監控目標執行階段是否成功部署。

透過 Skaffold 持續開發

使用 Skaffold 持續開發時,系統會在您變更程式碼時,建構、測試及部署映像檔至叢集 (或 Minikube)。Cloud Code for VS CodeCloud Code for IntelliJ IDE 擴充功能會將 Skaffold 整合至 Visual Studio Code 和 JetBrains IDE,以利持續開發。

使用 Skaffold 持續推送軟體更新

您也可以使用 Skaffold 持續推送軟體更新,並執行建構、部署、算繪和套用步驟。Cloud Deploy 會使用 Skaffold 的算繪和套用功能。如要使用 Cloud Deploy,至少需要有效的 skaffold.yaml 設定檔

您也可以透過 Skaffold 整合第三方資訊清單管理工具,例如 HelmKustomize。以這種方式使用 Skaffold,即可運用這些工具的功能來算繪資訊清單。kubectl 仍是這些資訊清單的部署者

我剛開始將應用程式部署至 Kubernetes

您可以使用 Skaffold 為所有部署作業設定基本資訊清單。然後,您可以使用 Skaffold 的轉譯引擎 (透過 Cloud Deploy),從其中一個基本資訊清單轉譯並部署每個部署作業專屬的資訊清單。

進一步瞭解如何管理資訊清單,包括搭配使用 Skaffold 和 Cloud Deploy 與常見資訊清單範本工具 (例如 Helm 和 Kustomize) 的範例。

使用 Cloud Deploy 的必要條件

如要使用基本的 Cloud Deploy 交付管道,skaffold.yaml 設定檔至少需要下列設定:

  • 所有 skaffold.yaml 設定都需要標題資訊:

    apiVersion: skaffold/v4beta7
    kind: Config
    
  • manifests 節,適用於 GKE、GKE 附加叢集或 Cloud Run,列出所有原始 Kubernetes 資訊清單 (除非您使用資訊清單管理工具,例如 Helm 或 Kustomize)。

    以下是使用原始 Kubernetes 資訊清單的範例:

    manifests:
      rawYaml:
      - deployment.yaml
    

    如果您打算使用 Helm 或 Kustomize 等算繪器算繪資訊清單,請參閱「在 skaffold.yaml 中新增 Helm 支援」和「在 skaffold.yaml 中新增 Kustomize 支援」,瞭解如何設定 Skaffold 使用這些工具。

    如需 Helm 和 Kustomize 範例,請參閱「管理資訊清單

  • deploy 節,其中包含 deploy.kubectl (用於部署至 GKE 或 GKE 連結的叢集),或 deploy.cloudrun (用於部署至 Cloud Run)。

    如果是 GKE 和 GKE 附加叢集:

    deploy:
      kubectl: {}
    

    部署節會部署 manifests 節中提供的應用程式資訊清單。

    Cloud Run 目標:

    deploy:
      cloudrun: {}
    

    部署節會部署資訊清單節中提供的應用程式資訊清單。

如果您使用自訂目標skaffold.yaml 必須包含標頭 (apiVersionkind:),以及自訂動作,自訂目標會使用這些動作 (如果自訂目標類型尚未參照遠端 Skaffold 設定)。

建立 skaffold.yaml 檔案

Cloud Deploy 會使用 Skaffold 算繪及部署應用程式。

每個版本都必須提供至少一個 skaffold.yaml 檔案,用於識別要使用的資訊清單。如需這個檔案的內容指南,請參閱上一節

讓 Cloud Deploy 產生 skaffold.yaml

如果您沒有 skaffold.yaml 檔案,但有單一 Kubernetes 資訊清單或 Cloud Run 服務定義檔,Cloud Deploy 可以為您產生 skaffold.yaml 檔案。

版本發布完成後,系統產生的 Skaffold 檔案會儲存在 Cloud Storage 來源的暫存目錄中。

下列指令包含 --from-k8s-manifest 標記,並傳遞 Kubernetes 資訊清單。Cloud Deploy 會使用資訊清單中的資訊產生 skaffold.yaml,然後用於發布版本。

gcloud deploy releases create  RELEASE_NAME --delivery-pipeline=PIPELINE_NAME --from-k8s-manifest=MANIFEST --region=REGION

如要從 Cloud Run 服務 YAML 產生 skaffold.yaml,請使用相同指令,但將 --from-k8s-manifest 換成 --from-run-manifest

如果同時使用這些旗標和 --skaffold-file 旗標或 --source 旗標,系統會產生錯誤。

使用產生的 skaffold.yaml 檔案

產生的 skaffold.yaml 適用於新手入門、學習和展示 Cloud Deploy。熟悉 Cloud Deploy 後,您可能會希望 Skaffold 設定能區分目標 (使用 Skaffold 設定檔),以用於生產環境工作負載。

使用產生的 skaffold.yaml 檔案做為起點,建立自己的差異化 Skaffold 設定時,請務必使用算繪來源封存檔中的檔案,而非算繪的檔案。如要下載算繪來源,請前往「發行內容詳細資料」頁面的「構件」分頁。

  • 這個產生的 skaffold.yaml 會包含在儲存在 Cloud Storage bucket 中的算繪來源中。

    如要查看這個檔案,請下載 .tar.gz 檔案並解壓縮。

  • 您可以在「目標構件」中找到已算繪的 skaffold.yaml

    在「目標構件」部分中,按一下「查看構件」

    「版本詳細資料」頁面,顯示算繪來源和目標構件

使用 Skaffold 進行本機開發

Skaffold 的優點之一是可用於本機開發和 CI/CD。在 dev 模式中,Skaffold 會監控來源檔案,偵測到變更時,Skaffold 會重建映像檔、重新測試,並將容器重新部署至本機上的 minikube 叢集 (例如)。

以這種方式使用 Skaffold 時,您可以在本機使用與遠端部署相同的指令。

如果您使用 Skaffold 進行本機開發,可以為目標定義個別的 Skaffold 設定檔,以及本機開發的預設部署節。

停止 dev 模式後,Skaffold 會清除叢集中部署的構件。

使用 Skaffold 進行 CI/CD

除了使用 Skaffold 持續在本機建構及部署,您也可以使用 Skaffold 進行 CI/CD。Cloud Deploy 會使用 Skaffold 中的 CI/CD 功能,根據使用 Cloud Build 等 CI 工具建構的容器映像檔,以及 Artifact Registry 等映像檔登錄檔,算繪及套用資訊清單,並將應用程式部署至定義的目標。

轉譯、部署及套用

Skaffold 會將資訊清單的算繪程序與部署作業分開。 Cloud Deploy 會呼叫 skaffold render 轉譯資訊清單,並呼叫 skaffold apply 將資訊清單套用至目標

這樣一來,您就能在設定中擷取應用程式的完整宣告狀態,以便安全且重複地套用 (例如用於回溯)。這項技術也能簡化核准程序。由於系統會在首次推出前轉譯所有目標的資訊清單,因此您可以查看將套用至每個目標的轉譯 YAML。

Cloud Deploy 不支援使用其他部署工具部署應用程式。不過,您可以使用 HelmKustomize 等工具進行算繪。

如要進一步瞭解 Cloud Deploy 如何使用 kubectl 做為部署工具,請參閱「Cloud Deploy 服務架構」。

關於 Skaffold 設定檔

您可以建立個別的 Skaffold 設定檔 (在 skaffold.yamlprofiles: 節中識別)。

將 Skaffold 設定檔與 Cloud Deploy 搭配使用時,您可能會為所有或部分目標建立個別設定檔。例如 devstagingprod 的不同設定檔。

在 Cloud Deploy 中使用 Skaffold 時,設定檔並非必要,但可用於定義目標之間的資訊清單自訂項目,例如為每個目標使用不同的 Kustomize kustomization.yaml 檔案。

skaffold.yaml 中新增 Kustomize 支援

將 Kustomize 設定與 Cloud Deploy/Skaffold 設定整合,包含下列步驟:

  1. 在設定檔中加入 kustomization.yaml 檔案。

    您可以將設定檔儲存在本機目錄或 Cloud Storage 值區中。

  2. skaffold.yaml 檔案中,為每個設定檔建立 deploy 節。

    如果您未使用設定檔,或預設部署設定未與設定檔建立關聯,也可以在任何已定義的設定檔外使用 deploy 節。

    以下是 Skaffold 設定範例,顯示每個設定檔的 deploy 節,並使用名為 my-app 的虛構範例應用程式:

    apiVersion: skaffold/v4beta7
    kind: Config
    build:
      artifacts:
        - image: my-app-web-profiles
          context: my-app-web-profiles
        - image: my-app-application-profiles
          context: my-app-application-profiles
      googleCloudBuild:
        projectId: ${PROJECT_ID}
    profiles:
    - name: local
      manifests:
        kustomize:
          paths:
            - my-app-application-profiles/kubernetes/local
    - name: test
      manifests:
        kustomize:
          paths:
            - my-app-application-profiles/kubernetes/test
    - name: staging
      manifests:
        kustomize:
          paths:
            - my-app-application-profiles/kubernetes/staging
    - name: prod
      manifests:
        kustomize:
          paths:
            - my-app-application-profiles/kubernetes/prod
    deploy:
      kubectl: {}
    

    這裡顯示的 Skaffold 設定檔包含 teststagingprod 目標的個別設定檔。也會顯示本機開發作業的設定檔。 每個設定檔都有 deploy.kustomize 節,其中包含指向該目標所用自訂項位置的路徑。

skaffold.yaml 中新增 Helm 支援

您可以使用 Helm 算繪資訊清單。Cloud Deploy 不會使用 Helm 部署應用程式,且僅支援 kubectl 做為部署工具。

如要使用 Helm,您需要 Helm chart 或多個 chart,並將其儲存在可從 skaffold.yaml 內參照的任何位置。這個位置可以是檔案系統、存放區 (可能與 skaffold.yaml 位於同一位置),或是開放容器倡議 (OCI) 存放區。

如要使用 Helm chart,請將 helm 節新增至 skaffold.yaml 檔案。

apiVersion: skaffold/v4beta7
kind: Config
build:
  artifacts:
  - image: skaffold-helm-image
manifests:
  helm:
    releases:
    - name: skaffold-helm-image
      chartPath: charts
deploy:
  kubectl: {}

skaffold.yaml 參照 會顯示這個 helm 節中需要哪些項目。

不支援的 Skaffold 功能

您無法在 Cloud Deploy 中使用下列 Skaffold 功能:

後續步驟

  • 請前往 Skaffold 網站,瞭解其運作方式和用途。

  • 練習 搭配使用 Cloud Deploy、Kustomize 和 Skaffold 設定檔。

  • 瞭解 Cloud Deploy 如何選擇要使用的工具版本,以及如何判斷目前使用的版本。

  • 瞭解如何搭配使用 Skaffold 設定檔與進階資訊清單管理工具,例如 Helm、Kustomize 和 kpt。