開始在 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 為所有部署作業設定基本資訊清單。接著,您可以透過 Cloud Deploy 使用 Skaffold 的轉譯引擎,從其中一個基礎資訊清單轉譯及部署每個部署專屬資訊清單。

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

如何讓 Cloud Deploy 運作?

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

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

    apiVersion: skaffold/v4beta7
    kind: Config
    
  • manifests 節,適用於 GKE、GKE Enterprise 或 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 Enterprise) 或 deploy.cloudrun (用於部署至 Cloud Run)。

    針對 GKE 和 GKE Enterprise 目標:

    deploy:
      kubectl: {}
    

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

    針對 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 檔案。

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

下列指令包含 --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-run-manifest 而非 --from-k8s-manifest

將這兩個旗標與 --skaffold-file 旗標或 --source 旗標搭配使用會產生錯誤。

使用產生的 skaffold.yaml 檔案

產生的 skaffold.yaml 適合用於 Cloud Deploy 的 onboarding、學習和示範。熟悉 Cloud Deploy 後,如果是實際工作負載,您可能會想要使用 Skaffold 設定檔,讓 Skaffold 設定區分目標。

使用產生的 skaffold.yaml 檔案做為起點,自行建立不同的 Skaffold 設定檔時,請務必使用轉譯來源封存集中的檔案,而非轉譯檔案。您可以在「發布內容詳細資料」頁面的「構件」分頁中下載轉譯來源。

  • 這個產生的 skaffold.yaml 會包含在儲存在 Cloud Storage 值區中的轉譯來源中。

    您可以下載並解壓縮 .tar.gz 檔案,查看這個檔案。

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

    在「Target artifacts」部分中,按一下「View artifacts」

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

使用 Skaffold 進行本機開發

Skaffold 的優點之一,就是您可以用於本機開發和 CI/CD。在 dev 模式中,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 設定檔,並在 profiles: 段落的 skaffold.yaml 中標示。

將 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 節,其路徑會指向要為該目標使用的 kustomization 位置。

skaffold.yaml 新增 Helm 支援

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

如要使用 Helm,您需要將 Helm 資訊套件或資訊套件儲存在 skaffold.yaml 中可參照的任何位置。這個位置可以是檔案系統、存放區 (可能會與 skaffold.yaml 一併提供),或 Open Container Initiative (OCI) 存放區。

如要使用 Helm 圖表,請將 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 功能

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

後續步驟

  • 請造訪 Skaffold 網站,瞭解這項工具的運作方式和功能。

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

  • 瞭解 Cloud Deploy 如何選擇要使用的 Skaffold 版本、Skaffold 版本變更的時間,以及如何判斷目前使用的版本。

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