このトピックでは、Nginx Ingress から ASM ゲートウェイに移行する方法について説明します。
前提条件
最新バージョンの ASM Enterprise Edition または Ultimate Edition インスタンスを作成済みであること。詳細については、「ASM インスタンスを作成する」をご参照ください。
ASM インスタンスに ACK クラスタを追加済みであること。詳細については、「ASM インスタンスにクラスタを追加する」をご参照ください。
ソリューション

手順
ステップ 1:Nginx Ingress の Classic Load Balancer(CLB)インスタンスを再利用可能に構成する
1) 次のコマンドを実行して、Nginx Ingress の CLB インスタンス ID を取得します。
$ kubectl -n kube-system get svc nginx-ingress-lb -o yaml|grep service.k8s.alibaba/loadbalancer-id
// Nginx Ingress の CLB インスタンスID を取得するコマンド2) [サーバーロードバランサーコンソール] を開きます。次に、CLB インスタンスで次の操作を実行します。
設定変更保護を無効にします。
CLB インスタンスから次のタグを削除します。
kubernetes.do.not.deleteおよびack.aliyun.com。vServer グループの名前を変更します。k8s/ で始まるものは、shared、 "-"、およびポート番号に変更します。たとえば、k8s/80/nginx-ingress-lb/kube-system/c553a74e6ad13423aa839c8e5******** を shared-80 に変更します。
3) Nginx Ingress のサービスを変更します。次のアノテーションを追加します。
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: ${CLB インスタンス ID}
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: "false"
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vgroup-port: 複数のポートと vServer グループの組み合わせがある場合は、カンマ (,) で区切ります。たとえば、"${YOUR_VGROUP_ID_1}:80, ${YOUR_VGROUP_ID_2}:443" です。 shared-80 などの以前の名前ではなく、vServer グループ ID を指定する必要があることに注意してください。
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight: "100"
ステップ 2:ASM ゲートウェイを作成する
YAML を使用して ASM ゲートウェイを作成する必要があります。ただし、引き続き ASM ゲートウェイを使用して、視覚的な構成のためのページを作成できます。ページ下部のプレビュー [ボタン] をクリックすると、基本的な YAML ファイルを直接取得できます。ファイルを取得したら、YAML の serviceAnnotations を編集し、次のサービスアノテーションを追加して、Nginx Ingress の CLB インスタンスを再利用する必要があります。
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: ${CLB インスタンス ID}
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: "false"
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vgroup-port: 複数のポートと vServer グループの組み合わせがある場合は、カンマ (,) で区切ります。たとえば、"${YOUR_VGROUP_ID_1}:80, ${YOUR_VGROUP_ID_2}:443" です。 shared-80 などの以前の名前ではなく、vServer グループ ID を指定する必要があることに注意してください。
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight: "0"
ServiceAnnotations の例:
serviceAnnotations:
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: "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} を仮想サーバーに置き換えます。
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight: "0" // サービスのトラフィック重みを設定します。最初は 0 に設定して、ASM ゲートウェイがトラフィックを受信しないようにします。ステップ 3:Ingress を VS、DR、その他の Istio 構成に手動で変換する
Ingress を Istio の対応する VirtualService 構成に変換します。次の Ingress 構成を参照できます。
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予期される出力:
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 形式で入力する必要があります。
ステップ 4:トラフィックを検証する
ソリューション を参照して、Ingress 構成を VirtualService にした後、検証テストを実行して、構成が有効かどうかを確認する必要があります。新しい CLB インスタンスを手動で作成し、この CLB にテストトラフィック [リクエスト] を送信してテストできます。また、クラスタ内で ASM ingress gateway サービスを直接 [リクエスト] して、テスト結果に基づいて構成が正しいかどうかを判断することもできます。
ステップ 5:ASM ゲートウェイへのトラフィック移行のために、Ingress に対応する CLB のバックエンドインスタンスの重みを調整する
ASM ゲートウェイインスタンスの重みを小さい値(1% など)に設定して、オンライン [リクエスト] が期待どおりに動作するかどうかを確認することをお勧めします。すべてのトラフィックが ASM ゲートウェイに切り替わるまで、徐々に増やすことができます。
重みの調整方法は次のとおりです。
ASM ゲートウェイインスタンスの重みは、IstioGateway の ServiceAnnotations を介して調整できます。これは、service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight: "60" に対応します。
Nginx インスタンスの重みは、関連サービスの Annotation を介して調整できます。service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight。サービスに重みに関連するアノテーションが構成されていない場合は、[CLB コンソール] を介して Nginx Ingress インスタンスの分散重みを直接構成できます。