移行を円滑に進めるため、自動移行ツールを使用して、NGINX イングレスの構成を ALB イングレス形式に変換し、手動作業を省略できます。本ガイドでは、DNS 解決を利用してトラフィックを新しい ALB イングレスに徐々に切り替えるゼロダウンタイム移行を紹介します。
移行プロセス
ドメイン名を NGINX イングレスと ALB イングレスの両方に解決させ、それぞれの重みを徐々に調整することで、クライアント側でのシームレスな移行を実現できます。以下の図は、DNS 解決を利用したゼロダウンタイム移行の一般的なプロセスを示しています。各ステップの詳細は、下記の移行例で説明します。
DNS 解決によるトラフィックの切り替えは、ゼロダウンタイム移行を実現する方法の 1 つです。このプロセスは参考情報として提供されています。
移行例
以下の例では、具体的な操作内容とその動作を含めた移行プロセスを説明します。
ある企業は、クラスター内に NGINX イングレスコントローラーをインストールしています。このコントローラーの Service はインターネット向けの LoadBalancer 型であり、自動的にインターネット向けの CLB インスタンスをプロビジョニングします。また、クライアントが www.example.net にアクセスすると、そのリクエストが CLB に解決され、バックエンドの Pod に転送されるよう DNS 解決が構成されています。
ステップ 1:ALB イングレスの構成
ビジネストラフィックの増加に伴い、NGINX イングレスではパフォーマンス要件を満たせなくなり、運用管理 (O&M) コストも高くなっています。そのため、企業は NGINX イングレスから ALB イングレスへの移行を決定しました。移行中は、移行ツールを使用して NGINX イングレスの構成を ALB イングレスの構成に変換し、さらに新しい ALB イングレスを低い重みで DNS 解決に追加します。
DNS プロトコルでは、ドメイン名を同時に A レコードと CNAME レコードの両方に解決することはできません。CLB インスタンスは IP アドレス経由でリクエストを受け取りますが、ALB インスタンスはデフォルトドメイン名を公開してサービスを提供します(詳細については、「Application Load Balancer とは」をご参照ください)。したがって、NGINX イングレスと ALB イングレス間で重みベースのトラフィック分散を実現するには、CLB インスタンス用の一時ドメイン名を構成する必要があります。
ステップ 2:ALB イングレスへのトラフィックを徐々に切り替え
ALB イングレスが期待通りに動作することを確認した後、ALB イングレスの DNS 解決重みを増やして、より多くのトラフィックを ALB イングレス経由で処理するようにします。
ステップ 3:NGINX イングレスリソースの削除
すべてのトラフィックが ALB イングレスに完全に移行された後、企業は NGINX イングレス関連の DNS エントリを削除し、NGINX イングレスリソースを削除して、NGINX イングレスコントローラーアドオンをアンインストールします。これにより、NGINX イングレスから ALB イングレスへのゼロダウンタイム移行が完了します。
前提条件
kubectl クライアントが ACK クラスターに接続されています。詳細については、「kubectl を使用して ACK クラスターに接続する」をご参照ください。
ステップ 1:ALB イングレスの構成
-
Container Service for Kubernetes (ACK) コンソールにログインし、移行を実行するクラスターでALB イングレスコントローラーアドオンをインストールします。Container Compute Service コンソールにログインし、移行を実行するクラスターでALB イングレスコントローラーアドオンをインストールします。 移行ツールは、
AlbConfig、IngressClass、およびIngressリソースを自動的に変換します。そのため、アドオンをインストールする際は、ALB インスタンス の項目で なし を選択してください。重要ACK 専用クラスターで ALB イングレス経由でサービスにアクセスする場合は、サービスをデプロイする前に ALB イングレスコントローラーに権限を付与する必要があります。詳細については、「ACK 専用クラスターで ALB イングレスコントローラーに権限を付与する」をご参照ください。
-
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 -
次のコマンドを実行してジョブを開始します。このジョブは、既存の NGINX イングレスコントローラーの構成を自動的に
AlbConfig、IngressClass、Ingressなどのリソースに変換し、結果を出力します。出力内容はログで確認できます。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 created -
ジョブに属する Pod を表示します。
kubectl get pod -l job-name=ingress2albconfig期待される出力:
NAME READY STATUS RESTARTS AGE ingress2albconfig-vw*** 0/1 Completed 0 16m -
Pod のログを表示します。
kubectl logs ingress2albconfig-vw*** # このコマンドの Pod 名は、前のステップの出力に置き換えてください。次のような出力が期待されます。これらのリソースをクラスターにデプロイすると、ALB イングレスが構成されます。
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 イングレスのアノテーションを ALB イングレスのアノテーションに自動的に変換します。
次の表に含まれない NGINX イングレスのアノテーションは、変換時に無視されます。変換後は、ALB イングレスの構成が期待通りに機能することを確認してください。
ステップ 2:ALB イングレスへのトラフィックを徐々に切り替え
-
トラフィックを切り替える前に、NGINX イングレスと ALB イングレスの転送ルールを比較し、同一の機能であることをテストで確認してください。これにより、切り替え時の予期しないビジネスへの影響を防げます。
-
トラフィックの切り替えは、オフピーク時間帯に行ってください。
-
ALB イングレスを構成した後は、カナリアリリースとして少量のトラフィックを ALB イングレスに送信し、転送ルールと構成が正しいことを確認してから、徐々に重みを増やしてください。これにより、構成の不一致による直接的な切り替えによるトラフィック損失を防げます。
CLB インスタンス用の一時ドメインの構成
DNS プロトコルでは、ドメイン名を同時に 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
TTL (Time To Live) は、DNS レコードが DNS サーバーにキャッシュされる時間を指定します。デフォルト値のままにしてください。
説明構成を完了すると、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
TTL (Time To Live) は、DNS レコードが DNS サーバーにキャッシュされる時間を指定します。デフォルト値のままにしてください。
トラフィックの重みの設定
-
解決設定ページで、前のステップで追加した CNAME レコードを見つけ、Actions列のEditの横にある矢印をクリックし、レコードセットを変更するを選択します。
-
Edit Recordパネルで、CLB および ALB インスタンスの DNS レコードの重みを設定します。CLB インスタンスに対応するレコードの重みを 100、ALB インスタンスに対応するレコードの重みを 0 に設定し、OKをクリックします。
-
ビジネスへの影響がないことを確認した後、CLB インスタンスの DNS レコードの重みを徐々に下げると同時に、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 インスタンスの DNS レコードの重みを 0、ALB インスタンスのレコードの重みを 100 に徐々に設定します。
ステップ 3:NGINX イングレスリソースの削除
NGINX イングレスへのすべての接続保持が終了し、新しいトラフィックが送信されなくなった後、ビジネス要件に応じた適切な期間システムを監視し、冗長リソースを解放できます。
-
Alibaba Cloud DNS コンソールから、NGINX イングレス関連の DNS エントリを削除します。
-
NGINX イングレスコントローラーアドオンをアンインストールします。
-
ACK コンソールにログインします。
-
クラスターリストページで、対象クラスターの名前をクリックします。左側のナビゲーションウィンドウで、を選択します。
-
NGINX イングレスを見つけ、アクション列で、
> 削除を選択します。表示されたダイアログボックスで、削除するをクリックします。 -
左側のナビゲーションウィンドウで、アドオン管理を選択します。ネットワークタブをクリックし、NGINX イングレスコントローラーカードでアンインストールをクリックします。
-
表示されたダイアログボックスで、OKをクリックします。
アドオンをアンインストールすると、NGINX イングレスコントローラーで使用されていた CLB インスタンスが自動的に解放され、課金が停止されます。
-
-
Container Compute Service コンソールにログインします。左側のナビゲーションウィンドウで、アプリケーション > Helm をクリックし、NGINX イングレスコントローラーアドオンをアンインストールします。
関連ドキュメント
-
ALB インスタンスは複数の構成オプションをサポートしています。詳細については、「AlbConfig を使用して ALB インスタンスを構成する」をご参照ください。
-
ALB イングレスで HTTPS プロトコルを使用する方法については、「暗号化通信のための HTTPS 証明書を構成する」をご参照ください。
-
ALB イングレスでサポートされているアノテーションの一覧については、「ALB イングレスアノテーション」をご参照ください。
