Azure 容器应用中的流量拆分

默认情况下,在启用入口后,所有流量将路由到最新部署的修订版。 在容器应用中启用多修订版模式后,可以在活动修订版之间拆分传入流量。

流量拆分有助于测试对容器应用所做的更新。 可以使用流量拆分在蓝绿部署中逐步地分阶段部署新修订版。

流量拆分基于路由到每个修订版的流量的权重(百分比)。 所有流量拆分规则的总权重必须等于 100%。 可以按修订版名称或修订版标签指定修订版。

本文介绍如何为容器应用配置流量拆分规则。 若要运行以下示例,需要一个具有多个修订版的容器应用。

配置流量拆分

使用 az containerapp ingress traffic set 命令配置修订版之间的流量拆分。 可以使用 --revision-weight 参数按名称指定修订版,或使用 --label-weight 参数按修订版标签指定修订版。

以下命令将每个修订版的流量权重设置为 50%:

az containerapp ingress traffic set \
    --name <APP_NAME> \
    --resource-group <RESOURCE_GROUP> \
    --revision-weight <REVISION_1>=50 <REVISION_2>=50

确保将 <> 括住的占位符值替换为你自己的值。

此命令将修订版 <LABEL_1> 的流量权重设置为 80%,将修订版 <LABEL_2> 的流量权重设置为 20%:

az containerapp ingress traffic set \
    --name <APP_NAME> \
    --resource-group <RESOURCE_GROUP> \
    --label-weight <LABEL_1>=80 <LABEL_2>=20

  1. Azure 门户中转到你的容器应用。
  2. 在左侧菜单中选择“修订版管理”。
  3. 如果修订版模式为“单个”,请将模式设置为“多个”。
    1. 选择“选择修订版模式”。
    2. 选择“多个: 多个修订版同时处于活动状态”。
    3. 选择“应用”。
    4. 等待“修订版模式”更新为“多个”。 Screenshot of the revision management revision mode setting.
  4. 选择“显示非活动修订版”。
  5. 如果你没有多个修订版,可以创建新修订版。
    1. 选择“创建新修订版”。
    2. 可以使用默认设置,或自定义修订版。
    3. 输入修订版的名称/后缀。
    4. 选择创建Screenshot of Create and deploy new revision.
    5. 等待修订版部署完成。
  6. 选择要将流量路由到的修订版对应的“活动”。
  7. 在“流量”列中,输入要路由到每个修订版的流量百分比。 所有流量的总百分比必须等于 100%。
  8. 选择“保存”。 Screenshot of traffic splitting in Revision management.

通过将 configuration.ingress.traffic 属性添加到容器应用模板的 ingress 节来启用流量拆分。 可以使用 revisionName 属性按名称指定修订版,或使用 label 属性按修订版标签指定修订版。

以下示例将 100% 的流量设置为路由到最新部署的修订版:

{
  ...
  "configuration": {
    "ingress": {
      "external": true,
      "targetPort": 80,
      "allowInsecure": false,
      "traffic": [
        {
          "latestRevision": true,
          "weight": 100
        }
      ]
    },
  },

以下示例演示如何按名称在两个修订版之间进行流量拆分:

{
  ...
  "configuration": {
    "ingress": {
      "external": true,
      "targetPort": 80,
      "allowInsecure": false,
      "traffic": [
          {
              "revisionName": "my-example-app--5g3ty20",
              "weight": 50
          },
          {
              "revisionName": "my-example-app--qcfkbsv",
              "weight": 50
            }
        ],
    },
  },

以下示例演示如何按标签在两个修订版之间进行流量拆分:

{
  ...
  "configuration": {
    "ingress": {
      "external": true,
      "targetPort": 80,
      "allowInsecure": false,
      "traffic": [
          {
              "weight": 50,
              "label": "v-2"
          },
          {
              "weight": 50,
              "label": "v-1"
          }
        ],
    },
  },

用例

以下方案描述了常见用例的配置设置。 这些示例以 JSON 格式显示,但你也可以使用 Azure 门户或 Azure CLI 配置流量拆分。

快速迭代

在经常迭代容器应用开发的情况下,可以设置流量规则,以始终将所有流量转移到最新部署的修订。

以下示例模板将所有流量路由到最新部署的修订版:

"ingress": { 
  "traffic": [
    {
      "latestRevision": true,
      "weight": 100
    }
  ]
}

对最新修订感到满意后,可以通过将 ingress 设置更新为以下内容来锁定流向该修订的流量:

"ingress": { 
  "traffic": [
    {
      "latestRevision": false, // optional
      "revisionName": "myapp--knowngoodrevision",
      "weight": 100
    }
  ]
}

更新现有修订

假设你有一个已知良好的修订,该修订为 100% 的流量提供服务,但你想发布应用的更新。 可以使用其直接终结点部署和测试新修订,而不会影响为应用提供服务的主要修订。

对更新后的修订感到满意后,可以将一部分流量转移到新修订进行测试和验证。

以下模板将 20% 的流量移动到更新的修订版:

"ingress": {
  "traffic": [
    {
      "revisionName": "myapp--knowngoodrevision",
      "weight": 80
    },
    {
      "revisionName": "myapp--newerrevision",
      "weight": 20
    }
  ]
}

暂存微服务

构建微服务时,可能需要维护同一应用的生产和暂存终结点。 请使用标签来确保流量不会在不同修订之间切换。

以下示例模板将标签应用于不同的修订版。

"ingress": { 
  "traffic": [
    {
      "revisionName": "myapp--knowngoodrevision",
      "weight": 100
    },
    {
      "revisionName": "myapp--98fdgt",
      "weight": 0,
      "label": "staging"
    }
  ]
}

后续步骤