ACK 移行ツールを使用して、セルフマネージド NGINX Ingress から Application Load Balancer (ALB) Ingress へ、ダウンタイムなしでトラフィックをシフトします。この移行は、次の目的で設計されています。
ダウンタイムなし — トラフィックは段階的にシフトされるため、ご利用のユーザーは中断を経験しません。
段階的なロールアウトをサポート — DNS の重みを自分のペースで調整し、いつでもロールバックできます。
切り替え前の完全な検証を許可 — NGINX を廃止する前に、ライブトラフィックで ALB Ingress の動作をテストします。
移行ツール(ingress2albconfig)は、NGINX Ingress 構成を AlbConfig、IngressClass、および Ingress リソースに自動的に変換します。変換後は、トラフィックの切り替えを行う前に、出力を確認およびテストしてください — 自動変換では、手動による検証が不要になるわけではありません。
仕組み
ドメイン名を NGINX Ingress と ALB Ingress の両方に同時に解決し、すべてのトラフィックが ALB Ingress を通過するまで DNS の重みを段階的にシフトします。NGINX Ingress は常に稼働し続けるため、重みを調整することでロールバックできます。
このガイドでは、トラフィックのシフトに Alibaba Cloud DNS を使用しています。重み付けされた CNAME レコードをサポートする他の DNS サービスも同様に機能します。
背景情報
ある企業は、クラシックロードバランサー (CLB) インスタンスによってバックアップされたインターネット向けの LoadBalancer サービスを通じて公開されている ACK クラスターで NGINX Ingress コントローラーを実行しています。ドメイン www.example.net には、CLB の IP アドレスを指す A レコードがあります。すべてのインバウンドリクエストは CLB に解決され、CLB がそれらをバックエンドの Pod に転送します。
目標は、既存のセットアップを完全に稼働させながら、すべてのトラフィックを ALB Ingress に移行することです。
前提条件
開始する前に、以下を確認してください。
ACK クラスターに接続された kubectl クライアント。詳細については、「クラスターの kubeconfig を取得し、kubectl を使用してクラスターに接続する」をご参照ください。
ステップ 1: ALB Ingress の構成
ALB Ingress コントローラーのインストール
ACK コンソールACK コンソールにログオンし、対象のクラスターに ALB Ingress コントローラーをインストールします。 詳細については、「ALB Ingress コントローラーの管理」をご参照ください。 プロンプトが表示されたら、[ALB Instance] を [None] に設定します。 移行ツールは
AlbConfig、IngressClass、およびIngressを自動的に変換します。ALB インスタンスを事前に作成しないでください。重要ACK 専用クラスターの場合、サービスをデプロイする前に 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.aliyuncs.com/acs/ingress2albconfig:latest command: ["/bin/ingress2albconfig", "print"] 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マニフェストを適用してジョブを実行します。
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 16mPod ログで変換された構成を表示します。
重要このツールは NGINX アノテーションを ALB アノテーションに自動的に変換しますが、アノテーション変換リファレンスにリストされているサポートされているアノテーションのみが対象です。このリストにない NGINX アノテーションは黙って破棄されます。変換された Ingress を注意深く確認し、続行する前に不足している動作を手動で再構成してください。
kubectl logs ingress2albconfig-vw*** # 前のステップの Pod 名に置き換えます。出力には、生成された
AlbConfig、IngressClass、およびIngressリソースが含まれます:apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: creationTimestamp: null 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: creationTimestamp: null name: from_nginx spec: controller: ingress.k8s.alibabacloud/alb parameters: apiGroup: alibabacloud.com kind: AlbConfig name: from_nginx scope: null --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: alb.ingress.kubernetes.io/listen-ports: '[{"HTTP":80}]' creationTimestamp: null 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: {}変換されたリソースをクラスターに適用して、ALB Ingress を作成します。
アノテーション変換リファレンス
次の NGINX Ingress アノテーションは、ALB Ingress の同等物に自動的に変換されます。ここにリストされていないアノテーションは変換されません。ALB で同等の動作が必要な場合は、手動で構成してください。
| NGINX Ingress アノテーション | ALB Ingress アノテーション | 備考 |
|---|---|---|
nginx.ingress.kubernetes.io/canary | alb.ingress.kubernetes.io/canary | |
nginx.ingress.kubernetes.io/canary-by-header | alb.ingress.kubernetes.io/canary-by-header | |
nginx.ingress.kubernetes.io/canary-by-header-value | alb.ingress.kubernetes.io/canary-by-header-value | |
nginx.ingress.kubernetes.io/canary-by-cookie | alb.ingress.kubernetes.io/canary-by-cookie | |
nginx.ingress.kubernetes.io/canary-weight | alb.ingress.kubernetes.io/canary-weight | |
nginx.ingress.kubernetes.io/use-regex | alb.ingress.kubernetes.io/use-regex | |
nginx.ingress.kubernetes.io/rewrite-target | alb.ingress.kubernetes.io/rewrite-target | |
nginx.ingress.kubernetes.io/ssl-redirect | alb.ingress.kubernetes.io/ssl-redirect | |
nginx.ingress.kubernetes.io/enable-cors | alb.ingress.kubernetes.io/enable-cors | |
nginx.ingress.kubernetes.io/cors-allow-origin | alb.ingress.kubernetes.io/cors-allow-origin | |
nginx.ingress.kubernetes.io/cors-allow-methods | alb.ingress.kubernetes.io/cors-allow-methods | |
nginx.ingress.kubernetes.io/cors-allow-headers | alb.ingress.kubernetes.io/cors-allow-headers | |
nginx.ingress.kubernetes.io/cors-expose-headers | alb.ingress.kubernetes.io/cors-expose-headers | |
nginx.ingress.kubernetes.io/cors-allow-credentials | alb.ingress.kubernetes.io/cors-allow-credentials | |
nginx.ingress.kubernetes.io/backend-protocol | alb.ingress.kubernetes.io/backend-protocol | |
nginx.ingress.kubernetes.io/load-balance | alb.ingress.kubernetes.io/backend-scheduler | |
nginx.ingress.kubernetes.io/upstream-hash-by | alb.ingress.kubernetes.io/backend-scheduler-uch-value | |
| その他の NGINX アノテーション | — | 変換されません。必要に応じて手動で構成してください。 |
ステップ 2: ALB Ingress へのトラフィックの段階的な移行
トラフィックをシフトする前に、NGINX Ingress と ALB Ingress の転送ルールを比較して、それらが一致することを確認してください。続行する前にすべての構成をテストしてください。オフピーク時間中にトラフィックをシフトします。
DNS は、同じホスト名に対して A レコードと CNAME レコードの両方を同時に持つことはできません。CLB インスタンスは IP アドレス (A レコード) を使用しますが、ALB インスタンスはドメイン名 (CNAME レコード) を使用します。移行中に両方を並行して実行するには、CLB に一時ドメインを割り当てて、DNS が CNAME によって両方のエンドポイントを解決できるようにします。
CLB インスタンスの一時ドメインの構成
Alibaba Cloud DNS コンソールにログインします。
[権威あるDNS解決] ページで、ドメイン名
www.example.netを見つけてクリックします。[DNS 設定] ページで、[DNS レコードの追加] をクリックします。[DNS レコードの追加] パネルで、以下のパラメーターを設定し、[OK] をクリックします。
パラメーター 値 レコードタイプ CNAME ホスト名 wwwDNS リクエストソース Default レコード値 web0.example.net(一時ドメイン)TTL Default www.example.netを CLB IP アドレスに対応付ける既存の A レコードを見つけます。「操作」列で [変更] をクリックします。[DNS レコードの変更] パネルで、[ホスト名] を
web0に変更し、[OK] をクリックします。この変更後、www.example.netは CNAME を使用してweb0.example.netに解決され、web0.example.netは A レコードを使用して CLB IP に解決されます。
ALB インスタンスの CNAME レコードの追加
ALB インスタンスのドメイン名を取得します。
kubectl get albconfig予想される出力:
NAME ALBID DNSNAME PORT&PROTOCOL CERTID AGE from_nginx alb-a8mmh2tqbmrm11**** alb-a8mmh2tqbmrm11****.cn-hangzhou.alb.aliyuncs.com 20mDNSNAME列の値 (alb-a8mmh2tqbmrm11****.cn-hangzhou.alb.aliyuncs.com) が ALB インスタンスのドメイン名です。[DNS 設定] ページで、[DNS レコードの追加] をクリックします。[DNS レコードの追加] パネルで、次のパラメーターを設定し、[OK] をクリックします。
パラメーター 値 レコードの種類 CNAME ホスト名 wwwDNS リクエストのソース Default 値を記録 前のステップで取得した ALB インスタンスのドメイン名 TTL Default
重みの構成とトラフィックのシフト
[ドメイン名解決] ページで、左側のナビゲーションウィンドウで [重み設定] をクリックします。
「加重ラウンドロビン」ページで、「操作」列の「重みを有効化」をクリックし、次に「重みを設定」をクリックします。
初期重みを設定します。CLB は 100、ALB は 0 です。

CLB の重みを徐々に減らし、ALB の重みを増やします。調整後、ご利用のサービスに影響がないことを確認してください。
Service Pod を実行中のワーカーノードにログインし、
digコマンドを複数回実行して、トラフィックの分散を確認します:

ALB の動作に問題がないことを確認したら、CLB の重みを 0、ALB の重みを 100 に設定します。
ご利用の DNS プロバイダーが重み付けされた CNAME レコードをサポートしていない場合は、この代替トラフィック切り替えアプローチを使用してください。

ステップ 3: NGINX Ingress に関連するリソースの削除
NGINX Ingress へのすべての接続保持が閉じられ、トラフィックが転送されなくなるまで待ちます。リソースをリリースする前に、一定期間監視してください。
「Alibaba Cloud DNS コンソール」にログインし、NGINX Ingress に関連するすべての DNS レコードを削除してください。
NGINX Ingress コントローラーをアンインストールします。
ACK コンソールにログインします。
「[クラスター]」ページで、クラスター名をクリックします。左側のナビゲーションウィンドウで、「[ネットワーク]」 > 「[Ingress]」を選択します。
NGINX Ingress を検索します。
> [削除] を [操作] 列でクリックします。ダイアログボックスで、[削除の確認] をクリックします。左側のナビゲーションウィンドウで、[アドオン] を選択します。[ネットワーキング] タブをクリックし、[Nginx Ingress コントローラー] カードを見つけ、[アンインストール] をクリックします。
ダイアログボックスで、[OK] をクリックします。
説明NGINX Ingress コントローラーに関連付けられている CLB インスタンスは、コントローラーとともにリリースされます。これらのリソースに対して課金されることはありません。
次のステップ
追加の ALB イングレス オプションを
AlbConfigを使用して設定します。詳細については、「AlbConfig を使用した ALB インスタンスの設定」をご参照ください。ALB Ingress で HTTPS を有効にします。詳細については、「HTTPS を介した暗号化された通信用の証明書の構成」をご参照ください。
ALB Ingress アノテーションの完全なリストを確認します。詳細については、「アノテーションを使用した ALB Ingress の構成」をご参照ください。