NGINX Ingress と比較して、Application Load Balancer (ALB) Ingress は完全マネージド型であり、手動での運用保守は不要です。さらに、ALB Ingress はより高い弾力性をサポートします。Container Service for Kubernetes (ACK) が提供する移行ツールを使用して、トラフィックを NGINX Ingress から ALB Ingress に移行できます。移行ツールは NGINX Ingress の設定を自動的に ALB Ingress の設定に変換できるため、手動で設定を行う必要はありません。このトピックでは、NGINX Ingress の設定を ALB Ingress の設定に変換した後、Alibaba Cloud DNS を使用してトラフィックを NGINX Ingress から ALB Ingress に段階的に移行する方法について説明します。このプロセスはユーザーに対して透過的です。
移行プロセス
ドメイン名を NGINX Ingress と ALB Ingress に解決し、Ingress の重みを段階的に調整します。これにより、ビジネスに対して透過的な移行が保証されます。以下の図は、Alibaba Cloud DNS を使用したトラフィック移行の手順を示しています。各ステップの詳細については、「移行例」をご参照ください。
Alibaba Cloud DNS は透過的な移行のための唯一のソリューションではありません。このトピックの移行例は参考用です。
移行例
この例では、移行プロセスを説明します。
ある企業が ACK クラスターに NGINX Ingress コントローラーをインストールし、コントローラー用にインターネット向けの LoadBalancer タイプの Service を設定しました。コントローラーは自動的にインターネット向けの Classic Load Balancer (CLB) インスタンスに関連付けられます。この企業は、ドメイン名 www.example.net を CLB インスタンスにマッピングするための DNS レコードを設定しました。このドメイン名宛のリクエストは CLB インスタンスに解決され、CLB インスタンスはリクエストをバックエンド Pod に転送します。
ステップ 1:ALB Ingress の設定
ビジネスの発展に伴い、NGINX Ingress のパフォーマンスがビジネス要件を満たせなくなりました。また、NGINX Ingress は高い運用保守コストも発生させます。この企業は、ネットワークトラフィックを NGINX Ingress から ALB Ingress に移行したいと考えています。移行プロセス中、企業は ACK が提供する移行ツールを使用して NGINX Ingress の設定を ALB Ingress の設定に変換し、ALB Ingress を DNS 解決設定に追加します。DNS 解決設定では、ALB Ingress は NGINX Ingress よりも低い優先度を持ちます。
DNS では、同じドメイン名を A レコードと CNAME レコードに同時に追加することはできません。CLB インスタンスは IP アドレスを使用してリクエストを受け取りますが、ALB インスタンスはデフォルトのドメイン名を使用します。詳細については、「ALB とは」をご参照ください。したがって、リクエストを重みに基づいて NGINX Ingress と ALB Ingress に分散させるために、企業は CLB インスタンスに一時ドメイン名を設定する必要があります。
ステップ 2:ALB Ingress への段階的なトラフィック移行
企業がテストを実行し、ALB Ingress が期待どおりにトラフィックを転送できることを確認した後、ALB Ingress の DNS レコードの重みを増やして、より多くのトラフィックを ALB Ingress に向けます。
ステップ 3:NGINX Ingress 関連リソースの削除
すべてのトラフィックが ALB Ingress に移行された後、企業は NGINX Ingress に関連する DNS 設定を削除し、NGINX Ingress に関連するリソースをリリースし、NGINX Ingress コントローラーをアンインストールします。企業がステップ 1 からステップ 3 を完了すると、すべてのネットワークトラフィックが NGINX Ingress から ALB Ingress に移行されます。この移行プロセスはユーザーに対して透過的です。
前提条件
kubectl クライアントが ACK クラスターに接続されていること。詳細については、「クラスターの kubeconfig を取得し、kubectl を使用してクラスターに接続する」をご参照ください。
ステップ 1:ALB Ingress の設定
ACK コンソールにログインし、移行したいクラスターに ALB Ingress コントローラーをインストールします。詳細については、「ALB Ingress コントローラーの管理」をご参照ください。移行ツールが
AlbConfig、IngressClass、およびIngressを自動的に変換するため、[ALB インスタンス] を [なし] に設定します。重要ALB Ingress から ACK 専用クラスターへのアクセスを許可するには、Service をデプロイする前に ALB Ingress コントローラーにアクセス権限を付与します。詳細については、「ACK 専用クラスターに ALB Ingress コントローラーへのアクセスを許可する」をご参照ください。
ingress2albconfig.yaml という名前の 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次のコードを実行して Job を実行します。Job は NGINX Ingress コントローラーの設定を自動的に
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 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 名に置き換えてください。次のコードは想定される出力を示しています。kubectl を使用してリソースをクラスターにデプロイすると、ALB 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: {}
自動変換されるアノテーション
移行ツールは、次の表にある NGINX Ingress アノテーションを自動的に ALB Ingress アノテーションに変換します。
次の表にない NGINX Ingress アノテーションは無視されます。無効な設定を防ぐため、変換後に ALB Ingress の設定を確認することを推奨します。
ステップ 2:ALB Ingress への段階的なトラフィック移行
移行プロセスを開始する前に、NGINX Ingress と ALB Ingress の転送ルールを比較し、転送ルールが同じであることを確認してください。問題が発生した場合に備えて、すべての設定をテストする必要があります。
ネットワークトラフィックの切り替えはオフピーク時に行うことを推奨します。
CLB インスタンスに一時ドメイン名を設定する
DNS では、同じドメイン名を A レコードと CNAME レコードに同時に追加することはできません。さらに、ALB インスタンスはデフォルトのドメイン名を使用してサービスを提供します。したがって、CLB インスタンスに一時ドメイン名を設定する必要があります。
Alibaba Cloud DNS コンソールにログインします。
[権威 DNS 解決] ページで、ドメイン名
www.example.netを見つけてクリックします。このドメイン名は CLB インスタンスの IP アドレスを指しています。[DNS 設定] ページで、[DNS レコードの追加] をクリックします。[DNS レコードの追加] パネルで、次のパラメーターを設定し、[OK] をクリックします。
パラメーター
説明
レコードタイプ
ドロップダウンリストから [CNAME] を選択します。
ホスト名
ドメイン名のプレフィックスを入力します。この例では、
wwwが指定されています。DNS リクエスト送信元
[デフォルト] を選択します。
レコード値
一時ドメイン名を入力します。この例では、
web0.example.netが指定されています。[TTL]
DNS サーバーにキャッシュされる CNAME レコードの生存時間 (TTL) を指定します。この例では、デフォルト値が使用されます。
[DNS 設定] タブで、ドメイン名
www.example.netを CLB インスタンスの IP アドレスにマッピングする A レコードを見つけ、[操作] 列の [変更] をクリックします。[DNS レコードの変更] パネルで、[ホスト名] パラメーターの値を変更し、[OK] をクリックします。この例では、[ホスト名] パラメーターは web0 に設定されています。他のパラメーターは変更されません。
説明設定を完了すると、ドメイン名
www.example.netはweb0.example.netにマッピングされ、A レコードによって 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[DNS 設定] ページで、[DNS レコードの追加] をクリックします。[DNS レコードの追加] パネルで、次のパラメーターを設定し、[OK] をクリックします。
パラメーター
説明
レコードタイプ
ドロップダウンリストから [CNAME] を選択します。
[ホスト名]
ドメイン名のプレフィックスを入力します。この例では、
wwwが指定されています。DNS リクエスト送信元
[デフォルト] を選択します。
レコード値
ALB インスタンスのドメイン名を入力します。
TTL
DNS サーバーにキャッシュされる CNAME レコードの TTL 値を指定します。この例では、デフォルト値が使用されます。
CNAME レコードの重みの設定
[ドメイン名解決] ページで、左側のナビゲーションウィンドウの [重み設定] をクリックします。
[加重ラウンドロビン] ページで、[操作] 列の [重みを有効にする] をクリックし、[重みの設定] をクリックします。
[重みの設定] パネルで、CLB および ALB インスタンスの DNS レコードの重みを設定します。CLB インスタンスの DNS レコードの重みを 100 に設定します。NLB インスタンスの DNS レコードの重みを 0 に設定します。

CLB インスタンスの DNS レコードの重みを徐々に減らし、ALB インスタンスの DNS レコードの重みを徐々に増やします。サービスに影響がないことを確認してください。
Service の Pod がデプロイされているワーカーノードにログインし、
digコマンドを複数回実行してトラフィック量を確認します。

CLB の DNS レコードの重みを徐々に 0 に減らし、ALB の DNS レコードの重みを徐々に 100 に増やします。
ステップ 3:NGINX Ingress 関連リソースの削除
NGINX Ingress 上のすべての持続的接続を閉じ、トラフィックが NGINX Ingress に転送されなくなった後、一定の観察期間を経て冗長なリソースをリリースできます。
Alibaba Cloud DNS コンソールにログインし、NGINX Ingress に関連するすべての DNS レコードを削除します。
NGINX Ingress コントローラーをアンインストールします。
ACK コンソールにログインします。
[クラスター] ページで、管理したいクラスターを見つけ、クラスター名をクリックします。左側のナビゲーションウィンドウで、 を選択します。
NGINX Ingress を見つけ、[アクション] 列で
> [削除] を選択します。表示されるメッセージで、[削除の確認] をクリックします。左側のナビゲーションウィンドウで、[アドオン] を選択します。[ネットワーク] タブをクリックし、[Nginx Ingress Controller] カードを見つけ、[アンインストール] をクリックします。
表示されるメッセージで、[OK] をクリックします。
説明NGINX Ingress コントローラーに関連付けられている CLB インスタンスは、NGINX Ingress コントローラーとともにリリースされます。リリースされたリソースに対しては、もはや課金されません。
関連ドキュメント
ALB は複数の設定方法をサポートしています。詳細については、「AlbConfig を使用した ALB インスタンスの設定」をご参照ください。
ALB Ingress で HTTPS を有効にする方法の詳細については、「HTTPS による暗号化通信のための証明書の設定」をご参照ください。
ALB Ingress がサポートするアノテーションの詳細については、「ALB Ingress 設定ディクショナリ」をご参照ください。
