このトピックでは、Container Service for Kubernetes(ACK)クラスタに複数の独立した NGINX Ingress コントローラーをデプロイして、異なるインターネット向けサービスを提供する方法について説明します。
背景情報
インターネット向けまたはイントラネット NGINX Ingress コントローラーを構成して、ACK クラスタのデフォルトの NGINX Ingress コントローラー構成を調整できます。これにより、イントラネット SLB インスタンスを使用できます。このトピックで説明されているモードは、ほとんどの要件を満たすことができます。特定のシナリオでは、一部のインターネット向けサービスは外部ユーザーがアクセスできる必要がありますが、他のサービスは同じ VPC 内のクラスタ外のワークロードからのリクエストのみを許可します。この場合、2 つの独立した NGINX Ingress コントローラーをデプロイし、それらを異なるネットワークタイプの SLB インスタンスにバインドできます。
使用上の注意
次のセクションでは、一意の IngressClass の構成とサービス名の長さ制限の指定など、複数の Ingress コントローラーの構成に関する使用上の注意について説明します。
一意の IngressClass の構成
複数の Ingress コントローラーを使用する場合は、通常の動作を保証し、競合を防ぐために、各コントローラーに一意の IngressClass を構成する必要があります。次のパラメータを変更する必要があります。
controller.ingressClassResource.name: 各 Ingress コントローラーに一意の名前を指定します。
controller.ingressClassResource.controllerValue: 各 Ingress コントローラーに一意の識別子を指定します。
サービス名の長さ制限の指定
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 コントローラーをデプロイするには、次の手順を実行します。
ACK コンソール にログインします。左側のナビゲーションウィンドウで、[クラスタ] をクリックします。
[クラスタ] ページで、リソースグループとリージョンを選択し、管理するクラスタを見つけて、クラスタ名をクリックします。左側のナビゲーションウィンドウで、 を選択します。
[Helm] ページで、[デプロイ] をクリックします。[基本情報] ステップで、次の表に基づいてパラメーターを構成します。
パラメータ
例
[アプリケーション名]
ack-ingress-nginx
説明カスタムアプリケーション名を構成できます。サービス名の長さ制限に注意してください。
[名前空間]
kube-system
[ソース]
アプリケーションのソース。デフォルト値: [マーケットプレイス]。
[チャート]
「使用シナリオ」パラメータを [すべて] に設定します。
「サポートされているアーキテクチャ」パラメータを [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.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 インスタンスを使用します。
デプロイされた NGINX Ingress コントローラーを表示します。
[helm] ページで、新しい NGINX Ingress コントローラーがデプロイされていることを確認できます。
ネットワーク接続のテスト
次の例では、アプリケーションが作成され、新しい NGINX Ingress コントローラーを使用してインターネット向けサービスを公開します。
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: NodePortNGINX 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 アドレスと同じであることを示しています。
デフォルトの 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 以外のワークロードからのリクエストのみを許可するシナリオに適しています。