使用 Cloud Deploy 時,您可以傳遞發布作業的參數,這些值會提供給資訊清單,然後再將資訊清單套用至各自的目標。這項替換作業會在資訊清單rendered後執行,是 Cloud Deploy 轉譯作業的最後一個步驟。系統會將值提供給 skaffold.yaml
檔案中所有含有對應預留位置的資訊清單。
您只需要在資訊清單中加入預留位置,並在 Cloud Deploy 交付管道或目標設定中,或是在建立版本時,設定這些預留位置的值即可。
本文將說明如何達成這個目標。
為何要使用部署參數?
這項功能通常用於在平行部署中,為不同目標套用不同的資訊清單值。不過,如果資訊清單中需要轉譯後鍵/值組合替換,您可以使用部署參數。
運作方式
下列步驟說明設定部署參數和提供值的一般程序:
如這裡所述,設定部署參數化。
包含下列項目:
在資訊清單中加入預留位置,包括每個預留位置的預設值。
為這些預留位置新增值。
您可以透過三種方式進行這項操作,詳情請參閱這篇文章。
建立版本時,系統會rendered資訊清單。
如果您從範本資訊清單開始,系統現在會套用範本變數的值。如果從原始資訊清單開始,則不會有任何變更。這項算繪作業由 Skaffold 執行。
不過,您可以在資訊清單中加入其他變數,這些變數的值不會在算繪時套用。這些是本文所述的部署參數。
建立發布版本時,所有部署參數都會編譯成字典,用於在套用資訊清單前替換值。
完成算繪後,Cloud Deploy 會替換部署參數的值。
這些是您在第一個步驟中設定的值。
算繪程序已將值套用至資訊清單範本、取代部分值,並新增 Cloud Deploy 專屬標籤。但這些部署參數的值會在算繪後替換。如要瞭解資訊清單範本和部署參數之間的差異,請參閱這篇文章。
資訊清單會套用至目標執行階段,以部署應用程式。
包括在算繪時替換的值,以及任何部署參數的值
傳遞值的不同方式
您可以透過下列三種方式提供參數和參數值:
-
您可以在傳送管道進度的階段定義中提供參數及其值。參數會傳遞至該階段代表的目標。如果該階段參照多重目標,系統會將這裡設定的值用於所有子目標。
這個方法可為指定管道中的所有發行內容,以及所有受影響的目標,取代特定值。為階段定義的參數會識別標籤,而該階段的對應目標必須有相符的標籤。
-
您可以在目標本身的定義中設定參數及其值。這個方法可讓您為所有發行內容替換該目標的值。
在指令列中建立版本時
使用
gcloud deploy releases create
指令的--deploy-parameters
旗標,加入參數和參數值。這個方法可讓您在建立發布內容時替換值,並將該值套用至所有受影響目標的資訊清單。
如要進一步瞭解這些設定,請參閱這篇文章。
我可以使用多種方法嗎?
可以,您可以在管道階段、目標設定和指令列中加入部署參數。結果是所有參數都會接受並新增至字典。不過,如果特定參數在多個位置傳遞,但值不同,gcloud deploy releases
create
指令就會失敗並顯示錯誤。
這與資訊清單範本有何不同
如本文所述,部署參數與範本資訊清單中的預留位置不同,兩者以語法區分。不過,您可能會想知道為何需要部署參數,而不是只使用範本資訊清單的標準技術。下表說明瞭不同用途:
做法 | 換人時間 | 套用對象 |
---|---|---|
資訊清單範本 | 轉譯階段 | 特定版本;特定目標 |
使用指令列 | 顯示之後 | 特定版本;所有目標 |
在推送管道中 | 顯示之後 | 所有發行內容;特定目標 (依標籤) |
在目標範圍內 | 顯示之後 | 所有發行內容;特定目標 |
本文僅說明部署參數 (位於指令列、管道和目標),而非範本化資訊清單。
限制
每種參數類型最多可建立 50 個參數。
子目標最多還可從父項多部署目標繼承 50 個參數,目標最多可有 200 個參數,包括在管道階段設定的參數。
金鑰名稱長度不得超過 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
指令,並告知 Cloud Deploy 後方有deploy-parameters
預留位置。from-param:
${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"
在這個推送 pipeline 設定中,
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
是 deploy 參數名稱中斜線後方的名稱。舉例來說,如果您定義名為 customTarget/vertexAIModel
的部署參數,請以 CLOUD_DEPLOY_customTarget_vertexAIModel
參照該參數。
使用部署掛鉤部署參數
您可以在部署掛鉤中使用任何部署參數做為環境變數。
使用部署驗證功能部署參數
您可以在部署驗證中,將任何部署參數做為環境變數使用。
查看版本的全部參數
您可以查看為特定發行內容設定的參數。這些資訊會顯示在「版本詳細資料」頁面的表格中,以及指令列 (gcloud deploy releases describe
)。
在 Cloud Deploy 主頁面中,按一下包含要查看版本的推送管道。
在「發布詳細資料」頁面中,選取「構件」分頁標籤。
表格會顯示為這個版本設定的所有部署參數,其中一個資料欄會列出變數名稱和值,另一個資料欄則會列出受影響的目標。
後續步驟
請嘗試快速入門導覽課程:使用部署參數。
進一步瞭解如何使用平行部署。