本トピックでは、MSE コンソールの視覚的な移行ツールを使用して、セルフマネージド Nginx Ingress から MSE Ingress へ移行する方法について説明します。
前提条件
Container Service クラスターに Nginx Ingress Controller がデプロイされていること。
利用可能な Cloud Native Gateway があること。ない場合は、「MSE Cloud Native Gateway の作成」をご参照ください。
注意事項
移行プロセスでは Ingress 設定はコピーされません。代わりに、既存の Ingress リソースへの変更をリアルタイムで監視・解析することで、MSE Ingress が設定を再利用できるようにします。
移行中、Ingress 設定に加えた変更は Nginx Ingress Controller と MSE Ingress の両方に反映されます。
移行完了後も、使用中の Ingress 設定は削除しないでください。移行によって、MSE Ingress は既存および将来の Ingress 設定を監視・解析できるようになるだけです。
移行後も、既存および将来の Ingress 設定は、元の IngressClass に関連付けられたままである必要があります。たとえば、ある Ingress リソースが以前に spec で
ingressClassName: nginxを指定していた場合、移行後もその指定を維持する必要があります。
移行方法
詳細
移行ワークフロー
Cloud Native Gateway は、ルーティング設定の移行とトラフィックのシフトを段階的にガイドするクラウド移行ツールを提供します。
ステップ 1:ルーティングルールの移行
MSE コンソール にログインします。上部のナビゲーションバーで、リージョンを選択します。
左側メニューで、[Cloud Native Gateway] > クラウド移行 を選択します。
クラウド移行 ページで、タスクの作成 をクリックします。
移行設定の作成 パネルで、パラメーターを設定します。
Cloud Native Gateway は、選択されたコンテナークラスター内で、ソース IngressClass に関連付けられているすべての Ingress リソースを監視し、それらのドメイン名とルーティング設定を適用します。
重要ターゲットの Cloud Native Gateway が、既に別の IngressClass を使用してこのコンテナークラスターに関連付けられている場合、移行は許可されません。ここで指定する IngressClass が、クラスターに既に設定されているものと一致することを確認してください。
パラメーター
説明
[クラウドネイティブゲートウェイ インスタンス]
移行先の Cloud Native Gateway を選択します。ゲートウェイのバージョンは 1.2.22 以降である必要があります。
[Container Service ACK/]ACK Serverless cluster
移行する Nginx Ingress を含む Container Service クラスターを選択します。Cloud Native Gateway とコンテナークラスターが同じ VPC にあることを確認してください。
[ソース IngressClass]
移行したい Ingress リソースに関連付けられた IngressClass を指定します。
説明指定できる IngressClass は 1 つだけです。
このパラメーターを空のままにすると、IngressClass は無視され、ゲートウェイはクラスター内のすべての Ingress リソースを監視します。
Description
最大 64 文字で説明を入力します。
次へ をクリックします。
Cloud Native Gateway は、選択されたコンテナークラスター内で、ソース IngressClass に関連付けられているすべての Ingress リソースへの変更を自動的に監視します。その後、これらのリソースからドメイン名とルーティング設定を適用します。
ソースコンテナークラスターに httpbin という名前の Ingress があるとします。
Cloud Native Gateway コンソールでは、ソースクラスターの Ingress がターゲットゲートウェイに自動的に同期され、対応するドメインとルーティング設定が作成されることがわかります。[Routing Settings] の詳細ページは次のように表示されます:
設定ウィザード:
サービスソースの追加
K8s、Nacos、Zookeeper、SAE、EDAS、Function Compute (FC) をサービスソースとして使用できます。現在の VPC から既存のリソースを追加し、そこから登録済みのサービスを選択できます。
[サービスソースの追加] ボタン
バックエンドサービスの関連付け
リクエストをバックエンドサービスに分散します。このサービスは、サービスソースから動的に検出することも、静的なアドレスやドメイン名で指定することもできます。
[バックエンドサービスの関連付け] ボタン
ドメイン名のバインド
複数のドメイン管理を提供します。ドメイン名をバインドすることで、プロトコル、証明書、ルーティング設定を異なるドメインに関連付けることができます。
[ドメイン名のバインド] ボタン
ルートの作成
ルートには、ドメイン名、パス、メソッド、リクエストパラメーター、リクエストヘッダーに基づくマッチングルールが含まれます。ユーザーがルートにアクセスすると、リクエストは対応するバックエンドサービスに転送されます。
[ルートの作成] ボタン
リストカラム:ルート名、ステータス、WAF 保護、ソース、ルート条件、関連ドメイン名、宛先サービスタイプ、宛先サービス、およびアクション。
ステップ 2:ルートの検証
監視対象の Ingress アノテーションの互換性を確認します。
互換性のない Ingress アノテーションがない場合は、次のステップに進みます。
互換性のない Ingress アノテーションが見つかった場合は、チケットを起票 して解決策を依頼できます。
重要アノテーション
nginx.ingress.kubernetes.io/service-weightの値が""の場合は無視できます。このアノテーションは、以前のバージョンの Container Service コンソールによってデフォルトで追加されるもので、効果はありません。移行中は、使用中の互換性のないアノテーションを削除しないでください。これらのアノテーションは Nginx Ingress Controller によって引き続き解析され、ビジネストラフィックに影響を与えます。Ingress リソースに拡張 MSE アノテーションを追加することで、MSE Ingress で同じ機能を実現できます。すべてのトラフィックが MSE Ingress に移行された後、必要に応じて互換性のないアノテーションを削除できます。
ステップ 3:シフト方法の選択
トラフィックシフト前のテスト
本番トラフィックをシフトする前に、ローカルテストを実行します。ローカルの hosts ファイルを変更して、ビジネスドメイン名が Cloud Native Gateway SLB に解決されるようにします。cURL や Postman などのツールを使用して、すべてのトラフィックが期待どおりに動作することを確認します。
シフト方法の選択
ソース SLB の再利用
原則:このプロセスでは、Cloud Native Gateway ノードインスタンスをソース SLB の仮想サーバーグループに追加します。移行中、SLB は設定された重みに基づいてビジネストラフィックを Cloud Native Gateway に分散します。移行が完了すると、SLB はすべてのトラフィックを Cloud Native Gateway に転送します。
以下の表でパラメーターについて説明します。
パラメーター | 説明 |
[コンテナクラスター 名前空間] | Nginx Ingress SLB に関連付けられた Kubernetes Service が配置されている名前空間を選択します。 |
[コンテナクラスター SLB サービス] | Nginx Ingress SLB に関連付けられた Kubernetes Service の名前を選択します。 |
SLB ID | SLB インスタンスをクリックして、それが移行の正しいターゲットであることを確認します。 |
[ポートおよびバックエンドサーバー] | ソース SLB インスタンスのリスナーポートとゲートウェイプロトコル (HTTP/HTTPS) を選択します。ターゲットの仮想サーバーグループが自動的に表示されます。 説明 トラフィック損失を避けるために、正しいポートとプロトコルを選択してください。 |
DNS 名前解決
DNS プロバイダーのドメイン名前解決サービスに移動し、ルート移行に関連するすべてのドメインに対して Cloud Native Gateway SLB アドレスへのマッピングを追加します。トラフィックを徐々にシフトさせるために、DNS 加重名前解決を使用することを推奨します。
ステップ 4:トラフィックのシフト
ソース SLB の再利用
ステップ 1:SLB の変更
[Modify SLB] をクリックすると、システムは自動的に SLB インスタンスを Container Service の管理から切り離し、リスナーのスケジューリングアルゴリズムを加重ラウンドロビンに変更します。
このステップでは、SLB インスタンスを Container Service の管理から切り離します。切り離した後、SLB インスタンスは Nginx Ingress Controller の Pod IP アドレスの変更を追跡しなくなります。速やかに次のステップに進み、アノテーションを変更して Kubernetes Service を SLB インスタンスに再関連付けしてください。
ステップ 2:サービスアノテーションの上書き
ステップ 1 を完了した後、Container Service コンソール に移動します。トラフィックの切り替え ステップで選択した Kubernetes Service から既存のすべてのアノテーションを手動で削除します。次に、[Traffic Switchover] ページで自動生成されたアノテーションをコピーし、ターゲットの Kubernetes Service に追加します。このステップは、元の Kubernetes Service が SLB インスタンスを再利用するように再設定します。変更後、[Precheck] をクリックします。チェックに合格すれば、次のステップに進むことができます。
apiVersion: v1
kind: Service
metadata:
annotations:
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: lb-bp1lc0huzf0o1ks333yo1
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight: '100'
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vgroup-port: 'rsp-bp1uybv6iy50i:80,rsp-bp10s0ndrfvdt:443'
creationTimestamp: '2023-11-29T07:14:40Z'
finalizers:
- service.k8s.alibaba/resources
labels:
app: nginx-ingress-lb
service.beta.kubernetes.io/hash: 39a51bd97b88f6eaf232da33434ce2fe44ae094b7b4d2b9bb9126eb7
service.k8s.alibaba/loadbalancer-id: lb-bp1lc0huzf0o1ks333yo1
managedFields:
- apiVersion: v1
fieldsType: FieldsV1
fieldsV1:
'f:metadata':
'f:annotations':
.: {}
'f:kubectl.kubernetes.io/last-applied-configuration': {}
'f:service.beta.kubernetes.io/alibaba-cloud-loadbalancer-connection-drain': {}
'f:service.beta.kubernetes.io/alibaba-cloud-loadbalancer-connection-drain-timeout': {}
'f:service.beta.kubernetes.io/alibaba-cloud-loadbalancer-instance-charge-type': {}
'f:service.beta.kubernetes.io/alibaba-cloud-loadbalancer-resource-group-id': {}
'f:labels':
.: {}
'f:app': {}同じコンテナークラスター内のアプリケーションポッドが Nginx Ingress ゲートウェイにアクセスする場合、アノテーション service.beta.kubernetes.io/alibaba-cloud-loadbalancer-hostname: mse-ingress-migration を Service に追加する必要もあります。アノテーションを追加する前に、Service に関連付けられている SLB インスタンスで IP アクセス制御が無効になっていることを確認してください。このアノテーションは、アプリケーションポッドが SLB を介して Nginx Ingress ゲートウェイにアクセスするように強制し、Kube Proxy がトラフィックを最適化して SLB をバイパスし、Nginx Ingress ポッドに直接アクセスするのを防ぎます。
ステップ 3:加重トラフィックシフト
Cloud Native Gateway インスタンスのトラフィックの重みを設定します。ビジネスニーズに基づいて 1 から 100 までの値を設定します。初期値として 1 から 10 の間を推奨します。
この値は、すべての Cloud Native Gateway ノードの重みの合計です。SLB インスタンスは、仮想サーバーグループ内の Cloud Native Gateway ノードと Nginx Ingress ノードの間の重み比に基づいてトラフィックを分散します。Nginx Ingress ノードの合計の重みはデフォルトで 100 です。したがって、Cloud Native Gateway の重みを 100 に設定すると、トラフィックの半分を受信します。同様に、重みを 50 に設定すると、トラフィックの 3 分の 1 を受信します。
移行中、Cloud Native Gateway のモニタリングダッシュボードでゲートウェイのメトリクスを監視し、ゲートウェイの健全性を確認し、ビジネスメトリクスが安定していることを確認できます。
結果が期待どおりであれば、徐々に重みを増やすことができます。バックエンドが非同期で設定を適用するため、重みを変更するたびに、少なくとも 3 分間待ってください。
結果が期待どおりでない場合は、重みを 0 に設定して移行を停止します。
Container Service コンソールで、元のクラスターの SLB を再利用する ために選択した Kubernetes Service のアノテーション
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weightの値を下げることで、間接的に Cloud Native Gateway の重みを増やすことができます。具体的には、このアノテーションの値が 0 の場合、すべてのトラフィックは Cloud Native Gateway に向けられます。SLB はレイヤー 4 ロードバランサーであるため、接続レベルでトラフィックを制御します。重みの値は、リクエストレベルでの分散比率を正確に制御することはできません。
トラフィックをシフトした後に成功率が低下した場合は、この重みを 0 に設定することで高速ロールバック を実行できます。
長期間移行状態を維持し、いつでも Nginx Ingress と MSE Ingress 間のトラフィックの重みを調整できるようにしたい場合は、このステップに留まってください。トラフィックが期待どおりに動作し、すべてのトラフィックを Nginx Ingress にロールバックする必要がなくなったことを確認したら、トラフィック検証の完了 をクリックして次に進むことができます。
[Complete Traffic Verification] をクリックした後は、重みを変更できなくなります。
ステップ 4:トラフィック切り替えの完了
Container Service コンソールで、ステップ 3:トラフィックシフト方法の選択 で選択した K8s Service のアノテーション service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight の値を 0 に設定するか、Service リソースを削除します。その後、Nginx Ingress Controller ノードは SLB から自動的に削除され、すべての SLB トラフィックは Cloud Native Gateway に切り替えられます。移行の完了 をクリックして移行タスクを完了します。
DNS 名前解決
DNS プロバイダーのドメイン名前解決サービスに移動し、ルート移行に関わるすべてのドメインに対して Cloud Native Gateway SLB アドレスへのマッピングを追加します。トラフィックを徐々にシフトさせるために、DNS 加重名前解決を使用することを推奨します。
高速ロールバック
トラフィック移行中に予期せぬ問題が発生した場合は、以下の方法で高速ロールバックを実行し、トラフィックを Nginx Ingress Controller に復元できます。
ソースクラスター SLB の再利用:重みを 0 に設定します。これにより移行が停止します。
DNS を使用して Cloud Native Gateway SLB に解決:DNS プロバイダーで、すべてのビジネスドメインと Cloud Native Gateway SLB アドレスとのマッピングを削除します。
ステップ 5:移行の完了
ソース SLB の再利用
SLB トラフィックシフト方法を使用した場合は、関連するすべての SLB インスタンスでトラフィックが完全にシフトされたことを確認してください。すべての SLB インスタンスのトラフィックシフトが完了したら、必要に応じて Kubernetes Service と Nginx Ingress Controller を削除できます。
DNS 名前解決
DNS トラフィックシフト方法を使用し、すべてのビジネスドメインの IP アドレスが MSE ゲートウェイの SLB アドレスリストに解決されるようになった場合は、必要に応じて Kubernetes Service と Nginx Ingress Controller を削除できます。
トラブルシューティング
Bad request: mse.backend.gw.MIGRATE_INGRESS_CLASS_CONFLICT
このエラーは、ゲートウェイが既に Container Service クラスターに関連付けられており、Ingress の監視が有効になっているが、この移行で指定された IngressClass が元の Ingress 監視設定と一致しないことを示します。IngressClass の設定が一貫していることを確認してください。
以前に設定した IngressClass を変更する必要がある場合は、設定に応じて次のいずれかの方法を選択してください。
MseIngressConfig を通じて MSE Ingress を管理している場合は、「MSE Ingress を使用した Container Service および Container Compute Service (ACS) へのアクセス」を参照して変更してください。
MseIngressConfig を通じて MSE Ingress を管理していない場合は、ゲートウェイコンソールに移動し、サービスソースを見つけて、対応するコンテナークラスターの Ingress 監視オプションを変更してください。
Bad request: mse.backend.gw.MIGRATE_SERVICE_ANNOTATION_NOT_MATCH [annotation is not expected]
このエラーは、Kubernetes Service のアノテーションが要求された値に更新されていないことを示します。
Bad request: mse.backend.gw.MIGRATE_SERVICE_NOT_MATCH [weight hasn't been 0 or service hasn't been deleted]
これは、K8s Service のアノテーション service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight の値が 0 に設定されていないか、K8s Service が削除されていないことを示します。Container Service コンソールで、アノテーション service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight の値を 0 に設定するか、K8s Service を削除してください。

