自動移行ツールを使用して NGINX Ingress の設定を ALB Ingress のフォーマットに変換することで、手動での作業を不要にします。DNS ベースの重み調整によってトラフィックを段階的に移行し、ゼロダウンタイムを実現します。
移行プロセス
ドメイン名を NGINX Ingress と ALB Ingress の両方に解決させ、DNS の重みを段階的に調整することで、トラフィックをシームレスに移行します。以下の図にそのプロセスを示します。移行例で詳細な手順を後述します。
DNS ベースのトラフィック移行は、ゼロダウンタイム移行の一つのアプローチです。このプロセスは参考用です。
移行例
以下の例では、具体的な操作を交えて移行手順を説明します。
ある企業が、クラスター内で NGINX Ingress コントローラーを実行しているとします。このコントローラーのインターネット向け LoadBalancer タイプの Service は、インターネット向けの Classic Load Balancer (CLB) インスタンスを自動的にプロビジョニングします。DNS は www.example.net をこの CLB に解決し、CLB がリクエストをバックエンドの Pod に転送します。
ステップ 1:ALB Ingress の設定
NGINX Ingress がパフォーマンス要件を満たせなくなり、運用保守コストも高騰しています。そこで、この企業は移行ツールを使用して NGINX Ingress の設定を ALB Ingress に変換し、より低い重みで ALB Ingress を DNS に追加します。
DNS では、1つのドメイン名を A レコードと CNAME レコードの両方に同時に解決することはできません。CLB インスタンスは IP アドレス経由でリクエストを受け取りますが、ALB インスタンスはデフォルトドメイン名を公開します (詳細については、「Application Load Balancer とは」をご参照ください)。重み付けに基づくトラフィック分散を有効にするには、CLB インスタンスに一時ドメイン名を設定する必要があります。
ステップ 2:ALB Ingress へのトラフィックの段階的な移行
ALB Ingress が期待どおりに動作することを確認した後、ALB Ingress の DNS の重みを増やし、より多くのトラフィックが経由するようにします。
ステップ 3:NGINX Ingress リソースの削除
すべてのトラフィックが ALB Ingress に移行された後、NGINX Ingress の DNS エントリを削除し、NGINX Ingress リソースを削除し、NGINX Ingress コントローラーアドオンをアンインストールします。
前提条件
kubectl クライアントが ACK クラスターに接続されていること。詳細については、「kubectl を使用して ACK クラスターに接続する」をご参照ください。
ステップ 1:ALB Ingress の設定
Container Service for Kubernetes (ACK) コンソールにログインし、移行を実行するクラスターに ALB Ingress コントローラーアドオンをインストールします。Container Compute Service コンソールにログインし、移行を実行するクラスターに ALB Ingress コントローラーアドオンをインストールします。 移行ツールは
AlbConfig、IngressClass、Ingressリソースを自動的に変換するため、アドオンをインストールする際は、[ALB インスタンス] で [なし] を選択してください。重要ACK 専用クラスターで ALB Ingress を介してサービスにアクセスするには、サービスをデプロイする前に ALB Ingress コントローラーに権限を付与する必要があります。ACK 専用クラスターで ALB Ingress コントローラーに権限を付与する。
以下の内容で `ingress2albconfig.yaml` という名前のファイルを作成します。
apiVersion: batch/v1 kind: Job metadata: name: ingress2albconfig namespace: default spec: template: spec: containers: - name: ingress2albconfig image: registry-cn-hangzhou.ack.aliyuncs.com/acs/ingress2albconfig:0.0.2 command: ["/bin/ingress2albconfig", "print", "-A"] restartPolicy: Never serviceAccount: ingress2albconfig serviceAccountName: ingress2albconfig backoffLimit: 4 --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: system:ingress2albconfig rules: - apiGroups: - networking.k8s.io resources: - ingresses - ingressclasses verbs: - get - list - watch - update - create - patch --- apiVersion: v1 kind: ServiceAccount metadata: name: ingress2albconfig namespace: default --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: system:ingress2albconfig roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: system:ingress2albconfig subjects: - kind: ServiceAccount name: ingress2albconfig namespace: default次のコマンドを実行して Job を開始します。この Job は、既存の NGINX Ingress 設定を
AlbConfig、IngressClass、Ingressなどのリソースに変換し、結果を Pod のログに出力します。kubectl apply -f ingress2albconfig.yaml想定される出力:
job.batch/ingress2albconfig created clusterrole.rbac.authorization.k8s.io/system:ingress2albconfig created serviceaccount/ingress2albconfig created clusterrolebinding.rbac.authorization.k8s.io/system:ingress2albconfig createdJob に属する Pod を表示します。
kubectl get pod -l job-name=ingress2albconfig想定される出力:
NAME READY STATUS RESTARTS AGE ingress2albconfig-vw*** 0/1 Completed 0 16mPod のログを表示します。
kubectl logs ingress2albconfig-vw*** # 前のステップで取得した Pod 名に置き換えてください。想定される出力。これらのリソースをクラスターにデプロイして、ALB Ingress を設定します。
apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: from-nginx spec: config: accessLogConfig: {} edition: Standard name: from-nginx tags: - key: converted/ingress2albconfig value: "true" zoneMappings: - vSwitchId: vsw-xxx # ご利用の VPC にある vSwitch の ID に置き換えてください。 - vSwitchId: vsw-xxx # ご利用の VPC にある vSwitch の ID に置き換えてください。 listeners: - port: 80 protocol: HTTP --- apiVersion: networking.k8s.io/v1 kind: IngressClass metadata: name: from-nginx spec: controller: ingress.k8s.alibabacloud/alb parameters: apiGroup: alibabacloud.com kind: AlbConfig name: from-nginx --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: alb.ingress.kubernetes.io/listen-ports: '[{"HTTP":80}]' name: from-ingress1 namespace: default spec: ingressClassName: from-nginx rules: - http: paths: - backend: service: name: nginx-svc-g1msr port: number: 80 path: / pathType: Prefix status: loadBalancer: {}
自動的に変換されるアノテーション
移行ツールは、以下の NGINX Ingress アノテーションを ALB Ingress アノテーションに変換します。
この表にないアノテーションは変換中に無視されます。変換後に ALB Ingress の設定を確認してください。
ステップ 2:ALB Ingress へのトラフィックの段階的な移行
トラフィックを切り替える前に、NGINX Ingress と ALB Ingress の転送ルールを比較・テストし、機能が同一であることを確認してください。
トラフィックの切り替えはオフピーク時に行ってください。
ALB Ingress を設定した後、カナリアリリースとして少量のトラフィックを転送します。重みを徐々に増やす前に、転送ルールと設定を確認してください。
CLB インスタンスの一時ドメインの設定
DNS は、1つのドメイン名を A レコードと CNAME レコードの両方に解決することをサポートしていません。ALB インスタンスはデフォルトドメイン名を使用するため、CLB インスタンスに一時ドメイン名を設定する必要があります。
Alibaba Cloud DNS コンソールにログインします。
インターネットの権威ある DNS 解決 ページで、移行対象の CLB インスタンスを指す DNS ドメイン名
www.example.netを見つけてクリックします。解決設定 ページで、
www.example.netから CLB インスタンスの IP アドレスを指す A レコードを見つけます。Actions 列で Edit をクリックします。Edit Record パネルで ホストレコード を変更し、OK をクリックします。この例では、ホストレコード を `web0` に変更します。他のパラメーターは変更しません。
解決設定 ページで Add Record をクリックします。Add Record パネルで、次のパラメーターを設定し、OK をクリックします。
パラメーター
説明
Record Type
[CNAME] を選択します。
Hostname
ドメイン名のプレフィックスです。この例では、
wwwと入力します。Query Source
デフォルトを選択します。
Record Value
一時ドメイン名を入力します。この例では、
web0.example.netと入力します。TTL
デフォルト値のままにします。
説明これで、CNAME レコードは
www.example.netをweb0.example.netに解決し、A レコードはweb0.example.netを CLB の IP アドレスに解決するようになります。
ALB インスタンスの CNAME レコードの追加
次のコマンドを実行して、ALB インスタンスのドメイン名を確認します。
kubectl get albconfig想定される出力。
alb-a8mmh2tqbmrm11****.cn-hangzhou.alb.aliyuncs.comが ALB インスタンスのドメイン名です。NAME ALBID DNSNAME PORT&PROTOCOL CERTID AGE from_nginx alb-a8mmh2tqbmrm11**** alb-a8mmh2tqbmrm11****.cn-hangzhou.alb.aliyuncs.com 20m解決設定 ページで Add Record をクリックします。Add Record パネルで、次のパラメーターを設定し、OK をクリックします。
パラメーター
説明
Record Type
[CNAME] を選択します。
Hostname
ドメイン名のプレフィックスです。この例では、
wwwと入力します。Query Source
デフォルトを選択します。
Record Value
ALB インスタンスのドメイン名を入力します。
TTL
デフォルト値のままにします。
トラフィックの重みの設定
解決設定 ページで、前のステップで追加した CNAME レコードを見つけます。Actions 列で、Edit の横にある矢印をクリックし、レコードセットを変更する を選択します。
Edit Record パネルで、CLB の重みを 100、ALB の重みを 0 に設定します。OK をクリックします。
ビジネスへの影響がないことを確認した後、CLB の重みを徐々に減らし、ALB の重みを増やします。
digコマンドを複数回実行して、トラフィック移行の効果を確認します。[root@xxx 2uvl6raykm3Z ~]# dig www.xxx.net ; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.10 <<>> www.xxx.net ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 31592 ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;www.xxx.net. IN A ;; ANSWER SECTION: www.xxx.net. 5 IN CNAME web0.xxx.net. web0.xxx.net. 5 IN A 47.xxx.144 ;; Query time: 63 msec ;; SERVER: 100.xxx.136#53(100.xxx.136) ;; WHEN: Thu Jan 19 15:46:40 CST 2023 ;; MSG SIZE rcvd: 66[root@xxx ~]# dig www.xxx.net ; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.10 <<>> www.xxx.net ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 14224 ;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;www.xxx.net. IN A ;; ANSWER SECTION: www.xxx.net. 5 IN CNAME alb-a8mmh2xxxm74.cn-hangzhou.alb.aliyuncs.com. alb-a8mxxxm74.cn-hangzhou.alb.aliyuncs.com. 60 IN A 116.xxx.54 alb-a8mxxxm74.cn-hangzhou.alb.aliyuncs.com. 60 IN A 118.xxx.39 ;; Query time: 4 msec ;; SERVER: 100.xxx.136#53(100.xxx.136) ;; WHEN: Thu Jan 19 15:47:52 CST 2023 ;; MSG SIZE rcvd: 128確認後、徐々に CLB の重みを 0 に、ALB の重みを 100 に設定します。
ステップ 3:NGINX Ingress リソースの削除
NGINX Ingress へのすべての永続的な接続が閉じられ、新しいトラフィックが到達しなくなった後、ビジネスに適した期間システムを監視してから、冗長なリソースを解放します。
Alibaba Cloud DNS コンソールから NGINX Ingress 関連の DNS エントリを削除します。
NGINX Ingress コントローラーアドオンをアンインストールします。
ACK コンソールにログインします。
クラスターリスト ページで、対象クラスターの名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
NGINX Ingress を見つけます。アクション 列で、
> 削除 を選択します。表示されるダイアログボックスで、削除する をクリックします。左側のナビゲーションウィンドウで アドオン管理 を選択します。ネットワーク タブをクリックします。NGINX Ingress controller カードで、アンインストール をクリックします。
表示されるダイアログボックスで、OK をクリックします。
アドオンをアンインストールすると、NGINX Ingress コントローラーが使用していた CLB インスタンスが自動的に解放され、料金は発生しなくなります。
Container Compute Service コンソールにログインします。左側のナビゲーションウィンドウで、[アプリケーション] > [Helm] をクリックし、NGINX Ingress コントローラーアドオンをアンインストールします。
