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

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

最終更新日:Dec 13, 2025

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 の設定

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

    重要

    ALB Ingress から ACK 専用クラスターへのアクセスを許可するには、Service をデプロイする前に 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. 次のコードを実行して Job を実行します。Job は 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. 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 名に置き換えてください。

    次のコードは想定される出力を示しています。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 の設定を確認することを推奨します。

アノテーション

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 の転送ルールを比較し、転送ルールが同じであることを確認してください。問題が発生した場合に備えて、すべての設定をテストする必要があります。

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

CLB インスタンスに一時ドメイン名を設定する

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

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

  2. [権威 DNS 解決] ページで、ドメイン名 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] をクリックします。この例では、[ホスト名] パラメーターは 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. [加重ラウンドロビン] ページで、[操作] 列の [重みを有効にする] をクリックし、[重みの設定] をクリックします。

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

    域名权重设置

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

  5. Service の Pod がデプロイされているワーカーノードにログインし、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 > [削除] を選択します。表示されるメッセージで、[削除の確認] をクリックします。

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

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

      説明

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

関連ドキュメント