復原、漸進式推出及流量遷移

Cloud Run 可讓您指定應接收流量的修訂版本,以及修訂版本接收的流量百分比。這項功能可讓您復原至先前的修訂版本、逐步部署修訂版本,以及在多個修訂版本之間拆分流量。本頁面說明如何使用這項功能管理 Cloud Run 修訂版本的流量。

請注意,流量路徑調整不會立即生效。變更修訂版本的流量時,所有正在處理的要求都會繼續完成。在轉換期間,系統不會捨棄進行中的要求,且可能會將要求導向新修訂版本或先前的修訂版本。

流量分配和工作階段相依性

如果您在啟用工作階段相依性的情況下,將流量分配給多個修訂版本,請參閱「工作階段相依性和流量分配」,進一步瞭解工作階段相依性對流量分配的影響。

流量分配的生命週期

如果您在多個修訂版本之間拆分流量,或將流量指派給先前的修訂版本,後續所有部署作業都會使用該流量拆分模式。如要返回只使用最新修訂版本而不拆分流量的狀態,請將所有流量傳送至最新修訂版本

必要的角色

如要取得管理 Cloud Run 服務和修訂版本所需的權限,請要求管理員授予下列 IAM 角色:

  • 如果您管理的是從容器映像檔部署的服務:
  • 如果您要管理從原始碼部署的服務:
    • Cloud Run 原始碼開發人員 (roles/run.sourceDeveloper) 專案
    • 專案的「服務使用情形消費者」(roles/serviceusage.serviceUsageConsumer)
    • 服務身分上的服務帳戶使用者 (roles/iam.serviceAccountUser)
    • 此外,請將專案的 Cloud Run Builder (roles/run.builder) 角色授予 Cloud Build 服務帳戶。建構服務帳戶負責建構服務,預設為 Compute Engine 預設服務帳戶。

如需與 Cloud Run 相關聯的 IAM 角色和權限清單,請參閱「Cloud Run IAM 角色」和「Cloud Run IAM 權限」。如果 Cloud Run 服務與Google Cloud API (例如 Cloud 用戶端程式庫) 介接,請參閱服務身分設定指南。 如要進一步瞭解如何授予角色,請參閱「部署權限」和「管理存取權」。

復原至先前的修訂版本

如要復原為先前的修訂版本,請按照下列步驟操作:

控制台

  1. 前往 Google Cloud 控制台的 Cloud Run「Services」(服務) 頁面:

    前往 Cloud Run

  2. 在服務清單中找出所需服務,然後按一下。

  3. 按一下「修訂版本」分頁標籤,顯示該服務的目前修訂版本清單。

  4. 在修訂版本清單中,按一下要還原的修訂版本右側的省略號圖示:

    manage-traffic

  5. 按一下「管理流量」,顯示管理流量表單:

    1. 在下拉式清單中,選取要復原的先前修訂版本。
    2. 將先前修訂版本的流量百分比設為 100。
    3. 將放送修訂版本的百分比設為 0。
    4. 按一下 [儲存]

gcloud

使用下列指令:

gcloud run services update-traffic SERVICE --to-revisions REVISION=100

  • SERVICE 改為服務名稱。
  • REVISION 替換為要復原的修訂版本名稱。

YAML

  1. 如要建立新服務,請略過這個步驟。 如要更新現有服務,請下載其 YAML 設定

    gcloud run services describe SERVICE --format export > service.yaml
  2. spec 屬性下方,找出並將 traffic 屬性更新為下列值:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
     name: SERVICE
    spec:
    ...
      traffic:
      - revisionName: REVISION
        percent: 100
    

    取代

    • REVISION 替換為要復原的修訂版本名稱。
  3. 使用下列指令,以新設定取代服務:

    gcloud run services replace service.yaml
  4. 等待更新完成:您應該會看到一則訊息,指出您中復原的修訂版本已部署,並提供 0% 的流量。

Terraform

如要瞭解如何套用或移除 Terraform 設定,請參閱「基本 Terraform 指令」。

在 Terraform 設定的 google_cloud_run_v2_service 資源中新增下列項目:

resource "google_cloud_run_v2_service" "default" {
  name     = "my-service"
  location = "us-central1"

  deletion_protection = false # set to true to prevent destruction of the resource

  template {}

  traffic {
    percent = 100
    # This revision needs to already exist
    revision = "green"
    type     = "TRAFFIC_TARGET_ALLOCATION_TYPE_REVISION"

  }
}

逐步推出修訂版本

如要逐步推出新修訂版本,請按照下列步驟操作:

控制台

  1. 前往 Google Cloud 控制台的 Cloud Run「Services」(服務) 頁面:

    前往 Cloud Run

  2. 在服務清單中選取服務。

  3. 按一下「Deploy New Revision」(部署新的修訂版本)

  4. 視需要填寫部署表單,但請務必取消勾選「立即提供這個修訂版本」核取方塊。

  5. 點選「Deploy」(部署)

  6. 按一下「管理流量」

  7. 新修訂版本會列出,但設定的百分比為 0,因此不會處理任何流量。格式:

    1. 將其設為所選百分比,例如 5。請注意,放送版本的百分比會自動減少相同幅度。
    2. 按一下 [儲存]
    3. 重複上述「管理流量」步驟,但要變更百分比,視需要提高新修訂版本的百分比。您不需要重新部署,即可變更流量百分比。

gcloud

如要從容器映像檔部署服務,請按照下列步驟操作:

  1. 部署要逐步推出的修訂版本,並將其設為一開始不接收任何流量:

    • 如要透過原始碼部署服務,請按照下列步驟操作:

      gcloud run deploy --image IMAGE --no-traffic

      IMAGE 替換為您要部署的映像檔。

    • 如要透過原始碼部署服務,請按照下列步驟操作:

      gcloud run deploy SERVICE --source . --no-traffic

      SERVICE 改為您的服務名稱。

  2. 指定要由新修訂版本處理的流量百分比,例如 5%:

    gcloud run services update-traffic SERVICE --to-revisions REVISION=PERCENTAGE
    • SERVICE 改為服務名稱。
    • REVISION 替換為要逐步推出的修訂版本名稱。如要指定最新修訂版本,可以使用 LATEST,例如 LATEST=5
    • PERCENTAGE 替換為要傳送至新修訂版本的流量百分比,例如 5 表示要傳送 5% 的流量。
  3. 如果修訂版本的成效令人滿意,請重複上述update-traffic步驟,但視需要提高百分比值。

YAML

  1. 如要建立新服務,請略過這個步驟。 如要更新現有服務,請下載其 YAML 設定

    gcloud run services describe SERVICE --format export > service.yaml
  2. 對服務進行任何所需的設定變更,並為新修訂版本指定修訂版本名稱:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
     name: SERVICE
    spec:
     template:
       metadata:
         annotations:
         ...
         name: REVISION-NAME
    

    取代

    • REVISION-NAME 改成您要的新修訂版本名稱。
  3. spec 屬性下方,找出並更新 traffic 屬性,讓新修訂版本只處理少量流量:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
     name: SERVICE
    spec:
    ...
      traffic:
      - revisionName: REVISION-NEW
        percent: PERCENT-NEW
      - revisionName: REVISION-FORMER
        percent: PERCENT-FORMER
    

    請注意,百分比加總必須為 100。取代

    • REVISION-NEW 改成您要逐步推出的修訂版本名稱。
    • REVISION-FORMER 改為提供服務的修訂版本名稱。
    • PERCENT-NEW,並指定要傳送至新修訂版本的流量百分比,例如使用 10 將 10% 的流量傳送至該修訂版本。
    • PERCENT-FORMER,並將流量百分比設為要傳送至舊修訂版本的流量百分比
  4. 等待更新完成:系統應會顯示訊息,說明您逐步推出的新修訂版本已部署完成,並開始放送您指定比例的流量。

Terraform

.tf 檔案中新增下列內容,並逐步將流量百分比從先前的修訂版本更新至最新修訂版本。 請注意,每次變更流量都需要執行另一個 terraform apply

resource "google_cloud_run_v2_service" "default" {
  name     = "my-service"
  location = "us-central1"

  deletion_protection = false # set to true to prevent destruction of the resource

  template {
    containers {
      # Image or image tag must be different from previous revision
      image = "us-docker.pkg.dev/cloudrun/container/hello"
    }
  }

  # Define the traffic split for each revision
  # https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/cloud_run_v2_service#traffic
  traffic {
    percent = 100
    # This revision needs to already exist
    revision = "green"
    type     = "TRAFFIC_TARGET_ALLOCATION_TYPE_REVISION"
  }

  traffic {
    # Deploy new revision with 0% traffic
    percent = 0
    type    = "TRAFFIC_TARGET_ALLOCATION_TYPE_LATEST"
  }
}

輸入 terraform apply 來套用變更。

將流量拆分給多個修訂版本

如要將流量拆分給兩個以上的修訂版本,請按照下列步驟操作:

控制台

  1. 前往 Google Cloud 控制台的 Cloud Run「Services」(服務) 頁面:

    前往 Cloud Run

  2. 在服務清單中找出所需服務,然後按一下。

  3. 按一下「管理流量」

  4. 系統會列出目前提供服務的新版本。格式:

    1. 將目前放送的修訂版本百分比設為所選分割。
    2. 使用下拉式清單選取先前的修訂版本,並將其設為所選百分比。
    3. 如要拆分更多修訂版本之間的流量,請按一下「新增修訂版本」,選取修訂版本,然後設定所選拆分的百分比。
    4. 按一下 [儲存]

gcloud

以半形逗號分隔的清單,指定各修訂版本的流量百分比:

gcloud run services update-traffic SERVICE --to-revisions LIST

  • SERVICE 改為服務名稱。
  • LIST 替換為以半形逗號分隔的修訂版本和百分比清單:
    REVISION1=PERCENTAGE1,REVISION2=PERCENTAGE2,REVISIONn=PERCENTAGEx
    例如 hello2-00005-red=25,hello2-00001-bod=25,hello2-00002-nan=50

YAML

  1. 如要建立新服務,請略過這個步驟。 如要更新現有服務,請下載其 YAML 設定

    gcloud run services describe SERVICE --format export > service.yaml
  2. spec 屬性下方,找出並更新 traffic 屬性,讓新修訂版本只處理少量流量:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
     name: SERVICE
    spec:
    ...
      traffic:
      - revisionName: REVISION-A
        percent: PERCENT-A
      - revisionName: REVISION-B
        percent: PERCENT-B
      - revisionName: REVISION-C
        percent: PERCENT-C
    

    請注意,百分比總和必須為 100。取代

    • REVISION-AREVISION-BREVISION-C 您要分配流量的修訂版本。
    • PERCENT-APERCENT-BPERCENT-C,以及相應修訂版本的百分比。
  3. 使用下列指令,以新設定取代服務:

    gcloud run services replace service.yaml
  4. 等待更新完成:您應該會看到訊息,指出您逐步推出的新修訂版本已部署,並提供 5 百分比 (或您使用的任何漸進值) 的流量。

Terraform

在 Terraform 檔案中新增下列內容:

resource "google_cloud_run_v2_service" "default" {
  name     = "my-service"
  location = "us-central1"

  deletion_protection = false # set to true to prevent destruction of the resource

  template {
    containers {
      image = "us-docker.pkg.dev/cloudrun/container/hello"
    }
    revision = "green"
  }

  # Define the traffic split for each revision
  # https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/cloud_run_v2_service#traffic
  traffic {
    percent  = 25
    revision = "green"
    type     = "TRAFFIC_TARGET_ALLOCATION_TYPE_REVISION"
  }

  traffic {
    percent = 75
    # This revision needs to already exist
    revision = "blue"
    type     = "TRAFFIC_TARGET_ALLOCATION_TYPE_REVISION"
  }
}

輸入 terraform apply 來套用變更。

將所有流量傳送至最新修訂版本

部署新修訂版本時,您可以盡快讓這個修訂版本和所有後續版本處理 100% 的流量,並覆寫所有已建立的流量分配:

控制台

  1. 前往 Google Cloud 控制台的 Cloud Run「Services」(服務) 頁面:

    前往 Cloud Run

  2. 在服務清單中找出所需服務,然後按一下。

  3. 按一下「Deploy New Revision」(部署新的修訂版本)

  4. 視需要填寫部署表單,並務必勾選標示為「立即提供這個修訂版本」的核取方塊。這會覆寫所有現有的流量拆分,讓新修訂版本處理 100% 的流量。

  5. 點選「Deploy」(部署)

gcloud

如要將所有流量傳送至最近部署的修訂版本,請執行下列操作:

gcloud run services update-traffic SERVICE --to-latest

SERVICE 改為服務名稱。

YAML

  1. 如要建立新服務,請略過這個步驟。 如要更新現有服務,請下載其 YAML 設定

    gcloud run services describe SERVICE --format export > service.yaml
  2. spec 屬性下方,找出並將 traffic 屬性更新為下列值:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
     name: SERVICE
    spec:
    ...
      traffic:
      - latestRevision: true
        percent: 100
    
  3. 使用下列指令,以新設定取代服務:

    gcloud run services replace service.yaml
  4. 等待更新完成:您應該會看到訊息,指出 (最新) 修訂版本已部署,並放送 100% 的流量。

Terraform

在 Terraform 檔案中新增下列內容:

resource "google_cloud_run_v2_service" "default" {
  name     = "my-service"
  location = "us-central1"

  deletion_protection = false # set to true to prevent destruction of the resource

  template {}

  traffic {
    percent = 100
    type    = "TRAFFIC_TARGET_ALLOCATION_TYPE_LATEST"
  }
}

輸入 terraform apply 來套用變更。

使用標記進行測試、流量遷移和復原

如要避免標記修訂版本產生帳單費用,請使用服務層級最低執行個體,或在不再需要修訂版本時移除標記

這項功能的常見用途是在新服務修訂版本開始處理任何流量前,先進行測試和審查,一般流程如下:

  1. 在開發期間對容器執行整合測試。
  2. 將容器部署到僅用於暫存的 Google Cloud 專案,不放送任何流量,並針對已標記的修訂版本進行測試。
  3. 將其部署至正式環境,但不提供流量,並針對正式環境中標記的修訂版本進行測試。
  4. 將流量遷移至已標記的修訂版本。

部署新的已標記修訂版本

如要將現有服務的新修訂版本部署至正式環境,請按照下列步驟操作:

gcloud

gcloud run deploy myservice --image IMAGE_URL  --no-traffic --tag TAG_NAME

更改項目:

  • IMAGE_URL 改為圖片的網址。
  • TAG_NAME 替換為小寫的代碼名稱。

您可以使用標記在特定網址中直接測試新修訂版本,而不提供流量。網址會以您提供的標記名稱開頭。舉例來說,如果您在服務 myservice 上使用標記名稱 green,您會在網址 https://green---myservice-abcdef.a.run.app 測試已標記的修訂版本

YAML

  1. 如要建立新服務,請略過這個步驟。 如要更新現有服務,請下載其 YAML 設定

    gcloud run services describe SERVICE --format export > service.yaml
  2. traffic 屬性下方,找出並更新與要新增代碼的修訂版本對應的 tag 屬性:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
     name: SERVICE
    spec:
    ...
      traffic:
      - revisionName: REVISION
        percent: 100
      - revisionName: REVISION-A
        tag: TAG-A
      - revisionName: REVISION-B
        tag: TAG-B
      - revisionName: REVISION-C
        tag: TAG-C
    

    更改項目:

    • TAG-ATAG-BTAG-C,並為每個修訂版本加上相關聯的標記。
    • REVISION,並將所有流量傳送至現有修訂版本。
  3. 使用下列指令建立或更新服務:

    gcloud run services replace service.yaml

Terraform

在 Terraform 檔案中新增下列內容,並使用新的 標記,逐步將流量百分比從舊版修訂版本更新至最新版修訂版本。請注意,每次變更流量都需要執行另一個 terraform apply

resource "google_cloud_run_v2_service" "default" {
  name     = "my-service"
  location = "us-central1"

  deletion_protection = false # set to "true" in production

  template {
    containers {
      # image or tag must be different from previous revision
      image = "us-docker.pkg.dev/cloudrun/container/hello"
    }
    revision = "blue"
  }

  # Define the traffic split for each revision
  # https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/cloud_run_v2_service#traffic
  traffic {
    percent = 100
    # This revision needs to already exist
    revision = "green"
    type     = "TRAFFIC_TARGET_ALLOCATION_TYPE_REVISION"
  }

  traffic {
    # Deploy new revision with 0% traffic
    percent  = 0
    revision = "blue"
    tag      = "tag-name"
    type     = "TRAFFIC_TARGET_ALLOCATION_TYPE_REVISION"
  }
}

輸入 terraform apply 來套用變更。

移除標記

如要從修訂版本中移除標記,請按照下列步驟操作:

控制台

  1. 前往 Google Cloud 控制台的 Cloud Run「Services」(服務) 頁面:

    前往 Cloud Run

  2. 在服務清單中選取服務。

  3. 前往所需服務的「修訂版本」部分,然後選取要移除現有標記的修訂版本。

  4. 將指標懸停在「Revision URLs (tags)」(修訂版本網址 (標記)) 欄上方,然後按一下鉛筆圖示:

    tag-delete

  5. 在「修訂版本網址」對話方塊選單中,按一下「垃圾桶」圖示,移除修訂版本中使用的現有代碼。

  6. 按一下 [儲存]

gcloud

如要移除修訂版本標記,請按照下列步驟操作:

gcloud run services update-traffic SERVICE --remove-tags TAG_NAME

取代

  • TAG_NAME,並填入要將流量遷移至的標記名稱
  • SERVICE 替換為要移除代碼的服務名稱

YAML

  1. 如要建立新服務,請略過這個步驟。 如要更新現有服務,請下載其 YAML 設定

    gcloud run services describe SERVICE --format export > service.yaml
  2. 視需要變更服務設定。

  3. spec 屬性下方,找出並移除已標記修訂版本的 tag 屬性:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
     name: SERVICE
    spec:
    ...
      traffic:
      - revisionName: REVISION
        tag: TAG_NAME
        percent: PERCENT-NEW
    
  4. 使用下列指令,以新設定取代服務:

    gcloud run services replace service.yaml

Terraform

在 Terraform 檔案中新增下列內容:

resource "google_cloud_run_v2_service" "default" {
  name     = "my-service"
  location = "us-central1"

  deletion_protection = false # set to true to prevent destruction of the resource

  template {}

  # Define the traffic split for each revision
  # https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/cloud_run_v2_service#traffic
  traffic {
    percent = 100
    # This revision needs to already exist
    revision = "green"
    type     = "TRAFFIC_TARGET_ALLOCATION_TYPE_REVISION"
  }

  traffic {
    # No tags for this revision
    # Keep revision at 0% traffic
    percent = 0
    # This revision needs to already exist
    revision = "blue"
    type     = "TRAFFIC_TARGET_ALLOCATION_TYPE_REVISION"
  }
}

輸入 terraform apply 來套用變更。

將流量遷移至已標記的修訂版本

確認新修訂版本運作正常後,您可以使用 Google Cloud 控制台、Google Cloud CLI 指令列、Terraform 或 YAML 檔案,開始將流量遷移至新版本:

控制台

  1. 前往 Google Cloud 控制台的 Cloud Run「Services」(服務) 頁面:

    前往 Cloud Run

  2. 在服務清單中找出所需服務,然後按一下:

  3. 選取要將流量傳送至哪個已標記的修訂版本:

    manage-traffic

  4. 按一下「管理流量」

  5. 找出已標記的修訂版本名稱:該名稱會列出,但設定的百分比為 0,表示目前未處理任何流量。在「Manage traffic」(管理流量) 表單中:

    1. 將其設為所需百分比,例如 5。請注意,目前放送版本的百分比會自動減少相同幅度。
    2. 按一下 [儲存]
    3. 視需要重複上述「管理流量」步驟,但要變更百分比,並視需要提高已標記修訂版本的百分比。您不需要重新部署,即可變更流量百分比。

gcloud

如要將流量遷移至特定修訂版本標記,請按照下列步驟操作:

gcloud run services update-traffic myservice --to-tags TAG_NAME=TRAFFIC_PERCENT

取代

  • TAG_NAME,並填入要將流量遷移至的標記名稱
  • TRAFFIC_PERCENT,並指定要由標記修訂版本放送的流量百分比,例如 1

YAML

  1. 如要建立新服務,請略過這個步驟。 如要更新現有服務,請下載其 YAML 設定

    gcloud run services describe SERVICE --format export > service.yaml
  2. 對服務進行任何選取的設定變更。

  3. spec 屬性下方,找出並更新已標記修訂版本的 traffic 屬性,讓已標記的修訂版本只放送少量流量:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
     name: SERVICE
    spec:
    ...
      traffic:
      - revisionName: REVISION
        tag: TAG_NAME
        percent: PERCENT-NEW
      - revisionName: REVISION-FORMER
        percent: PERCENT-FORMER
    

    請注意,百分比加總必須為 100。取代

    • REVISION 替換為已加上標記的修訂版本名稱。
    • TAG_NAME 換成您要逐步推出的標記名稱。
    • PERCENT-NEW,並指定要傳送至已標記修訂版本的流量百分比,例如使用 10 將 10% 的流量傳送至該修訂版本。
    • REVISION-FORMER 改為目前放送中修訂版本的名稱。
    • PERCENT-FORMER,並將流量百分比設為要傳送至舊修訂版本的流量百分比
  4. 使用下列指令,以新設定取代服務:

    gcloud run services replace service.yaml
  5. 等待更新完成:系統應會顯示訊息,說明您逐步推出的新修訂版本已部署完成,並開始放送您指定比例的流量。

Terraform

請將以下內容新增到您的 .tf 檔案中:

resource "google_cloud_run_v2_service" "default" {
  name     = "my-service"
  location = "us-central1"

  deletion_protection = false # set to true to prevent destruction of the resource

  template {}

  # Define the traffic split for each revision
  # https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/cloud_run_v2_service#traffic
  traffic {
    # Update revision to 50% traffic
    percent = 50
    # This revision needs to already exist
    revision = "green"
    type     = "TRAFFIC_TARGET_ALLOCATION_TYPE_REVISION"
  }

  traffic {
    # Update tag to 50% traffic
    percent = 50
    # This tag needs to already exist
    tag = "tag-name"
  }
}

視需要花費數小時或數天,逐步從一個標記更新至另一個標記,並視需要提高標記修訂版本的百分比。

每次變更後,請輸入 terraform apply 來套用變更。

後續步驟