您可以使用 Cloud Deploy 傳遞版本參數,這些值會在資訊清單套用至各個目標之前,提供給資訊清單。這項替換作業會在資訊清單轉譯後完成,是 Cloud Deploy 轉譯作業的最後一個步驟。系統會將值提供給 skaffold.yaml
檔案中所識別的所有資訊清單,這些資訊清單包含對應的預留位置。
您只需在資訊清單中加入預留位置,然後在 Cloud Deploy 提交管道或目標設定中,或在建立版本時設定這些預留位置的值即可。
本文將說明如何達成這項目標。
為何要使用部署參數?
這項功能的常見用途是在平行部署中,為不同的目標套用不同的資訊清單值。不過,如果資訊清單中需要在轉譯後替換鍵/值組合,您可以使用部署參數。
運作方式
以下步驟說明設定部署參數和提供值的一般程序:
請按照這裡的說明設定部署參數化。
包含下列項目:
在資訊清單中加入預留位置,並為每個預留位置加入預設值。
為這些預留位置新增值。
您可以透過三種方式進行這項操作,詳情請參閱這篇文章。
建立發布版本時,系統會轉譯資訊清單。
如果您從範本資訊清單開始,系統現在會為範本變數套用值。如果您從原始資訊清單開始,則該資訊清單會保持不變。這項轉譯作業由 Skaffold 執行。
不過,您可以在資訊清單中加入其他變數,這些變數的值不會在轉譯期間套用。這些是本文件中所述的部署參數。
在建立版本時,所有部署參數都會編譯為字典,用於在套用資訊清單之前替換值。
算繪完成後,Cloud Deploy 會替換部署參數的值。
這些是您在第一步中設定的值。
轉譯程序已將值套用至資訊清單範本,取代部分值,並新增 Cloud Deploy 專用的標籤。不過,這些部署參數的值會在算繪後替換。如要瞭解資訊清單範本和部署參數的差異,請參閱這篇文章。
系統會將資訊清單套用至目標執行階段,以便部署應用程式。
包括在算繪期間替換的值,以及任何部署參數的值
傳遞值的不同方式
您可以透過三種方式提供參數和參數值:
-
您可以在發布管道進程中的某個階段定義中提供參數及其值。參數會傳遞至該階段所代表的目標。如果該階段參照多目標,則系統會將這裡設定的值用於所有子目標。
這個方法可讓您針對所有受影響的目標,在指定管道內替換所有版本的值。為階段定義的參數會識別標籤,而該階段的對應目標必須具有相符的標籤。
-
您可以在目標本身的定義中設定參數及其值。這個方法可讓您為該目標替換所有版本的值。
在指令列中建立版本
您可以在
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 個半形字元。
設定部署參數
本節說明如何設定將套用至 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`.
在管道階段中新增參數
您可以將鍵/值組合新增至發布管道流程的某個階段。這對於平行部署而言十分實用,可用於區分子目標。
請參閱這篇文章的說明,在 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
設定推送管道,針對適用的管道階段加入
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
節中指定標籤,系統會將該值用於階段中的所有目標。
如果您加入了
matchTargetLabels
,也必須在目標上加入標籤,以便進行比對。這樣一來,您就能判斷要將哪個值指派給哪個子目標。目標必須與
values
節中設定的「所有」標籤相符。如果您省略
matchTargetLabels
,則管道上設定的values
會套用至所有子目標。但如果您為同一個參數設定多個值,則發布作業會失敗。
每個資訊清單算繪完成後,Cloud Deploy 會將每個變數的值新增至已算繪的資訊清單。
在目標設定中新增參數
您可以將鍵/值組合加進目標。如果您使用部署參數來區分多個子目標,請在這些子目標上進行設定,而不是在多部署目標上進行設定。
設定 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
。設定目標,納入
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 就會將這些值新增至已轉譯的資訊清單。
在建立版本時傳遞參數
如要將參數和值傳遞至版本,請按照下列步驟操作:
設定 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}
。建立版本時,請在
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
) 的資料表中。
在 Cloud Deploy 主頁面中,按一下包含您要查看的版本的推送管道。
在「Release details」(版本詳細資料) 頁面中,選取「Artifacts」(構件) 分頁標籤。
表格會顯示為此版本設定的所有部署參數,其中一個欄會顯示變數名稱和值,另一個欄則會顯示受影響的目標。
後續步驟
請嘗試快速入門導覽課程:使用部署參數。
進一步瞭解如何使用並行部署功能。