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

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

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

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

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

流量拆分的生命週期

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

必要的角色

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

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

復原至先前的修訂版本

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

控制台

  1. 在 Cloud de Confiance by S3NS 控制台中,前往 Cloud Run 的「Services」(服務) 頁面:

    前往 Cloud Run。

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

  3. 按一下「Revision history」(修訂版本記錄) 分頁標籤,即可查看該服務目前的修訂版本清單。

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

  5. 按一下「管理流量」,即可顯示流量管理選項。

  6. 選取「將所有流量傳送至單一修訂版本」,然後從下拉式選單中選取修訂版本。

  7. 按一下 [儲存]。

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. 前往 Cloud de Confiance by S3NS 控制台的 Cloud Run「Services」(服務) 頁面:

    前往 Cloud Run。

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

  3. 視需要設定服務。

  4. 按一下「查看差異並重新部署」。

  5. 請確認您未選取「立即提供這個修訂版本」。

  6. 按一下「部署變更」。

  7. 按一下「修訂版本記錄」分頁標籤。如果未列出新的修訂版本,請按一下重新整理按鈕。

  8. 在修訂版本清單中,按一下要推出修訂版本右側的省略號圖示。

  9. 按一下「管理流量」,即可顯示流量管理選項。

  10. 按一下「將流量拆分給多個修訂版本」。

  11. 選取要分配流量的修訂版本,以及每個修訂版本的流量百分比。

  12. 按一下 [儲存]。

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. 在 Cloud de Confiance by S3NS 控制台中,前往 Cloud Run 的「Services」(服務) 頁面:

    前往 Cloud Run。

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

  3. 點選「修訂版本記錄」分頁標籤。

  4. 按一下「管理流量」。

  5. 系統會列出目前提供服務的新修訂版本。在表單中:

    1. 將目前放送的修訂版本百分比設為所選分割。
    2. 使用清單選取先前的修訂版本,並將其設為所選百分比分割。
    3. 如要拆分更多修訂版本之間的流量,請按一下「Add Revision」(新增修訂版本),選取修訂版本,然後設定所選拆分方式的百分比。
    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-A、REVISION-B、REVISION-C 替換成您要分配流量的修訂版本。
    • PERCENT-A、PERCENT-B、PERCENT-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. 在 Cloud de Confiance by S3NS 控制台中,前往 Cloud Run 的「Services」(服務) 頁面:

    前往 Cloud Run。

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

  3. 設定服務,然後按一下「查看差異並重新部署」。

  4. 請務必選取標示為「立即提供這個修訂版本」的核取方塊。這項操作會覆寫現有的流量分配設定,讓新修訂版本提供 100% 的流量。

  5. 按一下「部署變更」。

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. 將容器部署至僅用於測試環境的 Cloud de Confiance by S3NS 專案,不提供流量,並針對標記的修訂版本進行測試。
  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.s3nsrun.fr 測試標記的修訂版本

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-A、TAG-B、TAG-C,並附上與各修訂版本相關聯的標記。
    • 將 REVISION 替換為現有修訂版本的名稱,您要將所有流量傳送至該版本。
  3. 使用下列指令建立或更新服務:

    gcloud run services replace service.yaml

    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. 前往 Cloud de Confiance by S3NS 控制台的 Cloud Run「Services」(服務) 頁面:

    前往 Cloud Run。

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

  3. 前往「修訂版本記錄」分頁。

  4. 找出要刪除的代碼,然後按一下旁邊的「管理修訂版本代碼」圖示。

  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 套用變更。

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

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

控制台

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

    前往 Cloud Run。

  2. 在服務清單中找到該服務,然後按一下。

  3. 選取要接收流量的標記修訂版本。

  4. 按一下「管理流量」。

  5. 如要讓修訂版本接收 100% 的流量,請按一下「將所有流量傳送至單一修訂版本」;如要將流量分配給多個修訂版本,請按一下「將流量拆分給多個修訂版本」。

  6. 從選單中選取修訂版本,並指定流量百分比 (如適用)。

  7. 按一下 [儲存]。您不需要重新部署,即可變更流量百分比。

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 來套用變更。

後續步驟