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

Server Load Balancer:NGINX Ingress から ALB Ingress への移行

最終更新日:Jul 08, 2026

自動移行ツールを使用して NGINX Ingress の設定を ALB Ingress のフォーマットに変換することで、手動での作業を不要にします。DNS ベースの重み調整によってトラフィックを段階的に移行し、ゼロダウンタイムを実現します。

移行プロセス

ドメイン名を NGINX Ingress と ALB Ingress の両方に解決させ、DNS の重みを段階的に調整することで、トラフィックをシームレスに移行します。以下の図にそのプロセスを示します。移行例で詳細な手順を後述します。

DNS ベースのトラフィック移行は、ゼロダウンタイム移行の一つのアプローチです。このプロセスは参考用です。

移行例

以下の例では、具体的な操作を交えて移行手順を説明します。

ある企業が、クラスター内で NGINX Ingress コントローラーを実行しているとします。このコントローラーのインターネット向け LoadBalancer タイプの Service は、インターネット向けの Classic Load Balancer (CLB) インスタンスを自動的にプロビジョニングします。DNS は www.example.net をこの CLB に解決し、CLB がリクエストをバックエンドの Pod に転送します。

ステップ 1:ALB Ingress の設定

NGINX Ingress がパフォーマンス要件を満たせなくなり、運用保守コストも高騰しています。そこで、この企業は移行ツールを使用して NGINX Ingress の設定を ALB Ingress に変換し、より低い重みで ALB Ingress を DNS に追加します。

重要

DNS では、1つのドメイン名を A レコードと CNAME レコードの両方に同時に解決することはできません。CLB インスタンスは IP アドレス経由でリクエストを受け取りますが、ALB インスタンスはデフォルトドメイン名を公開します (詳細については、「Application Load Balancer とは」をご参照ください)。重み付けに基づくトラフィック分散を有効にするには、CLB インスタンスに一時ドメイン名を設定する必要があります。

ステップ 2:ALB Ingress へのトラフィックの段階的な移行

ALB Ingress が期待どおりに動作することを確認した後、ALB Ingress の DNS の重みを増やし、より多くのトラフィックが経由するようにします。

ステップ 3:NGINX Ingress リソースの削除

すべてのトラフィックが ALB Ingress に移行された後、NGINX Ingress の DNS エントリを削除し、NGINX Ingress リソースを削除し、NGINX Ingress コントローラーアドオンをアンインストールします。

前提条件

kubectl クライアントが ACK クラスターに接続されていること。詳細については、「kubectl を使用して ACK クラスターに接続する」をご参照ください。

ステップ 1:ALB Ingress の設定

  1. Container Service for Kubernetes (ACK) コンソールにログインし、移行を実行するクラスターに ALB Ingress コントローラーアドオンをインストールしますContainer Compute Service コンソールにログインし、移行を実行するクラスターに ALB Ingress コントローラーアドオンをインストールします 移行ツールは AlbConfigIngressClassIngress リソースを自動的に変換するため、アドオンをインストールする際は、[ALB インスタンス][なし] を選択してください。

    重要

    ACK 専用クラスターで ALB Ingress を介してサービスにアクセスするには、サービスをデプロイする前に ALB Ingress コントローラーに権限を付与する必要があります。ACK 専用クラスターで ALB Ingress コントローラーに権限を付与する

  2. 以下の内容で `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
  3. 次のコマンドを実行して Job を開始します。この Job は、既存の NGINX Ingress 設定を AlbConfigIngressClassIngress などのリソースに変換し、結果を Pod のログに出力します。

    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. Job に属する Pod を表示します。

    kubectl get pod -l job-name=ingress2albconfig

    想定される出力:

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

    kubectl logs ingress2albconfig-vw*** # 前のステップで取得した Pod 名に置き換えてください。

    想定される出力。これらのリソースをクラスターにデプロイして、ALB Ingress を設定します。

    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 Ingress アノテーションを ALB Ingress アノテーションに変換します。

重要

この表にないアノテーションは変換中に無視されます。変換後に ALB Ingress の設定を確認してください。

アノテーション一覧

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

ステップ 2:ALB Ingress へのトラフィックの段階的な移行

警告
  • トラフィックを切り替える前に、NGINX Ingress と ALB Ingress の転送ルールを比較・テストし、機能が同一であることを確認してください。

  • トラフィックの切り替えはオフピーク時に行ってください。

  • ALB Ingress を設定した後、カナリアリリースとして少量のトラフィックを転送します。重みを徐々に増やす前に、転送ルールと設定を確認してください。

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

DNS は、1つのドメイン名を A レコードと CNAME レコードの両方に解決することをサポートしていません。ALB インスタンスはデフォルトドメイン名を使用するため、CLB インスタンスに一時ドメイン名を設定する必要があります。

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

  2. インターネットの権威ある DNS 解決 ページで、移行対象の CLB インスタンスを指す DNS ドメイン名 www.example.net を見つけてクリックします。

  3. 解決設定 ページで、www.example.net から CLB インスタンスの IP アドレスを指す A レコードを見つけます。Actions 列で Edit をクリックします。

  4. Edit Record パネルで ホストレコード を変更し、OK をクリックします。この例では、ホストレコード を `web0` に変更します。他のパラメーターは変更しません。

  5. 解決設定 ページで Add Record をクリックします。Add Record パネルで、次のパラメーターを設定し、OK をクリックします。

    パラメーター

    説明

    Record Type

    [CNAME] を選択します。

    Hostname

    ドメイン名のプレフィックスです。この例では、www と入力します。

    Query Source

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

    Record Value

    一時ドメイン名を入力します。この例では、web0.example.net と入力します。

    TTL

    デフォルト値のままにします。

    説明

    これで、CNAME レコードは www.example.netweb0.example.net に解決し、A レコードは web0.example.net を 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. 解決設定 ページで Add Record をクリックします。Add Record パネルで、次のパラメーターを設定し、OK をクリックします。

    パラメーター

    説明

    Record Type

    [CNAME] を選択します。

    Hostname

    ドメイン名のプレフィックスです。この例では、www と入力します。

    Query Source

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

    Record Value

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

    TTL

    デフォルト値のままにします。

トラフィックの重みの設定

  1. 解決設定 ページで、前のステップで追加した CNAME レコードを見つけます。Actions 列で、Edit の横にある矢印をクリックし、レコードセットを変更する を選択します。

  2. Edit Record パネルで、CLB の重みを 100、ALB の重みを 0 に設定します。OK をクリックします。

  3. ビジネスへの影響がないことを確認した後、CLB の重みを徐々に減らし、ALB の重みを増やします。

  4. 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
  5. 確認後、徐々に CLB の重みを 0 に、ALB の重みを 100 に設定します。

お使いの DNS サービスプロバイダーが CNAME レコードの重み設定をサポートしていない場合は、ここをクリックして代替のトラフィック移行ソリューションをご確認ください。

Alternative traffic shifting solution

ステップ 3:NGINX Ingress リソースの削除

NGINX Ingress へのすべての永続的な接続が閉じられ、新しいトラフィックが到達しなくなった後、ビジネスに適した期間システムを監視してから、冗長なリソースを解放します。

  1. Alibaba Cloud DNS コンソールから NGINX Ingress 関連の DNS エントリを削除します。

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

    1. ACK コンソールにログインします。

    2. クラスターリスト ページで、対象クラスターの名前をクリックします。左側のナビゲーションウィンドウで、ネットワーク > Ingress を選択します。

    3. NGINX Ingress を見つけます。アクション 列で、image > 削除 を選択します。表示されるダイアログボックスで、削除する をクリックします。

    4. 左側のナビゲーションウィンドウで アドオン管理 を選択します。ネットワーク タブをクリックします。NGINX Ingress controller カードで、アンインストール をクリックします。

    5. 表示されるダイアログボックスで、OK をクリックします。

      アドオンをアンインストールすると、NGINX Ingress コントローラーが使用していた CLB インスタンスが自動的に解放され、料金は発生しなくなります。
  3. Container Compute Service コンソールにログインします。左側のナビゲーションウィンドウで、[アプリケーション] > [Helm] をクリックし、NGINX Ingress コントローラーアドオンをアンインストールします。

関連ドキュメント