このトピックでは、ワークロードを自己管理型NGINX IngressからApplication Load Balancer (ALB) Ingressに移行する方法について説明します。
背景情報
ALBは、トラフィック変動の処理に理想的なIngressを提供します。 NGINX Ingressと比較して、ALB Ingressは次の利点の点でトラフィック管理を強化します。
完全マネージドおよびメンテナンスフリー: ALBは、手動メンテナンスを必要としない完全マネージド型クラウドサービスです。
自動スケーリング: ALBはCyberStarフレームワークの上に開発され、サービスがトラフィックの急増を処理するのに役立つ高性能な自動スケーリングをサポートします。
超高機能: 各ALBインスタンスは、1秒あたり最大100万件のクエリ (QPS) と数千万件の同時接続をサポートします。 デフォルトでは、SSLハードウェアアクセラレーションが使用されます。
クラウドサービスとの統合: ALBは、Web Application Firewall (WAF) 、Function Compute、PrivateLink、トランジットルーター、Enterprise Distributed Application Service (EDAS) 、Serverless App Engine (SAE) 、Service Mesh (ASM) などのさまざまなクラウドサービスと連携できます。
構成のホットアップデート: 構成のホットアップデートでは、永続的な接続が影響を受けないようにするためのプロセスの再読み込みは必要ありません。
サンプルシナリオ
次のシナリオは一例です。 ある会社が、中国 (杭州) リージョンにインターネット向けのClassic Load Balancer (CLB) インスタンスを作成しました。 同社はNGINX Ingressコントローラーを使用して、リダイレクトルール、ドメインベースの転送ルール、URLベースの転送ルールなどのIngress転送ルールを設定しました。 CLBインスタンスは、ドメイン名を通じてインターネット接続サービスを提供します。 リクエストがドメイン名www.example.net
に送信されると、リクエストはAレコードに基づいてCLBインスタンスにリダイレクトされます。 CLBインスタンスは、Ingressで作成された転送ルールに基づいて、サービスに関連付けられたポッドにリクエストを転送します。
事業開発のため、NGINX IngressをALB Ingressに移行する必要があります。 サービスの安定性を確保するために、サービスの提供に使用されるドメイン名やバックエンドサーバーのIPアドレスを変更する必要はありません。 この要件を満たすために、同社はALB IngressコントローラーをContainer Service for Kubernetes (ACK) またはACKサーバーレスクラスターにインストールできます。 次に、ALB IngressとNGINX Ingressが同じ転送ルールを使用することを保証するために、会社はコントローラ上でIngressルールを作成し、重み付きDNSレコードを設定できます。 これにより、会社はNGINX IngressをALB Ingressに移行できます。
使用上の注意
kubectlクライアントがクラスターに接続されていることを確認します。 詳細については、「クラスターのkubeconfigファイルを取得し、kubectlを使用してクラスターに接続する」をご参照ください。
CLBとALBは、 従量課金の課金方法。 CLBとALBの請求項目と価格は異なります。 CLBからALBにサービスを移行すると、料金が変更されます。 詳細については、以下のトピックをご参照ください。
手順
ステップ1: ALB Ingressの作成
ACKコンソールにログインし、ALB Ingressコントローラーをインストールします。 詳細については、「ALB Ingressコントローラーの管理」をご参照ください。
説明移行するNGINX IngressのACKまたはACK ServerlessクラスターにALB Ingressコントローラーをインストールする必要があります。
ALB IngressからACK専用クラスターへのアクセスを許可するには、サービスをデプロイする前にALB Ingressコントローラーにアクセス権限を付与します。 詳細については、「ACK専用クラスターにALB Ingressコントローラーへのアクセスを許可する」をご参照ください。
kubectlクライアントを使用して、NGINX IngressがデプロイされているACKクラスターまたはACKサーバーレスクラスターにログインし、AlbConfigを作成します。
説明ALB Ingressコントローラーを作成するときに、Gateway SourceをNewまたはExistingに設定すると、コントローラーは自動的にalbという名前のAlbConfigとalbという名前のIngressClassを作成します。 この場合、この手順をスキップできます。
albconfig.yamlという名前のファイルを作成し、次の内容をファイルにコピーします。
apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: alb-demo spec: config: name: alb-test addressType: Internet zoneMappings: - vSwitchId: vsw-wz9e2usil7e5an1xi**** - vSwitchId: vsw-wz92lvykqj1siwvif**** listeners: - port: 80 protocol: HTTP
zoneMappings: ALB Ingressによって使用されるvSwitchのID。 異なるゾーンに属するvSwitchを少なくとも2つ指定する必要があります。 指定するvSwitchは、クラスターと同じ仮想プライベートクラウド (VPC) に属している必要があります。
説明移行するNGINX IngressがIPv6をサポートしている場合は、AlbConfigの設定でaddressIpVersionをDualStackに設定できます。詳細については、「AlbConfigsを使用したALBインスタンスの設定」をご参照ください。
次のコマンドを実行して、AlbConfigを作成します。
kubectl apply -f albconfig.yaml
次のコマンドを実行して、ALBインスタンスが作成されているかどうかを確認します。
kubectl get albconfig
期待される出力:
NAME ALBID DNSNAME PORT&PROTOCOL CERTID AGE alb-demo alb-a8mmh2tqbmrm11**** alb-a8mmh2tqbmrm11****.cn-hangzhou.alb.aliyuncs.com 27s
IngressClassを作成します。
説明ALB Ingressコントローラーを作成するときに、Gateway SourceをNewまたはExistingに設定すると、コントローラーは自動的にalbという名前のAlbConfigとalbという名前のIngressClassを作成します。 この場合、この手順をスキップできます。
ingressclass.yamlという名前のファイルを作成し、次のコンテンツをファイルにコピーします。
apiVersion: networking.k8s.io/v1 kind: IngressClass metadata: name: alb spec: controller: ingress.k8s.alibabacloud/alb parameters: apiGroup: alibabacloud.com kind: AlbConfig name: alb-demo
parameters.name: 使用するAlbConfigの名前。
次のコマンドを実行してIngressClassを作成します。
kubectl apply -f ingressclass.yaml
ALB Ingressを作成します。
重要NGINX Ingressで高度な転送ルールが設定されている場合、ALB Ingressの高度な機能を有効にして、異なるドメイン名またはURL宛てのリクエストを異なるバックエンドサーバーに転送し、リクエストをHTTPからHTTPSにリダイレクトし、カナリアリリースを実行できます。 詳細については、「ALB Ingressの高度な機能」をご参照ください。
albingress.yamlという名前のファイルを作成し、次のコンテンツをファイルにコピーします。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: demo-ingress-alb namespace: default spec: ingressClassName: alb rules: - host: www.example.net http: paths: - backend: service: name: nginx port: number: 80 path: / pathType: Prefix
name: Ingressの名前。 同じ名前空間では、ALB Ingressの名前はNGINX Ingressの名前と異なる必要があります。
ingressClassName: 使用するIngressClassの名前。
次のコマンドを実行して、ALB Ingressを作成します。
kubectl apply -f albingress.yaml
次のコマンドを実行して、ALB Ingressリソースを照会します。
kubectl get ing
期待される出力:
NAME CLASS HOSTS ADDRESS PORTS AGE demo-ingress-alb alb www.example.net alb-a8mmh2tqbmrm11****.cn-hangzhou.alb.aliyuncs.com 80 10m 46s
出力には、ALB Ingressのエンドポイントが含まれます。 例: alb-a8mmh2tqbmrm11 **** .cn-hangzhou.alb.aliyuncs.com。
次のコマンドを実行して、ALB Ingressからバックエンドサービスにアクセスし、トラフィック量をテストします。
curl -H "Host: www.example.net" http://alb-a8mmh2tqbmrm11****.cn-hangzhou.alb.aliyuncs.com
期待される出力が返された場合、ALB Ingressはバックエンドサービスにアクセスできます。
ステップ2: ネットワークトラフィックをALB Ingressに切り替える
ネットワークトラフィックをALB Ingressに切り替える前に、NGINX Ingressによって生成された転送ルールとALB Ingressによって生成された転送ルールを比較して、転送ルールが同じであることを確認してください。 問題が発生した場合は、すべての構成をテストする必要があります。
オフピーク時にネットワークトラフィックを切り替えることを推奨します。
トラフィックを切り替える前に、CLBインスタンスにAレコードを設定する必要があります。 Aレコードは、サービスドメイン名をCLBインスタンスのIPアドレスにマッピングします。
ALB Ingressコントローラーをインストールした後、ALB IngressのNGINX Ingressと同じ転送ルールを設定し、すべての設定をテストすると、ネットワークトラフィックをALB Ingressに切り替えることができます。 Alibaba Cloud DNSは、ネットワークトラフィックを切り替える方法を示す例として使用されます。 次の手順は、ネットワークトラフィックをALBインスタンスに切り替える方法を示しています。 Alibaba Cloud DNSの詳細については、「パブリック権限DNS解決」をご参照ください。
ステップ1. CLBインスタンスの一時ドメイン名の設定
ALBインスタンスにCNAMEレコードを追加することを推奨します。 重み付きDNSレコードを設定するための条件を満たすには、一時ドメイン名にCNAMEレコードを追加し、一時ドメイン名をCLBインスタンスのIPアドレスに指定する必要があります。
同じドメイン名の異なるDNSレコードに重みを設定するには、DNSレコードが同じタイプで、同じホスト名とISP回線を持つ必要があります。 サポートされるタイプは、A、CNAME、およびAAAAです。
Alibaba Cloud DNSコンソール にログインします。
[ドメイン名解決] ページで、ドメイン名
www.example.net
を見つけてクリックします。 ドメイン名はCLBインスタンスを指します。[DNS設定] ページで、[DNSレコードの追加] をクリックします。 [DNSレコードの追加] パネルで、次のパラメーターを設定し、[OK] をクリックします。
パラメーター
説明
レコードタイプ
ドロップダウンリストから [CNAME] を選択します。
ホスト名
ドメイン名のプレフィックスを入力します。 この例では、wwwが入力されます。
DNSリクエストソース
[デフォルト] を選択します。
レコード値
一時ドメイン名を入力します。 この例では、web0.example.netが入力されます。
TTL
DNSサーバーにキャッシュされているCNAMEレコードの有効期限 (TTL) 値を指定します。 この例では、TTLは5秒に設定されています。
この例では、Alibaba Cloud DNS Enterprise Ultimate Editionが使用されています。 TTLは5秒に設定される。 ビジネス要件に基づいてTTL値を指定できます。 詳細については、「エディション」をご参照ください。
DNS設定タブのIPアドレスを指すAレコードを検索します。CLBインスタンスをクリックし、変更[アクション] 列に表示されます。
[DNSレコードの変更] パネルで、[ホスト名] パラメーターを変更し、[OK] をクリックします。 この例では、Hostnameパラメーターはweb0に設定されています。 他のパラメータは変更されない。
手順2: ALBインスタンスのCNAMEレコードの追加
次のコマンドを実行して、ALBインスタンスのドメイン名を照会します。
kubectl get albconfig
期待される出力:
NAME ALBID DNSNAME PORT&PROTOCOL CERTID AGE alb-demo alb-a8mmh2tqbmrm11**** alb-a8mmh2tqbmrm11****.cn-hangzhou.alb.aliyuncs.com 27s
説明ALBコンソールにログインして、ALBインスタンスのドメイン名を表示することもできます。 ALBコンソールは、ALBインスタンスの設定のみを提供します。 設定を変更するには、YAMLファイルを参照してください。
CNAMEレコードを作成するには、次の手順を実行します。
Alibaba Cloud DNSコンソール にログインします。
DNSの管理ページをクリックします。ドメイン名の追加.
ドメイン名の追加ダイアログボックスでドメイン名を入力し、OKをクリックします。
警告CLBインスタンスに関連付けられたドメイン名が追加されました。
CNAMEレコードを作成する前に、TXTレコードを使用してドメイン名の所有権を確認します。
管理するドメイン名を見つけて、をクリックします。DNS設定で、アクション列を作成します。
DNS設定ページで、レコードの追加をクリックします。
DNSレコードの追加パネルで、次のパラメータを設定し、OKをクリックします。
パラメーター
説明
レコードタイプ
ドロップダウンリストから [CNAME] を選択します。
ホスト名
ドメイン名のプレフィックスを入力します。 この例では、wwwが入力されます。
DNSリクエストソース
[デフォルト] を選択します。
値
ALBインスタンスのドメイン名であるCNAMEを入力します。
TTL
DNSサーバーにキャッシュされるCNAMEレコードのTTL値を指定します。 この例では、TTLは5秒に設定されています。
この例では、Alibaba Cloud DNS Enterprise Ultimate Editionが使用されています。 TTLは5秒に設定される。 ビジネス要件に基づいてTTL値を指定できます。 詳細については、「エディション」をご参照ください。
説明新しく作成されたCNAMEレコードはすぐに有効になります。 変更されたCNAMEレコードが有効になるまでに必要な時間は、TTL値によって決まります。デフォルトでは10分です。
作成するCNAMEレコードが既存のレコードと競合する場合は、別のドメイン名を指定します。
ステップ3: DNSレコードの重みを指定し、カナリアリリースを実行する
[ドメイン名の解決] ページで、管理するドメイン名をクリックします。 [DNS設定] ページの左側のナビゲーションウィンドウで、[重み設定] をクリックします。
On the重み付きラウンドロビンページをクリックします。重みの有効化で、アクション列をクリックし、セット重量をクリックします。
同じドメイン名の異なるDNSレコードに重みを設定するには、DNSレコードが同じタイプで、同じホスト名とISP回線を持つ必要があります。 サポートされるタイプは、A、CNAME、およびAAAAです。
[重みの設定] パネルで、CLBおよびALBインスタンスのDNSレコードの重みを設定します。 CLBインスタンスのDNSレコードの重みを100に設定します。 ALBインスタンスのDNSレコードの重みを0に設定します。
CLBインスタンスのDNSレコードの重みを徐々に減らし、ALBインスタンスのDNSレコードの重みを徐々に増やします。 サービスが影響を受けないようにしてください。
サービスのポッドがデプロイされているECSインスタンスにログインし、
掘る
コマンドを複数回実行してトラフィック量を確認します。dig www.example.net
次の図に出力を示します。 結果は、ネットワークトラフィックがDNSレコードの重みに基づいてALBまたはCLBインスタンスに分散されていることを示しています。
CLB DNSレコードの重みを0に徐々に減らし、ALB DNSレコードを100に徐々に増やします。
ステップ3: 冗長リソースの削除
NGINX Ingress上のすべての永続接続を閉じ、トラフィックがNGINX Ingressに転送されない場合、監視期間後に冗長リソースを解放できます。
NGINX Ingressを削除します。
ACKコンソールにログインします。 [クラスター] ページで、リリースするACKまたはACK ServerlessクラスターのIDをクリックします。
左側のナビゲーションウィンドウで、を選択します。
[Ingress] ページの上部で、名前空間を選択します。 削除するNGINX Ingressを見つけ、[操作] 列で /> [削除] を選択します。
表示されるメッセージで、[OK] をクリックします。
Nginx Ingressコントローラをアンインストールします。
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、 を選択します。
On theアドオンページをクリックし、ネットワーキングタブを検索し、Nginx Ingressコントローラカードをクリックし、アンインストール.
表示されるメッセージで、[OK] をクリックします。