Разделение трафика в приложениях контейнеров Azure

По умолчанию при включении входящего трафика все трафик направляется в последнюю развернутую редакцию. При включении нескольких режимов редакции в приложении-контейнере можно разделить входящий трафик между активными редакциями.

Разделение трафика полезно для тестирования обновлений приложения-контейнера. Вы можете использовать разделение трафика для постепенного этапа в новой редакции в сине-зеленых развертываниях или в тестировании A/B.

Разделение трафика основано на весе (проценте) трафика, который направляется на каждую редакцию. Совокупный вес всех правил разделения трафика должен составлять 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"
    }
  ]
}

Следующие шаги