セルフマネージド Istio のデプロイメントから Service Mesh (ASM) へ移行する際、イングレストラフィックを移行する必要があります。このガイドでは、重みベースのトラフィックシフトアプローチについて説明します。既存の Istio イングレスゲートウェイと新しい ASM イングレスゲートウェイの両方が同じ Classic Load Balancer (CLB) インスタンスを共有し、vServer グループの重みを調整することでトラフィック分割を制御します。

前提条件
ASM インスタンスが作成され、ターゲットの Kubernetes クラスターがメッシュに追加されていること
セルフマネージド Istio イングレスゲートウェイが実行されている Kubernetes クラスターへの管理者アクセス権があること
ロードバランサーのラベルと vServer グループを管理するための CLB コンソールへのアクセス権があること
セルフマネージド Istio イングレスゲートウェイが正常に実行され、トラフィックを処理していること
トラフィックシフト戦略の選択
ASM イングレスゲートウェイにトラフィックをリダイレクトするには、2 つのオプションがあります。
| 戦略 | 使用する状況 | 仕組み |
|---|---|---|
| DNS ベースの切り替え | DNS レコードを直接変更できます | ドメインの Domain Name System (DNS) レコードを更新し、ASM イングレスゲートウェイの IP アドレスを指すようにします。 |
| 重みベースのシフト | DNS レコードを変更できない場合、または段階的で制御された移行が必要な場合 | 両方のゲートウェイが CLB インスタンスを共有します。vServer グループの重みを調整して、トラフィックを段階的にシフトします。 |
このガイドでは、重みベースのシフトに焦点を当てています。DNS ベースの切り替えを使用する場合は、CLB 再利用設定をスキップし、ASM イングレスゲートウェイの作成後に DNS レコードを更新してください。
ASM イングレスゲートウェイの作成
セルフマネージド Istio イングレスゲートウェイと同じ Kubernetes クラスターに ASM イングレスゲートウェイを作成します。詳細については、「イングレスゲートウェイの作成」をご参照ください。
ゲートウェイを作成する際:
一意の名前を使用します。ASM イングレスゲートウェイの名前は、既存の Istio イングレスゲートウェイの名前と異なる必要があります。区別するために
-asmを追加します。例:ingressgateway-asm。同じクラスターにデプロイします。 ステップ 3 の イングレスゲートウェイの作成トピックでは、[クラスター] パラメーターを、ソース Istio イングレスゲートウェイが配置されている Kubernetes クラスターに設定します。
ゲートウェイの検証
ASM イングレスゲートウェイの作成後、ゲートウェイ Pod が実行されていることを確認します。
kubectl get pods -n istio-system -l istio=ingressgateway-asm期待される出力 (Pod 名と経過時間は異なります):
NAME READY STATUS RESTARTS AGE
ingressgateway-asm-5d8f7b9c4f-xxxxx 1/1 Running 0 1mIstio 構成の移行
Istio ルーティング構成を ASM イングレスゲートウェイに移行します。最終的に一貫性のある構成伝播によって引き起こされる 503 エラーを防ぐため、以下のメイクビフォーブレイク方式に従ってください。
1. DestinationRule リソースを最初に適用
ASM イングレスゲートウェイが必要とする DestinationRule 構成を適用します。続行する前に、構成が Envoy サイドカーに伝播するまで数秒間待ちます。
2. Gateway セレクターの更新
Istio Gateway の YAML で、selector.istio を ASM イングレスゲートウェイの名前に一致するように更新します。
spec:
selector:
istio: ingressgateway-asm3. VirtualService 構成の適用
Gateway セレクターの更新と DestinationRule 構成が伝播した後、ASM イングレスゲートウェイを参照する VirtualService 構成を適用します。
新しいルーティングルールを追加する際は、常に VirtualService の前に DestinationRule を適用してください。VirtualService が DestinationRule にまだ存在しないサブセットを参照している場合、DestinationRule が伝播するまで、そのサブセットへのトラフィックは 503 エラーを返します。
構成の検証
ASM イングレスゲートウェイが期待されるルーティング構成を受信したことを確認します。
kubectl get gateway,virtualservice,destinationrule -n istio-systemすべての Gateway、VirtualService、および DestinationRule リソースがリストされ、正しいゲートウェイ名を参照していることを確認します。
トラフィックの段階的シフト
構成が整ったら、CLB の重みを調整して、セルフマネージド Istio イングレスゲートウェイから ASM イングレスゲートウェイにトラフィックをシフトします。
ASM イングレスゲートウェイの重みを
10のような小さい値に設定し、トラフィックの一部をルーティングします。ASM イングレスゲートウェイ Service のservice.beta.kubernetes.io/alibaba-cloud-loadbalancer-weightアノテーションを編集します。ASM イングレスゲートウェイを介してトラフィックが正しく流れることを確認します。アプリケーションログ、レスポンスコード、およびレイテンシーを確認します。
kubectl logs -n istio-system -l istio=ingressgateway-asm --tail=50ASM イングレスゲートウェイの重みを徐々に増やし (例: 10 -> 30 -> 60 -> 100)、それに応じてソース Istio イングレスゲートウェイの重みを減らします。
すべてのトラフィックが ASM イングレスゲートウェイを介してルーティングされた後、ソース Istio イングレスゲートウェイの重みを
0に設定します。
重みの調整方法
| ゲートウェイ | 操作 |
|---|---|
| ソース Istio イングレスゲートウェイ | その Kubernetes Service の service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight アノテーションを編集します。 |
| ASM イングレスゲートウェイ | ASM イングレスゲートウェイ Service の service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight アノテーションを編集します。 |
ロールバック
移行中に ASM イングレスゲートウェイが期待どおりに動作しない場合:
ASM イングレスゲートウェイの重みを
0に設定し、トラフィックの送信を停止します。ソース Istio イングレスゲートウェイの重みを
100に戻します。Gateway、VirtualService、および DestinationRule の構成を元の Istio イングレスゲートウェイを指すように元に戻します。サブセットを削除する場合は、まず VirtualService を更新し、数秒待ってから DestinationRule を更新します。
よくある質問:Istio イングレスゲートウェイ Service によって自動作成された CLB インスタンスの再利用
セルフマネージド Istio イングレスゲートウェイ用に Service が作成されたときに CLB インスタンスが自動的に作成された場合、ASM イングレスゲートウェイで再利用する前に、次の手順を実行します。
CLB コンソールを開き、CLB インスタンスを見つけます。
CLB インスタンスから次の 2 つのラベルを削除します。
kubernetes.do.not.deleteack.aliyun.com
セルフマネージド Istio イングレスゲートウェイの Service に次のアノテーションを追加します。次のプレースホルダーを実際の値に置き換えてください。
プレースホルダー 説明 例 <your-clb-instance-id>CLB インスタンスの ID lb-bp1abc2defg <your-vserver-group-id>vServer グループの ID rsp-bp1abc3defg <port>リスナーポート番号 80 service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: "false" service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: <your-clb-instance-id> service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vgroup-port: <your-vserver-group-id>:<port> service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight: "100"