Azure Container Apps でのトラフィック分割
既定では、イングレスが有効になっている場合、すべてのトラフィックは、デプロイされた最新のリビジョンにルーティングされます。 コンテナー アプリの 複数のリビジョン モード を有効にすると、受信トラフィックをアクティブなリビジョン間で分割できます。
トラフィック分割は、コンテナー アプリの更新プログラムをテストする場合に便利です。 トラフィック分割を使用して、ブルーグリーン デプロイ または 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
- Azure portal でコンテナー アプリに移動します。
- 左側のメニューから [リビジョン管理] を選択します。
- リビジョン モードが 単一 の場合は、モードを 複数 に設定します。
- [リビジョン モード] を選択します。
- [複数: 同時に複数のリビジョンをアクティブにする] を選択します。
- [適用] を選択します。
- リビジョンモード が 複数 に更新されるまで待ちます。
- [非アクティブなリビジョンを表示する] を選択します。
- 複数のリビジョンがない場合は、新しいリビジョンを作成できます。
- [新しいリビジョンの作成] を選択します。
- 既定の設定を使用することも、リビジョンをカスタマイズすることもできます。
- リビジョンの 名前/サフィックス を入力します。
- [作成] を選択します。
- リビジョンがデプロイされるまで待ちます。
- トラフィックをルーティングするリビジョンに対して [アクティブ] を選択します。
- [トラフィック] 列に、各リビジョンにルーティングするトラフィックの割合を入力します。 すべてのトラフィックの合計パーセンテージは100%である必要があります。
- [保存] を選択します。
コンテナー アプリ テンプレートの ingress
セクションに configuration.ingress.traffic
プロパティを追加して、トラフィックの分割を有効にします。 リビジョンは、 revisionName
プロパティを使用して名前で指定することも、label
プロパティを使用してリビジョン ラベルで指定することもできます。
次の例では、トラフィックの 100% をデプロイされた最新のリビジョンに設定します。
{
...
"configuration": {
"ingress": {
"external": true,
"targetPort": 80,
"allowInsecure": false,
"traffic": [
{
"latestRevision": true,
"weight": 100
}
]
},
},
次の例は、名前によって 2 つのリビジョン間でトラフィックを分割する方法を示しています。
{
...
"configuration": {
"ingress": {
"external": true,
"targetPort": 80,
"allowInsecure": false,
"traffic": [
{
"revisionName": "my-example-app--5g3ty20",
"weight": 50
},
{
"revisionName": "my-example-app--qcfkbsv",
"weight": 50
}
],
},
},
次の例は、ラベルによって 2 つのリビジョン間でトラフィックを分割する方法を示しています。
{
...
"configuration": {
"ingress": {
"external": true,
"targetPort": 80,
"allowInsecure": false,
"traffic": [
{
"weight": 50,
"label": "v-2"
},
{
"weight": 50,
"label": "v-1"
}
],
},
},
ユース ケース
以下のシナリオでは、一般的なユース ケースの構成設定について説明します。 例は JSON 形式で示されていますが、Azure portal または 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"
}
]
}