回滚、逐步发布和流量迁移

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. 点击“修订版本”标签页,以显示该服务的当前修订版本列表。

  4. 在修订版本列表中,点击要回滚的修订版本右侧的省略号图标:

    管理流量

  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 命令

请将以下内容添加到 .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
    # This revision needs to already exist
    revision = "green"
    type     = "TRAFFIC_TARGET_ALLOCATION_TYPE_REVISION"

  }
}

逐步推出修订版本

要逐步发布新的修订版本,请按下述步骤操作:

控制台

  1. 在 Google Cloud 控制台中,前往 Cloud Run:

    转到 Cloud Run

  2. 在服务列表中选择一项服务。

  3. 点击部署新的修订版本

  4. 根据需要填写部署表单,但请务必取消选中“立即提供此修订版本”复选框。

  5. 点击部署

  6. 点击管理流量

  7. 系统会列出新修订版本,但百分比设置为 0:它当前未处理任何流量。在此表单中执行以下操作:

    1. 将其设置为所需的百分比,例如 5。请注意,当前提供版本的百分比会自动减少相同的数量。
    2. 点击保存
    3. 重复执行这些“管理流量”步骤,但采用更改后的百分比,并根据需要提高新修订版本的百分比。您无需重新部署即可更改流量百分比。

gcloud

  1. 部署要逐步发布的修订版本,最初将其设置为不接收流量:

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

    IMAGE 替换为您正在部署的映像。

  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 以应用更改。

将所有流量发送到最新修订版本

部署新修订版本时,您可以让此修订版本及所有今后的修订版本尽快处理所有流量,并替换任何已设定的流量拆分:

控制台

  1. 在 Google Cloud 控制台中,前往 Cloud Run:

    转到 Cloud Run

  2. 在服务列表中找到服务,然后点击该服务。

  3. 点击部署新的修订版本

  4. 根据需要填写部署表单,并确保已选中“立即提供此修订版本”复选框。这将会替换任何现有的流量拆分,并且新修订版本会处理全部流量。

  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

请将以下内容添加到 .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 替换为小写标记名称

该标记允许您直接测试特定网址处的新修订版本,而无需处理流量。网址以您提供的标记名称开头:例如,如果您在服务 myservice 中使用标记名称 green,则应测试网址 https://green---myservice-abcdef.a.run.app 处的标记修订版本

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. 将鼠标悬停在修订版本网址(标记)列上,然后点击铅笔图标,如下所示。

    标记删除

  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. 选择标记的修订版本作为流量的发送目标:

    管理流量

  4. 点击管理流量

  5. 找到标记的修订版本名称:系统会列出新修订版本,但百分比设置为 0:它当前未处理任何流量。在“管理流量”* 表单中:

    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 即可应用。

后续步骤