將參數傳遞至部署作業

您可以使用 Cloud Deploy 傳遞版本參數,這些值會在資訊清單套用至各個目標之前,提供給資訊清單。這項替換作業會在資訊清單轉譯完成,是 Cloud Deploy 轉譯作業的最後一個步驟。系統會將值提供給 skaffold.yaml 檔案中所識別的所有資訊清單,這些資訊清單包含對應的預留位置。

您只需在資訊清單中加入預留位置,然後在 Cloud Deploy 提交管道或目標設定中,或在建立版本時設定這些預留位置的值即可。

本文將說明如何達成這項目標。

為何要使用部署參數?

這項功能的常見用途是在平行部署中,為不同的目標套用不同的資訊清單值。不過,如果資訊清單中需要在轉譯後替換鍵/值組合,您可以使用部署參數。

運作方式

以下步驟說明設定部署參數和提供值的一般程序:

  1. 請按照這裡的說明設定部署參數化。

    包含下列項目:

    • 在資訊清單中加入預留位置,並為每個預留位置加入預設值。

    • 為這些預留位置新增值。

      您可以透過三種方式進行這項操作,詳情請參閱這篇文章

  2. 建立發布版本時,系統會轉譯資訊清單。

    如果您從範本資訊清單開始,系統現在會為範本變數套用值。如果您從原始資訊清單開始,則該資訊清單會保持不變。這項轉譯作業由 Skaffold 執行。

    不過,您可以在資訊清單中加入其他變數,這些變數的值不會在轉譯期間套用。這些是本文件中所述的部署參數。

    在建立版本時,所有部署參數都會編譯為字典,用於在套用資訊清單之前替換值。

  3. 算繪完成後,Cloud Deploy 會替換部署參數的值。

    這些是您在第一步中設定的值。

    轉譯程序已將值套用至資訊清單範本,取代部分值,並新增 Cloud Deploy 專用的標籤。不過,這些部署參數的值會在算繪後替換。如要瞭解資訊清單範本和部署參數的差異,請參閱這篇文章

  4. 系統會將資訊清單套用至目標執行階段,以便部署應用程式。

    包括在算繪期間替換的值,以及任何部署參數的值

傳遞值的不同方式

您可以透過三種方式提供參數和參數值:

  • 在推送管道定義中

    您可以在發布管道進程中的某個階段定義中提供參數及其值。參數會傳遞至該階段所代表的目標。如果該階段參照多目標,則系統會將這裡設定的值用於所有子目標。

    這個方法可讓您針對所有受影響的目標,在指定管道內替換所有版本的值。為階段定義的參數會識別標籤,而該階段的對應目標必須具有相符的標籤。

  • 在目標定義中

    您可以在目標本身的定義中設定參數及其值。這個方法可讓您為該目標替換所有版本的值。

  • 在指令列中建立版本

    您可以在 gcloud deploy releases create 指令上使用 --deploy-parameters 旗標加入參數及其值。

    這個方法可讓您在發布建立期間取代值,並將該值套用至所有受影響目標的資訊清單。

如要進一步瞭解這些設定,請參閱這篇文章

我可以使用多種方法嗎?

是的,您可以在管道階段、目標設定檔和指令列中加入部署參數。結果是所有參數都會接受並新增至字典。不過,如果特定參數在多個位置傳遞,但值不同,gcloud deploy releases create 指令就會失敗並顯示錯誤訊息。

與資訊清單範本有何不同

本文所述的部署參數與範本資訊清單中的預留位置不同,後者使用語法。不過,如果您想知道為何需要部署參數,而非只使用範本資訊清單的標準技巧,請參閱下表,瞭解兩者的不同用途:

做法 換人時間 套用對象
資訊清單範本 算繪階段 特定版本;特定目標
在指令列上 後製 特定版本;所有目標
在推送管道上 後製 所有版本;特定目標 (依標籤)
達標 後製 所有版本;特定目標

本文件僅說明部署參數 (在指令列、管道和目標上),不涵蓋範本資訊清單

限制

  • 每個參數類型最多可建立 25 個參數。

  • 子目標還可以從父項多部署目標繼承最多 25 個參數,目標上最多可有 100 個參數,包括在管道階段設定的參數。

  • 鍵名稱長度上限為 63 個半形字元,並符合下列規則:

    ^[a-zA-Z0-9]([-A-Za-z0-9_.]{0,61}[a-zA-Z0-9])?$
    

    唯一例外狀況是,如果您在自訂目標中使用部署參數做為環境變數,則必須在關鍵字 customTarget 和變數名稱 (customTarget/VAR_NAME) 之間使用斜線。如要瞭解支援的語法,請參閱必要的輸入和輸出

  • CLOUD_DEPLOY_ 是保留的前置字元,無法用於鍵名。

  • 您無法將兩個名稱相同的鍵套用至相同的目標。

  • 值可以空白,但長度上限為 512 個半形字元。

  • 部署參數預留位置無法用於Helm 設定值,但必須透過慣例傳遞

設定部署參數

本節說明如何設定將套用至 Kubernetes 資訊清單、Cloud Run 服務或 Helm 範本的部署參數值。

除了設定這些鍵/值組合之外,您還需要在資訊清單中新增預留位置或預留位置,如本節所述。

在資訊清單中新增預留位置

在 Kubernetes 資訊清單 (適用於 GKE) 或服務 YAML (適用於 Cloud Run) 中,您可以為要替換的任何值新增預留位置。

語法

如果版本未使用 Helm 轉譯器搭配 Skaffold,請使用下列語法設定預留位置:

[PROPERTY]: [DEFAULT_VALUE] # from-param: ${VAR_NAME}

在這個行中...

  • PROPERTY:

    是 Kubernetes 資訊清單或 Cloud Run 服務 YAML 中的設定屬性。

  • DEFAULT_VALUE

    如果在指令列或管道或目標設定中,沒有為此屬性提供值,則會使用這個值。預設值為必要值,但可以是空字串 ("")。

  • # from-param:

    使用註解字元來設定 Cloud Deploy deploy-parameters 指示詞,而 from-param: 會告訴 Cloud Deploy 後面有 deploy-parameters 預留位置。

  • ${VAR_NAME}

    是預留位置,用於替換 這個值必須與發布管道或目標設定中提供的鍵/值組合鍵相符,或是在發布建立時相符。

您也可以在單一行中使用多個參數,並將參數用於較長字串的一部分,例如:

image: my-image # from-param: ${artifactRegion}-docker.pkg.dev/my-project/my-repo/my-image@sha256:${imageSha}

這些參數可來自多個來源。在上述範例中,${artifactRegion} 可能會在目標或發布管道階段定義,而 ${imageSha} 則會在版本建立時從指令列取得。

Helm 資訊套件值的參數

如果您要轉譯可接受設定值的 Helm 圖表,並且想要使用部署參數設定這些值,則部署參數的名稱必須與要設定的 Helm 設定值相符。所有部署參數會在轉譯時以 --set 引數的形式傳遞至 Helm,且不需要修改 skaffold.yaml

舉例來說,如果您的 skaffold.yaml 正在安裝 Helm 圖表,該圖表會使用 webserver.port 的設定參數,指定網路伺服器的啟動通訊埠,而您想要透過部署參數動態設定這個通訊埠,就必須建立名為 webserver.port 的部署參數,並設定網路伺服器通訊埠的值。

因此,如果您不僅在 skaffold.yaml 中參照 Helm 範本,也要撰寫這些範本,就可以在 Helm 範本中使用 {{ .Values.VAR_NAME }}標準 Helm 變數語法

舉例來說,如果我們已設定 webserver.port 的部署參數,就可以像這樣使用:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: webserver
spec:
  replicas: 3
  selector:
    matchLabels:
      app: webserver
  template:
    metadata:
      labels:
        app: webserver
    spec:
      containers:
      - name: webserver
        image: gcr.io/example/webserver:latest
        ports:
        - containerPort: {{ .Values.webserver.port }} # replaced by deploy parameter `webserver.port`.
          name: web
        env:
        - name: WEBSERVER_PORT
          value: {{ .Values.webserver.port }} # replaced by deploy parameter `webserver.port`.

在管道階段中新增參數

您可以將鍵/值組合新增至發布管道流程的某個階段。這對於平行部署而言十分實用,可用於區分子目標。

  1. 請參閱這篇文章的說明,在 Kubernetes 資訊清單或 Cloud Run 服務中新增預留位置。

    範例如下:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
     name: nginx-deployment
     labels:
       app: nginx
    spec:
     replicas: 1 # from-param: ${deploy_replicas}
     selector:
       matchLabels:
         app: nginx
     template:
       metadata:
         labels:
           app: nginx
       spec:
         containers:
         - name: nginx
           image: nginx:1.14.2
           ports:
           - containerPort: 80
    
  2. 設定推送管道,針對適用的管道階段加入 deployParameters

    以下 YAML 是管道階段的設定,其目標為多部署目標,在本例中,它有兩個子目標:

    serialPipeline:
     stages:
       - targetId: dev
         profiles: []
       - targetId: prod  # multi-target
         profiles: []
         deployParameters:
           - values:
               deploy_replicas: 1
               log_level: "NOTICE"
             matchTargetLabels: # optional, applies to all resources if unspecified; AND'd
               my-app: "post-render-config-1"
           - values:
               deploy_replicas: 2
               log_level: "WARNING"
             matchTargetLabels: # optional, applies to all resources if unspecified; AND'd
               my-app: "post-render-config-2"
    

    在這個提交管道設定中,deployParameters 節包含兩個 values,每個節都包含下列項目:

    • 變數名稱,與您在資訊清單中設定的變數相同

    • 該變數的值

    • 一或多個標籤 (選用),用於比對特定目標的標籤

      如果您未在 matchTargetLabels 節中指定標籤,系統會將該值用於階段中的所有目標。

  3. 如果您加入了 matchTargetLabels,也必須在目標上加入標籤,以便進行比對。這樣一來,您就能判斷要將哪個值指派給哪個子目標。

    目標必須與 values 節中設定的「所有」標籤相符。

    如果您省略 matchTargetLabels,則管道上設定的 values 會套用至所有子目標。但如果您為同一個參數設定多個值,則發布作業會失敗。

每個資訊清單算繪完成後,Cloud Deploy 會將每個變數的值新增至已算繪的資訊清單。

在目標設定中新增參數

您可以將鍵/值組合加進目標。如果您使用部署參數來區分多個子目標,請在這些子目標上進行設定,而不是在多部署目標上進行設定。

  1. 設定 Kubernetes 資訊清單或 Cloud Run 服務定義,使用參數取代您要在部署時設定的值。

    範例如下:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
     name: nginx-deployment
     labels:
       app: nginx
    spec:
     selector:
       matchLabels:
         app: nginx
     template:
       metadata:
         labels:
           app: nginx
       spec:
         containers:
         - name: nginx
           image: nginx:1.14.2
           env:
           - name: envvar1
             value: example1 # from-param: ${application_env1}
           - name: envvar2
             value: example2 # from-param: ${application_env2}
    

    在這個資訊清單中,參數 envvar1 的預設值為 example1,而 envvar2 的預設值為 example2

  2. 設定目標,納入 deployParameters

    針對要納入的每個參數,請指出下列資訊:

    • 鍵名稱,與您在資訊清單中設定的鍵 (變數) 相同。

    • 該鍵的值。如果您沒有提供值,系統會使用資訊清單中設定的預設值。

    以下 YAML 是兩個目標的設定。每個目標都包含一個設定值的 deployParameters 節。每個目標也包含標籤,可與在管道階段設定的部署參數進行比對。

    apiVersion: deploy.cloud.google.com/v1beta1
    kind: Target
    metadata:
      name: prod1
      labels:
        my-app: "post-render-config-1"
    description: development cluster
    deployParameters:
      application_env1: "newValue1"
    ---
    
    apiVersion: deploy.cloud.google.com/v1beta1
    kind: target
    metadata:
      name: prod2
      labels:
        my-app: "post-render-config-2"
    description: development cluster
    deployParameters:
      application_env1: "newValue2"
    

建立版本後,但在轉譯資訊清單之後,如果資訊清單包含相關聯的鍵,Cloud Deploy 就會將這些值新增至已轉譯的資訊清單。

在建立版本時傳遞參數

如要將參數和值傳遞至版本,請按照下列步驟操作:

  1. 設定 Kubernetes 資訊清單或 Cloud Run 服務定義,使用參數取代您要在部署時設定的值。

    範例如下:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
     name: nginx-deployment
     labels:
       app: nginx
    spec:
     selector:
       matchLabels:
         app: nginx
     template:
       metadata:
         labels:
           app: nginx
       annotations:
         commit: defaultShaValue # from-param: ${git-sha}
       spec:
         containers:
         - name: nginx
           image: nginx:1.14.2
    

    在這個範例中,提交 SHA 會設為名為 ${git-sha} 的變數。這個值會在建立版本時傳遞,使用 --deploy-parameters= 選項,如下一個步驟所示。

    這個變數的語法為 $ 加上括號中的變數名稱。在本範例中為 ${git-sha}

  2. 建立版本時,請在 gcloud deploy releases create 指令中加入 --deploy-parameters 選項。

    --deploy-parameters 會採用以半形逗號分隔的鍵/值組合清單,其中鍵是您新增至資訊清單的預留位置。

    指令如下所示:

    gcloud deploy releases create test-release-001 \
    --project=my-example-project \
    --region=us-central1 \
    --delivery-pipeline=my-params-demo-app-1 \
    --images=my-app-image=gcr.io/google-containers/nginx@sha256:f49a843c290594dcf4d193535d1f4ba8af7d56cea2cf79d1e9554f077f1e7aaa \
    --deploy-parameters="git-sha=f787cac"
    
    

建立版本後,但在轉譯資訊清單之後,如果轉譯的資訊清單包含相關聯的鍵,Cloud Deploy 就會為其提供值。

部署含有自訂目標的參數

您可以在自訂目標中使用任何部署參數做為環境變數。請使用為自訂目標指定的語法

用於自訂目標的參數可設為以 customTarget/ 開頭,例如 customTarget/vertexAIModel。如果您使用這個前置字串,請在將部署參數做為環境變數參照時,使用下列語法:

CLOUD_DEPLOY_customTarget_[VAR_NAME]

其中 VAR_NAME部署參數名稱中斜線後面的名稱。舉例來說,如果您定義名為 customTarget/vertexAIModel 的部署參數,請以 CLOUD_DEPLOY_customTarget_vertexAIModel 的形式參照該參數。

使用部署掛鉤部署參數

您可以在部署掛鉤中使用任何部署參數做為環境變數。

部署參數與部署驗證

您可以在部署驗證中,將任何部署參數做為環境變數使用。

查看版本的所有參數

您可以查看為特定版本設定的參數。這些資訊會顯示在「Release details」頁面和指令列 (gcloud deploy releases describe) 的資料表中。

  1. 在 Cloud Deploy 主頁面中,按一下包含您要查看的版本的推送管道。

  2. 在「Release details」(版本詳細資料) 頁面中,選取「Artifacts」(構件) 分頁標籤。

表格會顯示為此版本設定的所有部署參數,其中一個欄會顯示變數名稱和值,另一個欄則會顯示受影響的目標。

在 Google Cloud 控制台顯示的部署參數和值

後續步驟