このトピックでは、Container Service for Kubernetes (ACK) クラスターに複数の独立したNGINX Ingressコントローラーをデプロイして、異なるインターネット接続サービスを提供する方法について説明します。
前提条件
ACKクラスターが作成されます。 詳細については、「ACK管理クラスターの作成」をご参照ください。
kubectlはACKクラスターに接続するために使用されます。 詳細については、「クラスターのkubeconfigファイルを取得し、kubectlを使用してクラスターに接続する」をご参照ください。
背景情報
デフォルトのNGINX Ingressコントローラーの設定を変更して、内部対応のServer Load Balancer (SLB) インスタンスを使用できます。 詳細については、「インターネット接続または内部接続NGINX Ingressコントローラーの設定」をご参照ください。 インターネット向けまたは内部向けのSLBインスタンスを使用して、ほとんどのシナリオの要件を満たすことができます。 ただし、特定のシナリオでは、一部のインターネット接続サービスは外部ユーザーがアクセスできる必要がありますが、他のサービスは同じ仮想プライベートクラウド (VPC) 内のKubernetes以外のワークロードからのリクエストのみを許可します。 この場合、2つの独立したNGINX Ingressコントローラーをデプロイし、異なるネットワークタイプのSLBインスタンスにバインドできます。
新しいNGINX Ingressコントローラーのデプロイ
ACKクラスターが作成されると、2つのポッドレプリカを持つNGINX Ingressコントローラーが自動的にデプロイされます。 インターネットに接続するSLBインスタンスも、フロントエンド負荷分散サービスとして作成されます。
次の手順を実行して、別の独立したNGINX Ingressコントローラーをクラスターにデプロイできます。
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 クラスターの詳細ページの左側のウィンドウで、 を選択します。
[Helm] ページで、[デプロイ] をクリックします。 [基本情報] ステップで、次の表に基づいてパラメーターを設定します。
パラメーター
例
アプリケーション名
アプリケーションの名前。 この例では、このパラメータはack-ingress-nginxに設定されています。
名前空間
namaspaceの名前。 この例では、このパラメーターはkube-systemに設定されています。
ソース
アプリケーションのソース。 デフォルト値: Marketplace。
チャート
Use ScenariosパラメーターをAllに設定します。
Supported Architectureパラメーターをamd64に設定します。
検索ボックスにack-ingress-nginxと入力します。
クラスターがKubernetes 1.20以前を実行している場合は、ack-ingress-nginxをクリックします。
クラスターがKubernetes 1.22以降を実行する場合は、ack-ingress-nginx-v1をクリックします。
[次へ] をクリックします。
[パラメーター] ステップで、[グラフバージョン] パラメーターを設定し、[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.int ernal.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を有効にすることを推奨します。 次に、システムはメトリックを収集するためにPrometheusのManaged Serviceを自動的に設定します。
デプロイされたNGINX Ingressコントローラーを表示します。
Helmページで、新しいNGINX Ingressコントローラーがデプロイされていることを確認できます。
ネットワーク接続のテスト
次の例では、アプリケーションが作成され、新しいNGINX Ingressコントローラーを使用してインターネットに接続するサービスを提供します。
NGINXアプリケーションをデプロイします。
apiVersion: apps/v1 kind: 配置 メタデータ: 名前: nginx spec: replicas: 1 セレクタ: matchLabels: run: nginx template: metadata: labels: run: nginx 仕様: containers: - image: nginx imagePullPolicy: Always name: nginx ポート: - containerPort: 80 protocol: TCP restartPolicy: 常に --- apiVersion: v1 種類: サービス メタデータ: 名前: nginx spec: ポート: - port: 80 protocol: TCP targetPort: 80 セレクタ: run: nginx sessionAffinity: None タイプ: NodePort
NGINX Ingressコントローラーを使用して、インターネット接続サービスを提供します。
apiVersion: networking.k8s.io/v1 kind: Ingress メタデータ: name: nginx アノテーション: # 値を新しいNGINX IngressコントローラーのIngressクラスに設定します。 kubernetes.io/ingress.class: "<YOUR_INGRESS_CLASS>" spec: rules: - host: foo.bar.com http: paths: - path: / backend: service: name: nginx port: number: 80 pathType: ImplementationSpecific
説明kubernetes.io/ingress.class
アノテーションを設定する必要があります。アプリケーションをデプロイした後、次の手順を実行して、Ingress IPアドレスと新しいNGINX IngressコントローラーのIPアドレスを照会します。
次のコマンドを実行して、デフォルトのNGINX Ingressコントローラーに関連付けられているインターネットに接続されているSLBインスタンスのIPアドレスを照会します。
kubectl -n kube-system get svc nginx-ingress-lb
期待される出力:
名タイプCLUSTER-IP EXTERNAL-IPポート年齢 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
期待される出力:
名タイプCLUSTER-IP EXTERNAL-IPポート年齢 nginx-ingress-lb LoadBalancer 172.19.XX.XX 198.51.XX.XX 80:30969/TCP、443:31325/TCP 39m
次のコマンドを実行して、Ingressの設定を照会します。
kubectl get ing
期待される出力:
名ホストアドレスポート年齢 ngin x foo.bar.com 198.51.XX.XX 80 5m
出力は、Ingress IPアドレスが新しいNGINX IngressコントローラのIPアドレスと同じであることを示しています。
デフォルトのNGINX Ingressコントローラーと新しいNGINX Ingressコントローラーを使用して、アプリケーションにアクセスします。
# デフォルトのNGINX ingressコントローラーを使用してアプリケーションにアクセスします。 404のステータスコードが必要です。 カール-H「ホスト: foo.bar.com」http:// 192.0.2.0 default backend - 404 # 新しいNGINX Ingressコントローラーを使用してアプリケーションにアクセスします。 NGINXのウェルカムページが予定されています。 curl -H「ホスト: foo.bar.com」http:// 198.51.XX.XX <!DOCTYPE html> <html> <ヘッド> <title> nginxへようこそ!</title> <style> body { 幅: 35em; マージン: 0 auto; フォントファミリー: タホマ、ヴェルダナ、アリアル、サンセリフ。 } </style> </head> <body> <h1> nginxへようこそ!</h1> <p> このページが表示されると、nginx webサーバーが正常にインストールされ、働いています。 さらなる設定が必要です。</p> <p> オンラインドキュメントおよびサポートについては、を参照してください <a href=" http://nginx.org/">nginx.org</a> 。<br/> 商用サポートは <a href=" http://nginx.com/">nginx.com</a> 。</p> <p><em> nginxをご利用いただきありがとうございます。</em></p> </body> </html>
上記のテストでは、異なるNGINX Ingressコントローラーを使用して公開されるサービスが互いに干渉しないことを示しています。 このソリューションは、一部のサービスが外部ユーザーにアクセス可能である必要があり、他のサービスが同じVPC内のKubernetes以外のワークロードからのリクエストのみを許可するシナリオに適しています。