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

Server Load Balancer:セルフマネージド NGINX から ALB イングレスへの移行

最終更新日:May 21, 2026

移行を円滑に進めるため、自動移行ツールを使用して、NGINX イングレスの構成を ALB イングレス形式に変換し、手動作業を省略できます。本ガイドでは、DNS 解決を利用してトラフィックを新しい ALB イングレスに徐々に切り替えるゼロダウンタイム移行を紹介します。

移行プロセス

ドメイン名を NGINX イングレスと ALB イングレスの両方に解決させ、それぞれの重みを徐々に調整することで、クライアント側でのシームレスな移行を実現できます。以下の図は、DNS 解決を利用したゼロダウンタイム移行の一般的なプロセスを示しています。各ステップの詳細は、下記の移行例で説明します。

DNS 解決によるトラフィックの切り替えは、ゼロダウンタイム移行を実現する方法の 1 つです。このプロセスは参考情報として提供されています。

移行例

以下の例では、具体的な操作内容とその動作を含めた移行プロセスを説明します。

ある企業は、クラスター内に NGINX イングレスコントローラーをインストールしています。このコントローラーの Service はインターネット向けの LoadBalancer 型であり、自動的にインターネット向けの CLB インスタンスをプロビジョニングします。また、クライアントが www.example.net にアクセスすると、そのリクエストが CLB に解決され、バックエンドの Pod に転送されるよう DNS 解決が構成されています。

ステップ 1:ALB イングレスの構成

ビジネストラフィックの増加に伴い、NGINX イングレスではパフォーマンス要件を満たせなくなり、運用管理 (O&M) コストも高くなっています。そのため、企業は NGINX イングレスから ALB イングレスへの移行を決定しました。移行中は、移行ツールを使用して NGINX イングレスの構成を ALB イングレスの構成に変換し、さらに新しい ALB イングレスを低い重みで DNS 解決に追加します。

重要

DNS プロトコルでは、ドメイン名を同時に A レコードと CNAME レコードの両方に解決することはできません。CLB インスタンスは IP アドレス経由でリクエストを受け取りますが、ALB インスタンスはデフォルトドメイン名を公開してサービスを提供します(詳細については、「Application Load Balancer とは」をご参照ください)。したがって、NGINX イングレスと ALB イングレス間で重みベースのトラフィック分散を実現するには、CLB インスタンス用の一時ドメイン名を構成する必要があります。

ステップ 2:ALB イングレスへのトラフィックを徐々に切り替え

ALB イングレスが期待通りに動作することを確認した後、ALB イングレスの DNS 解決重みを増やして、より多くのトラフィックを ALB イングレス経由で処理するようにします。

ステップ 3:NGINX イングレスリソースの削除

すべてのトラフィックが ALB イングレスに完全に移行された後、企業は NGINX イングレス関連の DNS エントリを削除し、NGINX イングレスリソースを削除して、NGINX イングレスコントローラーアドオンをアンインストールします。これにより、NGINX イングレスから ALB イングレスへのゼロダウンタイム移行が完了します。

前提条件

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

ステップ 1:ALB イングレスの構成

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

    重要

    ACK 専用クラスターで ALB イングレス経由でサービスにアクセスする場合は、サービスをデプロイする前に ALB イングレスコントローラーに権限を付与する必要があります。詳細については、「ACK 専用クラスターで ALB イングレスコントローラーに権限を付与する」をご参照ください。

  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. 次のコマンドを実行してジョブを開始します。このジョブは、既存の NGINX イングレスコントローラーの構成を自動的に AlbConfigIngressClassIngress などのリソースに変換し、結果を出力します。出力内容はログで確認できます。

    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. ジョブに属する 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 イングレスが構成されます。

    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 イングレスのアノテーションを ALB イングレスのアノテーションに自動的に変換します。

重要

次の表に含まれない NGINX イングレスのアノテーションは、変換時に無視されます。変換後は、ALB イングレスの構成が期待通りに機能することを確認してください。

アノテーション一覧

NGINX イングレスアノテーション

ALB イングレスアノテーション

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 イングレスへのトラフィックを徐々に切り替え

警告
  • トラフィックを切り替える前に、NGINX イングレスと ALB イングレスの転送ルールを比較し、同一の機能であることをテストで確認してください。これにより、切り替え時の予期しないビジネスへの影響を防げます。

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

  • ALB イングレスを構成した後は、カナリアリリースとして少量のトラフィックを ALB イングレスに送信し、転送ルールと構成が正しいことを確認してから、徐々に重みを増やしてください。これにより、構成の不一致による直接的な切り替えによるトラフィック損失を防げます。

CLB インスタンス用の一時ドメインの構成

DNS プロトコルでは、ドメイン名を同時に 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

    TTL (Time To Live) は、DNS レコードが DNS サーバーにキャッシュされる時間を指定します。デフォルト値のままにしてください。

    説明

    構成を完了すると、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

    TTL (Time To Live) は、DNS レコードが DNS サーバーにキャッシュされる時間を指定します。デフォルト値のままにしてください。

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

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

  2. Edit Recordパネルで、CLB および ALB インスタンスの DNS レコードの重みを設定します。CLB インスタンスに対応するレコードの重みを 100、ALB インスタンスに対応するレコードの重みを 0 に設定し、OKをクリックします。

  3. ビジネスへの影響がないことを確認した後、CLB インスタンスの DNS レコードの重みを徐々に下げると同時に、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 インスタンスの DNS レコードの重みを 0、ALB インスタンスのレコードの重みを 100 に徐々に設定します。

ご利用の DNS サービスプロバイダーが CNAME レコードの重み設定をサポートしていない場合、代替のトラフィック切り替えソリューションをご覧ください。

临时流量切换方案

ステップ 3:NGINX イングレスリソースの削除

NGINX イングレスへのすべての接続保持が終了し、新しいトラフィックが送信されなくなった後、ビジネス要件に応じた適切な期間システムを監視し、冗長リソースを解放できます。

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

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

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

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

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

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

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

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

関連ドキュメント