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

Container Service for Kubernetes:NGINX Ingress Controller のネットワークタイプの設定

最終更新日:Dec 15, 2025

NGINX Ingress Controller をパブリックアクセス、プライベートアクセス、またはデュアルアクセス用に設定することで、さまざまなネットワーク環境のクライアントに対応できます。

仕組み

image

クラスターでは、Server Load Balancer (SLB) インスタンスがクライアントリクエストを受信し、それらを NGINX Ingress Controller のワークロードに転送します。その後、ワークロードはリクエストを他の Service に転送します。

パブリックアクセスとプライベートアクセスの両方に対応する NGINX Ingress の設定

パブリックアクセスとプライベートアクセスの両方を有効にするには、NGINX Ingress Controller のバックエンド Pod をターゲットとする 2 つの Service をデプロイします。1 つはパブリック SLB インスタンスに、もう 1 つは内部 (プライベート) SLB インスタンスにそれぞれ関連付けます。

  1. 現在の SLB インスタンスのネットワークタイプを確認します。

    kubectl describe service -n kube-system nginx-ingress-lb | grep "service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type"

    出力に intranet が含まれている場合、現在の SLB は内部向けです。それ以外の場合は、パブリック向けです。

  2. パブリックと内部の両方のタイプを揃えるために、新しい Service を作成します。

    nginx-ingress-lb-new.yaml という名前のファイルを作成します。次に、kubectl apply -f nginx-ingress-lb-new.yaml を実行して Service を作成します。

    内部 Service

    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-ingress-lb-intranet
      namespace: kube-system
      labels:
        app: nginx-ingress-lb
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: intranet # SLB インスタンスのアドレスタイプが内部であることを指定します。
    spec:
      type: LoadBalancer
      externalTrafficPolicy: "Cluster"
      ports:
      - port: 80
        name: http
        targetPort: 80
      - port: 443
        name: https
        targetPort: 443
      selector:
        app: ingress-nginx

    パブリック Service

    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-ingress-lb-internet
      namespace: kube-system
      labels:
        app: nginx-ingress-lb
    spec:
      type: LoadBalancer
      externalTrafficPolicy: "Cluster"
      ports:
      - port: 80
        name: http
        targetPort: 80
      - port: 443
        name: https
        targetPort: 443
      selector:
        app: ingress-nginx
  3. 新しい Service が正しく機能していることを確認します。次のコマンドの <service-name> を新しい Service の名前に置き換えます。200 応答は、新しい Service が正しく機能していることを示します。

    curl -s -o /dev/null -w "%{http_code}\n" http://$(kubectl get service -n kube-system <service-name> -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
  4. 新しい Service の外部 IP を取得し、それに応じて DNS レコードを設定します。次のコマンドの <service-name> を新しい Service の名前に置き換えます。

    kubectl get service <service-name>

    内部 Service

    1. Alibaba Cloud DNS-Private Zone にログインします。[Authoritative Zone] > [User Defined Zones] タブで、[Add Zone] をクリックします。すでにゾーンを追加している場合は、ステップ c に進みます。

    2. [Authoritative Zone] フィールドにドメイン名を入力します。他のオプションはデフォルト設定のままにして、[OK] をクリックします。

    3. ターゲットゾーンをクリックします。[Settings] タブで、[Add Record] をクリックします。次の表の値を入力し、他のパラメーターはデフォルト設定のままにして、[OK] をクリックします。

      パラメーター

      Record Type

      A

      Hostname

      必要に応じてサブドメインのプレフィックスを入力します。

      Record Value

      新しい Service の IP アドレス。

    4. [User Defined Zones] リストに戻ります。ターゲットゾーンの [Actions] 列で、[Effective Scope] をクリックします。[Effective In VPCs] オプションで、Container Service for Kubernetes (ACK) クラスターが配置されている VPC を選択し、[OK] をクリックします。

    パブリック Service

    1. Alibaba Cloud DNS-Public Zone にログインします。ターゲットゾーンをクリックして [Settings] ページに移動します。[Add Record] ボタンをクリックします。

    2. 次の表の値を入力します。他のパラメーターはデフォルト設定のままにして、[OK] をクリックします。

      パラメーター

      Record Type

      A

      Hostname

      必要に応じてサブドメインのプレフィックスを入力します。

      Record Value

      新しい Service の IP アドレス。

ネットワークタイプの変更

重要

この手順では、Service を削除して再作成するため、関連付けられている SLB インスタンスが置き換えられます。これにより、NGINX Ingress へのトラフィックが一時的に中断されます。元の SLB インスタンスとそれに関連付けられた IP アドレスは復元できません。

  1. 既存の SLB インスタンスにトラフィックがないことを確認します。

    1. ACK コンソール にログインし、ターゲットクラスターをクリックします。左側メニューで、[ネットワーク] > [Services] を選択します。kube-system 名前空間で nginx-ingress-lb Service を見つけ、その [外部 IP] を記録します。

    2. Classic Load Balancer (CLB) コンソール にログインします。ページの上部で、クラスターと同じリージョンを選択します。前のステップの IP アドレスと一致する [IP アドレス] を持つ CLB インスタンスを見つけます。CLB インスタンスをクリックし、[モニタリング] タブに移動して、インスタンスのアクティブな接続がゼロであることを確認してから次に進んでください。

  2. NGINX Ingress Controller で使用されている現在の Service を削除します。

    kubectl delete svc -n kube-system nginx-ingress-lb
  3. 新しい Service を作成します。以下の適切なマニフェストを nginx-ingress-lb.yaml として保存し、コマンド kubectl apply -f nginx-ingress-lb.yaml を実行して適用します。

    重要

    新しい Service には nginx-ingress-lb という名前を付ける必要があります。

    内部 Service

    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-ingress-lb
      namespace: kube-system
      labels:
        app: nginx-ingress-lb
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: intranet # SLB インスタンスのアドレスタイプが内部であることを指定します。
    spec:
      type: LoadBalancer
      externalTrafficPolicy: "Cluster"
      ports:
      - port: 80
        name: http
        targetPort: 80
      - port: 443
        name: https
        targetPort: 443
      selector:
        app: ingress-nginx

    パブリック Service

    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-ingress-lb
      namespace: kube-system
      labels:
        app: nginx-ingress-lb
    spec:
      type: LoadBalancer
      externalTrafficPolicy: "Cluster"
      ports:
      - port: 80
        name: http
        targetPort: 80
      - port: 443
        name: https
        targetPort: 443
      selector:
        app: ingress-nginx
  4. 新しい Service をテストします。200 応答コードは、正しく機能していることを示します。

    curl -s -o /dev/null -w "%{http_code}\n" http://$(kubectl get service -n kube-system nginx-ingress-lb -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
  5. kubectl get service nginx-ingress-lb を実行し、 Service の外部 IP を記録します。次に、新しい Service タイプに基づいて DNS 名前解決を設定します。

    内部 Service

    1. Alibaba Cloud DNS-Private Zone にログインします。[Authoritative Zone] > [User Defined Zones] タブで、[Add Zone] をクリックします。すでにゾーンを追加している場合は、ステップ c に進みます。

    2. [Authoritative Zone] フィールドにドメイン名を入力します。他のオプションはデフォルト設定のままにして、[OK] をクリックします。

    3. ターゲットゾーンをクリックします。[Settings] タブで、[Add Record] をクリックします。次の表の値を入力し、他のパラメーターはデフォルト設定のままにして、[OK] をクリックします。

      パラメーター

      Record Type

      A

      Hostname

      必要に応じてサブドメインのプレフィックスを入力します。

      Record Value

      新しい Service の IP アドレス。

    4. [User Defined Zones] リストに戻ります。ターゲットゾーンの [Actions] 列で、[Effective Scope] をクリックします。[Effective In VPCs] オプションで、Container Service for Kubernetes (ACK) クラスターが配置されている VPC を選択し、[OK] をクリックします。

    パブリック Service

    1. Alibaba Cloud DNS-Public Zone にログインします。ターゲットゾーンをクリックして [Settings] ページに移動します。[Add Record] ボタンをクリックします。

    2. 次の表の値を入力します。他のパラメーターはデフォルト設定のままにして、[OK] をクリックします。

      パラメーター

      Record Type

      A

      Hostname

      必要に応じてサブドメインのプレフィックスを入力します。

      Record Value

      新しい Service の IP アドレス。

よくある質問

古い Service を削除する前に新しい Service を作成できないのはなぜですか?

これは不可能です。なぜなら、NGINX Ingress Controller コンポーネントはアップグレードや調整中に、ワークロードがデフォルト名 nginx-ingress-lb を持つ Service を使用してマッチングを行うことを前提としているためです。Service 名は名前空間内で一意でなければならないため、古い Service がまだ存在している間は、この名前で新しい Service を作成することはできません。まず古い Service を削除してください。

クライアントのアクセス IP がコンソールに表示されるエンドポイントと異なるのはなぜですか?

ACK コンソールの [Ingresses] ページに表示される [エンドポイント] は、nginx-ingress-lb という名前の Service にのみ関連付けられている SLB インスタンスの IP アドレスです。複数の LoadBalancer Service を設定した場合、Ingress Controller はそれらすべてからのトラフィックを正しくルーティングしますが、コンソールにはそれらの IP は表示されません。クライアントが実際に使用する IP アドレスは DNS 設定によって決まり、コンソールに表示されるものとは異なる SLB インスタンスを指している可能性があります。

nginx-ingress-lb Service を削除して再作成した場合は、Ingress リソースを更新して、コンソールに表示されるエンドポイントの表示を更新する必要があります。

変更操作が失敗した場合、どのようにロールバックすればよいですか?

ネットワークタイプの変更が失敗した場合は、次の手順に従って Ingress エントリポイントを復元します。

  1. 失敗した Service の削除: 作成した新しい Service を削除して、デフォルト Service の再作成を妨げる名前の競合を解消します。

  2. コンポーネントの再インストール: ACK コンソールで、NGINX Ingress Controller をアンインストールして再インストールします。この操作により、デフォルトの nginx-ingress-lb Service が再作成され、Ingress エントリポイントが復元されます。

  3. DNS の更新: 新しい nginx-ingress-lb Service に対して DNS 名前解決を設定します。ドメインがその新しい外部 IP を指すように設定し、トラフィックが正しくルーティングされていることを確認します。

関連ドキュメント

既存 SLB インスタンスのアノテーション設定の詳細については、「既存 SLB インスタンスの使用」をご参照ください。