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

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

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

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

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

流量分配的生命週期

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

必要的角色

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

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

復原至先前的修訂版本

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

控制台

  1. 前往 Google Cloud 控制台的 Cloud Run:

    前往 Cloud Run

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

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

  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. 等待更新完成:您應該會看到一則訊息,指出要復原的修訂版本 from 已部署,並處理 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:

    前往 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:

    前往 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

請將以下內容新增到您的 .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 {
    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:

    前往 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

請將以下內容新增到您的 .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 {}

  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 替換為小寫的代碼名稱。
  • 如要透過原始碼部署服務,請按照下列步驟操作:

    gcloud run deploy myservice --source . --no-traffic --tag TAG_NAME

    請將 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

.tf 檔案中加入下列項目,然後使用新的標記,逐步將流量百分比從舊版修訂內容更新至最新版修訂內容。 請注意,每次流量變更都需要執行另一個 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:

    前往 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

請將以下內容新增到您的 .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 {
    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 控制台、gcloud 指令列、Terraform 或 YAML 檔案,開始將流量遷移至新版本:

控制台

  1. 前往 Google Cloud 控制台的 Cloud Run:

    前往 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 即可套用。

後續步驟