このトピックでは、Nginx Ingress Controller からイングレスゲートウェイにトラフィックを移行する方法について説明します。
前提条件
Enterprise Edition または Ultimate Edition の Service Mesh(ASM)インスタンスが作成されており、インスタンスが最新バージョンであること。詳細については、「ASM インスタンスの作成」をご参照ください。
Container Service for Kubernetes(ACK)クラスターが ASM インスタンスに追加されていること。詳細については、「ASM インスタンスへのクラスターの追加」をご参照ください。
トラフィックフロー

手順
ステップ 1:イングレスゲートウェイの作成
Nginx Ingress Controller に関連付けられている Classic Load Balancer(CLB)インスタンスを再利用するために、Istio ゲートウェイの YAML ファイルを作成します。次の項目に注意してください:
LoadBalancer サービス タイプを使用して作成された CLB インスタンスの再利用の詳細については、「FAQ」をご参照ください。
YAML ファイルの serviceAnnotations パラメーターの CLB インスタンスに関連する設定を編集します。
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: 再利用する CLB インスタンスを指定します。
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: CLB インスタンスの既存のリスナーを上書きするかどうかを指定します。値を false に設定します。
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vgroup-port: 再利用する CLB インスタンスの vServer グループを指定します。複数のポートと vServer グループはカンマ(,)で区切ります。例:"${YOUR_VGROUP_ID_1}:80, ${YOUR_VGROUP_ID_2}:443"。
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight: イングレスゲートウェイの重みを指定します。イングレスゲートウェイのルーティングルールが設定されていない場合、または例外が発生した場合は、重みを 0 に設定できます。重みを 0 に設定すると、CLB インスタンスはイングレスゲートウェイにトラフィックを転送しません。このパラメーターを指定する前に、CLB インスタンスのスケジューリングアルゴリズムが重み付けラウンドロビン(WRR)であることを確認してください。
サービスアノテーションの設定例:
serviceAnnotations:
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: "lb-xxxxx" // lb-xxxxx を、CLBコンソールで作成した CLB インスタンスの ID に置き換えます。
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: 'false' // Istio ゲートウェイに基づいて既存のリスナーがデフォルトで上書きされるため、値を false に設定します。
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vgroup-port: "${YOUR_VGROUP_ID}:80" // ${YOUR_VGROUP_ID} を、CLB インスタンスの vServer グループの ID に置き換えます。
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight: "60" // 重みを 0 に設定すると、イングレスゲートウェイはトラフィックを受信しなくなります。
ステップ 2:Ingress 設定を手動で VirtualService や DestinationRule などの Istio リソース設定に変換する
次の YAML コードは、Ingress 設定を VirtualService 設定に変換する方法の例を示しています:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: helloworld
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
rules:
- http:
paths:
- backend:
serviceName: helloworld
servicePort: 80
path: /helloworld(/|$)(.*)
host: example.com変換された VirtualService 設定:
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: example-vs
spec:
gateways:
- istio-system/ingressgateway ## ゲートウェイ名
hosts:
- example.com
http:
- name: route-helloworld
match:
- uri:
prefix: /helloworld/
- uri:
prefix: /helloworld
rewrite:
uri: /
route:
- destination:
host: helloworld
port:
number: 80VirtualService と DestinationRule は、対応するサービスデプロイメントと同じ名前空間にデプロイできます。別の名前空間にデプロイする場合は、destination.host の値を FQDN 形式で設定します。
ステップ 3:設定の確認
トラフィックフローを確認して、設定が有効であり、有効になっていることを確認します。 CLB インスタンスを作成し、CLB インスタンスにトラフィックを送信し、トラフィックフローが期待どおりであるかどうかを確認します。詳細については、「トラフィックフロー」をご参照ください。
ステップ 4:Nginx Ingress Controller に関連付けられている CLB インスタンスに接続されている各バックエンドインスタンスの重みを調整して、トラフィックを徐々にイングレスゲートウェイに移行する
最初にイングレスゲートウェイの重みを 1 などの小さい値に設定し、トラフィックフローが期待どおりであるかどうかを確認することをお勧めします。次に、すべてのトラフィックがイングレスゲートウェイにルーティングされるまで、重みを徐々に増やします。
重みを調整する方法:
イングレスゲートウェイの重みを調整するには、service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight アノテーションを編集します。
Nginx Ingress Controller に関連付けられている CLB インスタンスに接続されているバックエンドインスタンスの重みを調整するには、関連するサービスの service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight アノテーションを編集します。サービスに重みに関するアノテーションが設定されていない場合は、CLB コンソールに移動して重みを調整します。