すべてのプロダクト
Search
ドキュメントセンター

Server Load Balancer:自己管理型NGINX IngressからALB Ingressへの移行のベストプラクティス

最終更新日:Dec 25, 2024

NGINX Ingressと比較して、Application Load Balancer (ALB) Ingressは完全に管理されており、手動のO&Mは必要ありません。さらに、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は、透過的な移行のための唯一のソリューションではありません。 このトピックの移行例は参照用です。

image

移行の例

この例では、移行プロセスを示します。

会社がACKクラスターにNGINX Ingressコントローラーをインストールし、コントローラーにインターネット向けのLoadBalancerサービスを設定しました。 コントローラーは、インターネットに接続するClassic Load Balancer (CLB) インスタンスに自動的に関連付けられます。 同社は、ドメイン名www.example.netをCLBインスタンスにマップするようにDNSレコードを設定しました。 ドメイン名宛てのリクエストはCLBインスタンスに解決され、CLBインスタンスはリクエストをバックエンドポッドに転送します。

image

手順1: ALB Ingressの設定

ビジネスが発展するにつれて、NGINX Ingressのパフォーマンスはビジネス要件を満たすことができません。 NGINX Ingressは、高いO&Mコストも生み出します。 同社は、ネットワークトラフィックをNGINX IngressからALB Ingressに移行したいと考えています。 移行プロセス中、会社はACKが提供する移行ツールを使用してNGINX Ingress設定をALB Ingress設定に変換し、ALB IngressをDNS解決設定に追加します。 DNS解決構成では、ALB IngressはNGINX Ingressよりも低い優先度を有する。

重要

DNSでは、AレコードとCNAMEレコードに同じドメイン名を同時に追加することはできません。 CLBインスタンスはIPアドレスを使用してリクエストを受信しますが、ALBインスタンスはデフォルトのドメイン名を使用します。 詳細については、「ALB の概要」をご参照ください。 したがって、会社はCLBインスタンスの一時ドメイン名を設定して、重みに基づいてNGINX IngressとALB Ingressにリクエストを配信できるようにする必要があります。

image

ステップ2: トラフィックをALB Ingressに徐々に移行

会社がテストを実行し、ALB Ingressが予想通りにトラフィックを転送できることを検証した後、会社は、ALB Ingressへのより多くのトラフィックを許可するために、ALB IngressのDNSレコードの重みを増やします。

image

手順3: NGINX Ingressに関連するリソースの削除

すべてのトラフィックがALB Ingressに移行された後、NGINX Ingressに関連するDNS設定を削除し、NGINX Ingressに関連するリソースを解放し、NGINX Ingressコントローラーをアンインストールします。 会社がステップ1からステップ3を完了すると、すべてのネットワークトラフィックがNGINX IngressからALB Ingressに移行されます。 移行プロセスはユーザーに対して透過的です。

image

前提条件

kubectlクライアントがACKクラスターに接続されています。 詳細については、「クラスターのkubeconfigファイルを取得し、kubectlを使用してクラスターに接続する」をご参照ください。

ステップ1: ALB Ingressの設定

  1. ACKコンソールにログインし、移行するクラスターにALB Ingressコントローラーをインストールします。 詳細については、「ALB Ingressコントローラーの管理」をご参照ください。 移行ツールが自動的にAlbConfigIngressClass、およびIngressを変換するため、Gateway SourceNoneに設定します。

    重要

    ALB IngressからACK専用クラスターへのアクセスを許可するには、サービスをデプロイする前にALB Ingressコントローラーにアクセス権限を付与します。 詳細については、「ACK専用クラスターにALB Ingressコントローラーへのアクセスを許可する」をご参照ください。

  2. 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
  3. 次のコードを実行してジョブを実行します。 ジョブは、NGINX Ingressコントローラーの設定をAlbConfigIngressClass、および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
  4. ジョブが属するポッドを表示します。

    kubectl get pod -l job-name=ingress2albconfig

    期待される出力:

    NAME                READY   STATUS      RESTARTS   AGE
    ingress2albconfig-vw***   0/1     Completed   0          16m
  5. ポッドのログを表示します。

    kubectl logs ingress2albconfig-vw*** # Replace it with the Pod name obtained in the last step.

    次のコードは、期待される出力を示しています。 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 # Replace it with the ID of the vSwitch in the VPC.
        - vSwitchId: vsw-xxx # Replace it with the ID of the vSwitch in the VPC.
      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の設定を確認することを推奨します。

注釈

Nginx Ingressアノテーション

ALBイングレス注釈

nginx.ingress.kubernetes.io /カナリア

alb.ingress.kubernetes.io /カナリア

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-exposure-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 /ロードバランス

alb.ingress.kubernetes.io/backend-scheduler

nginx.ingress.kubernetes.io/upstream-hash-by

alb.ingress.kubernetes.io/backend-scheduler-uch-value

ステップ2: トラフィックをALB Ingressに徐々に移行する

警告
  • 移行プロセスを開始する前に、NGINX IngressとALB Ingressの転送ルールを比較して、転送ルールが同じであることを確認します。 問題が発生した場合は、すべての構成をテストする必要があります。

  • オフピーク時にネットワークトラフィックを切り替えることを推奨します。

CLBインスタンスの一時ドメイン名の設定

DNSでは、AレコードとCNAMEレコードに同じドメイン名を同時に追加することはできません。 さらに、ALBインスタンスはデフォルトドメイン名を使用してサービスを提供します。 したがって、CLBインスタンスの一時ドメイン名を設定する必要があります。

  1. Alibaba Cloud DNS コンソールにログインします。

  2. [ドメイン名解決] ページで、ドメイン名www.example.netを見つけてクリックします。 このドメイン名は、CLBインスタンスのIPアドレスを指します。

  3. [DNS設定] ページで、[DNSレコードの追加] をクリックします。 [DNSレコードの追加] パネルで、次のパラメーターを設定し、[OK] をクリックします。

    パラメーター

    説明

    レコードタイプ

    ドロップダウンリストから [CNAME] を選択します。

    ホスト名

    ドメイン名のプレフィックスを入力します。 この例では、wwwが指定されています。

    DNSリクエストソース

    [デフォルト] を選択します。

    レコード値

    一時ドメイン名を入力します。 この例では、web0.example.netが指定されています。

    TTL

    DNSサーバーにキャッシュされるCNAMEレコードの有効期限 (TTL) 値を指定します。 この例では、デフォルト値が使用されます。

  4. [DNS設定] タブで、ドメイン名www.example.netをCLBインスタンスのIPアドレスにマッピングするAレコードを見つけ、[操作] 列の [変更] をクリックします。

  5. [DNSレコードの変更] パネルで、[ホスト名] パラメーターの値を変更し、[OK] をクリックします。 この例では、Hostnameパラメーターはweb0に設定されています。 他のパラメータは変更されない。

    説明

    設定が完了すると、ドメイン名www.example.netweb0.example.netにマップされ、AレコードによってCLBインスタンスのIPアドレスに解決されます。

ALBインスタンスのCNAMEレコードの追加

  1. 次のコマンドを実行して、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
  2. [DNS設定] ページで、[DNSレコードの追加] をクリックします。 [DNSレコードの追加] パネルで、次のパラメーターを設定し、[OK] をクリックします。

    パラメーター

    説明

    レコードタイプ

    ドロップダウンリストから [CNAME] を選択します。

    ホスト名

    ドメイン名のプレフィックスを入力します。 この例では、wwwが指定されています。

    DNSリクエストソース

    [デフォルト] を選択します。

    レコード値

    ALBインスタンスのドメイン名を入力します。

    TTL

    DNSサーバーにキャッシュされるCNAMEレコードのTTL値を指定します。 この例では、デフォルト値が使用されます。

CNAMEレコードの重みの設定

  1. [ドメイン名の解決] ページで、左側のナビゲーションウィンドウで [重み設定] をクリックします。

  2. [重み付きラウンドロビン] ページで、[操作] 列の [EnableWeight] をクリックし、[重みの設定] をクリックします。

  3. [重みの設定] パネルで、CLBインスタンスとALBインスタンスのDNSレコードの重みを設定します。 CLBインスタンスのDNSレコードの重みを100に設定します。 NLBインスタンスのDNSレコードの重みを0に設定します。

    域名权重设置

  4. CLBインスタンスのDNSレコードの重みを徐々に減らし、ALBインスタンスのDNSレコードの重みを徐々に増やします。 サービスが影響を受けないようにしてください。

  5. サービスのポッドがデプロイされているワーカーノードにログインし、digコマンドを複数回実行してトラフィック量を確認します。

    流量测试1流量测试2

  6. CLB DNSレコードの重みを徐々に0に減らし、ALB DNSレコードを徐々に100に増やします。

DNSサービスプロバイダーがCNAMEレコードの重みをサポートしていない場合は、をクリックしてトラフィック切り替えソリューションを表示します。

临时流量切换方案

手順3: NGINX Ingressに関連するリソースの削除

NGINX Ingress上のすべての永続接続を閉じ、トラフィックがNGINX Ingressに転送されない場合、監視期間後に冗長リソースを解放できます。

  1. Alibaba Cloud DNSコンソールにログインし、NGINX Ingressに関連するすべてのDNSレコードを削除します。

  2. NGINX Ingressコントローラをアンインストールします。

    1. ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。

    2. 詳細ページの左側のナビゲーションウィンドウで、[ネットワーク] > [Ingress] を選択します。

    3. NGINX Ingressを見つけ、[操作] 列で image /> [削除] を選択します。 表示されたメッセージボックスで [OK] をクリックします。

    4. 左側のナビゲーションウィンドウで、[操作] > [アドオン] を選択します。 [ネットワーキング] タブをクリックし、Nginx Ingress Controllerカードを見つけて、[アンインストール] をクリックします。

    5. 表示されたメッセージボックスで、[OK] をクリックします。

      説明

      NGINX Ingressコントローラーに関連付けられているCLBインスタンスは、NGINX Ingressコントローラーとともにリリースされます。 リリースされたリソースに対して課金されなくなりました。

関連ドキュメント