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

Server Load Balancer:セルフマネージド Nginx Ingress から ALB Ingress への移行に関するベストプラクティス

最終更新日:Apr 01, 2026

ACK 移行ツールを使用して、セルフマネージド NGINX Ingress から Application Load Balancer (ALB) Ingress へ、ダウンタイムなしでトラフィックをシフトします。この移行は、次の目的で設計されています。

  • ダウンタイムなし — トラフィックは段階的にシフトされるため、ご利用のユーザーは中断を経験しません。

  • 段階的なロールアウトをサポート — DNS の重みを自分のペースで調整し、いつでもロールバックできます。

  • 切り替え前の完全な検証を許可 — NGINX を廃止する前に、ライブトラフィックで ALB Ingress の動作をテストします。

移行ツール(ingress2albconfig)は、NGINX Ingress 構成を AlbConfigIngressClass、および Ingress リソースに自動的に変換します。変換後は、トラフィックの切り替えを行う前に、出力を確認およびテストしてください — 自動変換では、手動による検証が不要になるわけではありません。

仕組み

ドメイン名を NGINX Ingress と ALB Ingress の両方に同時に解決し、すべてのトラフィックが ALB Ingress を通過するまで DNS の重みを段階的にシフトします。NGINX Ingress は常に稼働し続けるため、重みを調整することでロールバックできます。

image
説明

このガイドでは、トラフィックのシフトに Alibaba Cloud DNS を使用しています。重み付けされた CNAME レコードをサポートする他の DNS サービスも同様に機能します。

背景情報

ある企業は、クラシックロードバランサー (CLB) インスタンスによってバックアップされたインターネット向けの LoadBalancer サービスを通じて公開されている ACK クラスターで NGINX Ingress コントローラーを実行しています。ドメイン www.example.net には、CLB の IP アドレスを指す A レコードがあります。すべてのインバウンドリクエストは CLB に解決され、CLB がそれらをバックエンドの Pod に転送します。

image

目標は、既存のセットアップを完全に稼働させながら、すべてのトラフィックを ALB Ingress に移行することです。

前提条件

開始する前に、以下を確認してください。

ステップ 1: ALB Ingress の構成

ALB Ingress コントローラーのインストール

  1. ACK コンソールACK コンソールにログオンし、対象のクラスターに ALB Ingress コントローラーをインストールします。 詳細については、「ALB Ingress コントローラーの管理」をご参照ください。 プロンプトが表示されたら、[ALB Instance][None] に設定します。 移行ツールは AlbConfigIngressClass、および Ingress を自動的に変換します。ALB インスタンスを事前に作成しないでください。

    重要

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

移行ツールの実行

  1. 次の内容で ingress2albconfig.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
  2. マニフェストを適用してジョブを実行します。

    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
  3. ジョブの Pod 名を取得します。

    kubectl get pod -l job-name=ingress2albconfig

    予想される出力:

    NAME                      READY   STATUS      RESTARTS   AGE
    ingress2albconfig-vw***   0/1     Completed   0          16m
  4. Pod ログで変換された構成を表示します。

    重要

    このツールは NGINX アノテーションを ALB アノテーションに自動的に変換しますが、アノテーション変換リファレンスにリストされているサポートされているアノテーションのみが対象です。このリストにない NGINX アノテーションは黙って破棄されます。変換された Ingress を注意深く確認し、続行する前に不足している動作を手動で再構成してください。

    kubectl logs ingress2albconfig-vw***   # 前のステップの Pod 名に置き換えます。

    出力には、生成された AlbConfigIngressClass、および 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: {}
  5. 変換されたリソースをクラスターに適用して、ALB Ingress を作成します。

アノテーション変換リファレンス

次の NGINX Ingress アノテーションは、ALB Ingress の同等物に自動的に変換されます。ここにリストされていないアノテーションは変換されません。ALB で同等の動作が必要な場合は、手動で構成してください。

NGINX Ingress アノテーションALB Ingress アノテーション備考
nginx.ingress.kubernetes.io/canaryalb.ingress.kubernetes.io/canary
nginx.ingress.kubernetes.io/canary-by-headeralb.ingress.kubernetes.io/canary-by-header
nginx.ingress.kubernetes.io/canary-by-header-valuealb.ingress.kubernetes.io/canary-by-header-value
nginx.ingress.kubernetes.io/canary-by-cookiealb.ingress.kubernetes.io/canary-by-cookie
nginx.ingress.kubernetes.io/canary-weightalb.ingress.kubernetes.io/canary-weight
nginx.ingress.kubernetes.io/use-regexalb.ingress.kubernetes.io/use-regex
nginx.ingress.kubernetes.io/rewrite-targetalb.ingress.kubernetes.io/rewrite-target
nginx.ingress.kubernetes.io/ssl-redirectalb.ingress.kubernetes.io/ssl-redirect
nginx.ingress.kubernetes.io/enable-corsalb.ingress.kubernetes.io/enable-cors
nginx.ingress.kubernetes.io/cors-allow-originalb.ingress.kubernetes.io/cors-allow-origin
nginx.ingress.kubernetes.io/cors-allow-methodsalb.ingress.kubernetes.io/cors-allow-methods
nginx.ingress.kubernetes.io/cors-allow-headersalb.ingress.kubernetes.io/cors-allow-headers
nginx.ingress.kubernetes.io/cors-expose-headersalb.ingress.kubernetes.io/cors-expose-headers
nginx.ingress.kubernetes.io/cors-allow-credentialsalb.ingress.kubernetes.io/cors-allow-credentials
nginx.ingress.kubernetes.io/backend-protocolalb.ingress.kubernetes.io/backend-protocol
nginx.ingress.kubernetes.io/load-balancealb.ingress.kubernetes.io/backend-scheduler
nginx.ingress.kubernetes.io/upstream-hash-byalb.ingress.kubernetes.io/backend-scheduler-uch-value
その他の NGINX アノテーション変換されません。必要に応じて手動で構成してください。

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

警告

トラフィックをシフトする前に、NGINX Ingress と ALB Ingress の転送ルールを比較して、それらが一致することを確認してください。続行する前にすべての構成をテストしてください。オフピーク時間中にトラフィックをシフトします。

DNS は、同じホスト名に対して A レコードと CNAME レコードの両方を同時に持つことはできません。CLB インスタンスは IP アドレス (A レコード) を使用しますが、ALB インスタンスはドメイン名 (CNAME レコード) を使用します。移行中に両方を並行して実行するには、CLB に一時ドメインを割り当てて、DNS が CNAME によって両方のエンドポイントを解決できるようにします。

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

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

  2. [権威あるDNS解決] ページで、ドメイン名 www.example.net を見つけてクリックします。

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

    パラメーター
    レコードタイプCNAME
    ホスト名www
    DNS リクエストソースDefault
    レコード値web0.example.net (一時ドメイン)
    TTLDefault
  4. www.example.net を CLB IP アドレスに対応付ける既存の A レコードを見つけます。「操作」列で [変更] をクリックします。

  5. [DNS レコードの変更] パネルで、[ホスト名]web0 に変更し、[OK] をクリックします。この変更後、www.example.net は CNAME を使用して web0.example.net に解決され、web0.example.net は A レコードを使用して CLB IP に解決されます。

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

  1. ALB インスタンスのドメイン名を取得します。

    kubectl get albconfig

    予想される出力:

    NAME         ALBID                    DNSNAME                                               PORT&PROTOCOL   CERTID   AGE
    from_nginx   alb-a8mmh2tqbmrm11****   alb-a8mmh2tqbmrm11****.cn-hangzhou.alb.aliyuncs.com                            20m

    DNSNAME 列の値 (alb-a8mmh2tqbmrm11****.cn-hangzhou.alb.aliyuncs.com) が ALB インスタンスのドメイン名です。

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

    パラメーター
    レコードの種類CNAME
    ホスト名www
    DNS リクエストのソースDefault
    値を記録前のステップで取得した ALB インスタンスのドメイン名
    TTLDefault

重みの構成とトラフィックのシフト

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

  2. 加重ラウンドロビン」ページで、「操作」列の「重みを有効化」をクリックし、次に「重みを設定」をクリックします。

  3. 初期重みを設定します。CLB は 100、ALB は 0 です。

    域名权重设置

  4. CLB の重みを徐々に減らし、ALB の重みを増やします。調整後、ご利用のサービスに影響がないことを確認してください。

  5. Service Pod を実行中のワーカーノードにログインし、dig コマンドを複数回実行して、トラフィックの分散を確認します:トラフィックテスト1トラフィックテスト2

  6. ALB の動作に問題がないことを確認したら、CLB の重みを 0、ALB の重みを 100 に設定します。

ご利用の DNS プロバイダーが重み付けされた CNAME レコードをサポートしていない場合は、この代替トラフィック切り替えアプローチを使用してください。

临时流量切换方案

ステップ 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 コントローラー] カードを見つけ、[アンインストール] をクリックします。

    5. ダイアログボックスで、[OK] をクリックします。

      説明

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

次のステップ