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

Container Service for Kubernetes:クラスタに複数の Ingress コントローラーをデプロイする

最終更新日:May 30, 2025

このトピックでは、Container Service for Kubernetes(ACK)クラスタに複数の独立した NGINX Ingress コントローラーをデプロイして、異なるインターネット向けサービスを提供する方法について説明します。

背景情報

インターネット向けまたはイントラネット NGINX Ingress コントローラーを構成して、ACK クラスタのデフォルトの NGINX Ingress コントローラー構成を調整できます。これにより、イントラネット SLB インスタンスを使用できます。このトピックで説明されているモードは、ほとんどの要件を満たすことができます。特定のシナリオでは、一部のインターネット向けサービスは外部ユーザーがアクセスできる必要がありますが、他のサービスは同じ VPC 内のクラスタ外のワークロードからのリクエストのみを許可します。この場合、2 つの独立した NGINX Ingress コントローラーをデプロイし、それらを異なるネットワークタイプの SLB インスタンスにバインドできます。

使用上の注意

次のセクションでは、一意の IngressClass の構成とサービス名の長さ制限の指定など、複数の Ingress コントローラーの構成に関する使用上の注意について説明します。

  • 一意の IngressClass の構成

    複数の Ingress コントローラーを使用する場合は、通常の動作を保証し、競合を防ぐために、各コントローラーに一意の IngressClass を構成する必要があります。次のパラメータを変更する必要があります。

  • サービス名の長さ制限の指定

    ack-ingress-nginx-v1 という名前の Helm アプリケーションをデプロイすると、<アプリケーション名>-ack-ingress-nginx-v1-controller という形式の名前を持つサービスが自動的に作成されます。 LoadBalancer サービスのタイプが internal の場合、その名前は <アプリケーション名>-ack-ingress-nginx-v1-controller-internal 形式になります。サービス名が 63 文字を超えないようにしてください。超えると、リソースの作成が失敗し、次のエラーメッセージが表示される場合があります。

    no service with name xxx-open-api-test-inter-ack-ingress-nginx-v1-controller-internal found in namespace open-api-test-inter: services "xxx-open-api-test-inter-ack-ingress-nginx-v1-controller-internal" not found   ,

    このエラーが発生した場合は、Helm アプリケーションの名前を確認して短縮し、アプリケーションを再デプロイしてください。

新しい NGINX Ingress コントローラーのデプロイ

ACK クラスタの作成後、2 つのポッドレプリカを持つ NGINX Ingress コントローラーが自動的にデプロイされます。インターネット向け SLB インスタンスも、フロントエンドの負荷分散サービスとして作成されます。

クラスタに別の独立した NGINX Ingress コントローラーをデプロイするには、次の手順を実行します。

  1. ACK コンソール にログインします。左側のナビゲーションウィンドウで、[クラスタ] をクリックします。

  2. [クラスタ] ページで、リソースグループとリージョンを選択し、管理するクラスタを見つけて、クラスタ名をクリックします。左側のナビゲーションウィンドウで、[アプリケーション] > [helm] を選択します。

  3. [Helm] ページで、[デプロイ] をクリックします。[基本情報] ステップで、次の表に基づいてパラメーターを構成します。

    パラメータ

    [アプリケーション名]

    ack-ingress-nginx

    説明

    カスタムアプリケーション名を構成できます。サービス名の長さ制限に注意してください。

    [名前空間]

    kube-system

    [ソース]

    アプリケーションのソース。デフォルト値: [マーケットプレイス]

    [チャート]

    • 「使用シナリオ」パラメータを [すべて] に設定します。

    • 「サポートされているアーキテクチャ」パラメータを [amd64] に設定します。

    • 検索ボックスに [ack-ingress-nginx] と入力します。.

      • クラスタで Kubernetes 1.20 以前を実行している場合は、[ack-ingress-nginx] をクリックします。

      • クラスタで Kubernetes 1.22 以降を実行している場合は、[ack-ingress-nginx-v1] をクリックします。

    [次へ] をクリックします。

  4. [パラメータ] ステップで、[チャートバージョン] パラメータを構成し、[OK] をクリックします。

    説明

    ACK クラスタで Kubernetes 1.22 以降を実行している場合にのみ、チャートバージョン 4.0.17 以降(ack-ingress-nginx-v1 1.8.0-aliyun.1 以降)を選択できます。ACK クラスタで Kubernetes 1.20 を実行している場合は、チャートバージョン 4.0.16 (ack-ingress-nginx-v1 1.2.1-aliyun.1) を選択します。

    次の表は、[ack-ingress-nginx-v1] のパラメータについて説明しています。

    パラメータ

    説明

    controller.image.repository

    ingress-nginx のイメージレジストリ。

    controller.image.tag

    ingress-nginx のイメージバージョン。詳細については、「NGINX Ingress コントローラー」をご参照ください。

    controller.ingressClassResource.name

    Ingress コントローラーの Ingress クラス。Ingress コントローラーは、Ingress クラスでアノテーションが付けられた Ingress のみを処理します。

    重要

    このパラメータは、1.22 より前の Kubernetes バージョンを実行する ACK クラスタの controller.ingressClass パラメータの代替として機能します。kubernetes.io/ingress.class アノテーションでこのパラメータを指定することもできます。各 Ingress コントローラーの Ingress クラスは、クラスタ内で一意である必要があります。クラスタのデフォルト Ingress コントローラーの Ingress クラスは nginx です。したがって、このパラメータを nginx に設定しないでください。

    controller.ingressClassResource.controllerValue

    Ingress コントローラーのコントローラクラス。

    重要

    各 Ingress コントローラーのコントローラクラスは、クラスタ内で一意である必要があります。クラスタのデフォルト Ingress コントローラーのコントローラクラスは k8s.io/ingress-nginx です。したがって、このパラメータを k8s.io/ingress-nginx に設定しないでください。

    controller.replicaCount

    Ingress コントローラーにプロビジョニングされるポッドの数。

    controller.service.enabled

    負荷分散にインターネット向け SLB インスタンスとイントラネット SLB インスタンスを使用するかどうかを指定します。

    controller.service.external.enabled

    負荷分散にインターネット向け SLB インスタンスを使用するかどうかを指定します。インターネット向け SLB インスタンスを使用したくない場合は、このパラメータを false に設定します。

    controller.service.internal.enabled

    負荷分散にイントラネット SLB インスタンスを使用するかどうかを指定します。イントラネット SLB インスタンスを使用する場合は、このパラメータを true に設定します。

    controller.kind

    Ingress コントローラーのデプロイモード。有効な値: Deployment および DaemonSet

    controller.electionID

    プライマリ Ingress コントローラーの選出中に Ingress のステータスを更新するために使用される ID。

    重要

    ACK コンソールのマーケットプレイスから同じ名前空間に属する複数の Ingress コントローラーをデプロイする場合は、異なる Ingress コントローラーに対して electionID パラメータを異なる値に設定する必要があります。これは、プライマリ Ingress コントローラーの選出中の競合を防ぐのに役立ちます。

    controller.metrics.enabled

    ingress-nginx メトリックを有効にするかどうかを指定します。

    controller.metrics.serviceMonitor.enabled

    メトリック収集のルールを構成するために使用される ServiceMonitor を有効にするかどうかを指定します。

    説明

    ingress-nginx メトリックを有効にした後、ServiceMonitor を有効にすることをお勧めします。その後、システムは Managed Service for Prometheus を自動的に構成してメトリックを収集します。

    controller.service.internal.loadBalancerClass

    サービスが CLB(Classic Load Balancer) インスタンスまたは NLB(Network Load Balancer) インスタンスを使用するかどうかを指定します。有効な値:

    • "alibabacloud.com/clb": サービスは CLB インスタンスを使用します。

    • "alibabacloud.com/nlb": サービスは NLB インスタンスを使用します。

    デフォルトでは、サービスは CLB インスタンスを使用します。

  5. デプロイされた NGINX Ingress コントローラーを表示します。

    [helm] ページで、新しい NGINX Ingress コントローラーがデプロイされていることを確認できます。

ネットワーク接続のテスト

次の例では、アプリケーションが作成され、新しい NGINX Ingress コントローラーを使用してインターネット向けサービスを公開します。

  1. NGINX アプリケーションをデプロイします。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx
    spec:
      replicas: 1
      selector:
        matchLabels:
          run: nginx
      template:
        metadata:
          labels:
            run: nginx
        spec:
          containers:
          - image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
            imagePullPolicy: Always
            name: nginx
            ports:
            - containerPort: 80
              protocol: TCP
          restartPolicy: Always
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        run: nginx
      sessionAffinity: None
      type: NodePort
  2. NGINX Ingress コントローラーを使用して、インターネット向けサービスを提供します。

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: nginx
    spec:
      # 新しい NGINX Ingress コントローラーの Ingress クラスに値を設定します。
      ingressClassName: "<YOUR_INGRESS_CLASS>"
      rules:
      - host: foo.bar.com
        http:
          paths:
          - path: /
            backend:
              service: 
                name: nginx
                port:
                  number: 80
            pathType: ImplementationSpecific
    説明

    kubernetes.io/spec.ingressClassName アノテーションを構成する必要があります。

    アプリケーションをデプロイした後、次の手順を実行して、Ingress の IP アドレスと新しい NGINX Ingress コントローラーの IP アドレスをクエリします。

    • 次のコマンドを実行して、デフォルトの NGINX Ingress コントローラーに関連付けられているインターネット向け SLB インスタンスの IP アドレスをクエリします。

       kubectl -n kube-system get svc nginx-ingress-lb

      予期される出力:

      NAME               TYPE           CLUSTER-IP    EXTERNAL-IP    PORT(S)                      AGE
      nginx-ingress-lb   LoadBalancer   172.19.XX.XX   192.0.XX.XX   80:31429/TCP,443:32553/TCP   2d
    • 次のコマンドを実行して、新しい NGINX Ingress コントローラーに関連付けられているインターネット向け SLB インスタンスの IP アドレスをクエリします。

      kubectl -n <YOUR_NAMESPACE> get svc nginx-ingress-lb

      予期される出力:

      NAME               TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)                      AGE
      nginx-ingress-lb   LoadBalancer   172.19.XX.XX   198.51.XX.XX   80:30969/TCP,443:31325/TCP   39m
    • 次のコマンドを実行して、Ingress の構成をクエリします。

      kubectl get ing

      予期される出力:

      NAME      HOSTS         ADDRESS         PORTS     AGE
      nginx     foo.bar.com   198.51.XX.XX   80        5m

    出力は、Ingress の IP アドレスが新しい NGINX Ingress コントローラーの IP アドレスと同じであることを示しています。

  3. デフォルトの NGINX Ingress コントローラーと新しい NGINX Ingress コントローラーを使用してアプリケーションにアクセスします。

    curl -H "Host: foo.bar.com" http://192.0.XX.XX

    予期される出力:

    <html>
    <head><title>404 Not Found</title></head>
    <body>
    <center><h1>404 Not Found</h1></center>
    <hr><center>nginx</center>
    </body>
    </html>

    新しい NGINX Ingress コントローラーを使用してアプリケーションにアクセスします。

    curl -H "Host: foo.bar.com" http://198.51.XX.XX

    予期される出力:

    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>
        body {
            width: 35em;
            margin: 0 auto;
            font-family: Tahoma, Verdana, Arial, sans-serif;
        }
    </style>
    </head>
    <body>
    <h1>Welcome to nginx!</h1>
    <p>If you see this page, the nginx web server is successfully installed and
    working. Further configuration is required.</p>
    
    <p>For online documentation and support please refer to
    <a href="http://nginx.org/">nginx.org</a>.<br/>
    Commercial support is available at
    <a href="http://nginx.com/">nginx.com</a>.</p>
    
    <p><em>Thank you for using nginx.</em></p>
    </body>
    </html>

上記のテストは、異なる NGINX Ingress コントローラーを使用して公開されたサービスが互いに干渉しないことを示しています。このソリューションは、一部のサービスは外部ユーザーがアクセスできる必要があるが、他のサービスは同じ VPC 内の Kubernetes 以外のワークロードからのリクエストのみを許可するシナリオに適しています。