NGINX Ingressコントローラーを使用する場合、コントローラーが実行されるポッドは、トラフィックの実際のエントリポイントおよびフォワーダーとして機能します。 それらの信頼性は、コントローラの全体的な信頼性を決定します。 デフォルトでは、NGINX Ingressコントローラーはインストール後に2つのポッドを使用します。これはほとんどのシナリオで十分です。 ポッドの数とスケジューリング方法を制御することで、高い信頼性を実現できます。
前提条件
NGINX Ingressコントローラがインストールされています。 詳細については、「NGINX Ingressコントローラーの管理」をご参照ください。
kubectlクライアントがACKクラスターに接続されています。 詳細については、「クラスターのkubeconfigファイルを取得し、kubectlを使用してクラスターに接続する」をご参照ください。
NGINX Ingressコントローラーにデプロイされたデフォルトのポッドの表示
NGINX Ingressコントローラーをインストールすると、2つのポッドをプロビジョニングするアプリケーションがクラスターにデプロイされます。
次のコマンドを実行して、NGINX Ingressコントローラーがデプロイされているポッドを表示します。
kubectl -n kube-system get pod | grep nginx-ingress-controller期待される出力:
nginx-ingress-controller-*****nxs 1/1 Running 0 3h
nginx-ingress-controller-*****9pm 1/1 Running 0 3hNGINX Ingressコントローラの高い信頼性を確保する方法
NGINX Ingressコントローラーはデフォルトでアフィニティ構成を使用し、コントローラーに属する1つのポッドのみがノードごとにデプロイされるようにします。 ポッドの数がクラスター内のノードの数を超えないようにしてください。
コントローラが実行されるポッドの数を増やす
コントローラーが実行されるポッドの数を増やすと、1つのポッドに障害が発生するのを防ぐことができます。
kubectl scaleコマンドを実行して、NGINX Ingressコントローラーの展開をスケールアウトします。 次のコマンドは、ポッドの数を3つに増やします。kubectl -n kube-system scale --replicas=3 deployment/nginx-ingress-controller期待される出力:
deployment.extensions/nginx-ingress-controller scaled次のコマンドを実行して、NGINX Ingressコントローラーが実行されているポッドを表示します。
kubectl -n kube-system get pod | grep nginx-ingress-controller期待される出力:
nginx-ingress-controller-******** 1/1 Running 0 3h nginx-ingress-controller-******** 1/1 Running 0 3h nginx-ingress-controller-******** 1/1 Running 0 33s
高仕様ノードへのポッドのスケジュール
ポッドを高仕様ノードにスケジューリングすると、ノードリソースが不十分なためにポッドのパフォーマンスが低下したり、削除されたりするのを防ぎます。
次のコマンドを実行して、クラスターの現在のリソース使用量を表示します。
kubectl top nodes期待される出力:
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY% cn-shanghai.********.230 71m 1% 1712Mi 31% cn-shanghai.********.226 63m 1% 1669Mi 30% cn-shanghai.********.229 125m 3% 2545Mi 46% cn-shanghai.********.253 152m 3% 3804Mi 69%出力には、各ノードですでに使用されているCPUおよびメモリリソースが表示されます。 スケジューリング用の余剰リソースが多いノードを選択します。
次のコマンドを実行して、
node-role.kubernetes.io/ingress="true"のラベルをノードに追加します。 次の例では、ラベルがノードcn-shanghai. *********. 226とcn-shanghai.********.230に追加され、余分なCPUリソースが増えます。重要ラベルが追加されるノードの数は、ポッドの数以上である必要があります。 ラベル付きノードの数がコントローラーが属するポッドの数より少ない場合、一部のポッドはデプロイに失敗する可能性があります。
ACK専用クラスターを使用している場合は、マスターノードにラベルを追加しないでください。
kubectl label nodes cn-shanghai.********.226 cn-shanghai.********.230 node-role.kubernetes.io/ingress="true"期待される出力:
node/cn-shanghai.********.226 labeled node/cn-shanghai.********.230 labeled次のコマンドを実行して、Nginx Ingress Controllerによって使用されるデプロイを更新し、nodeSelector設定を追加して、コントローラが属するポッドが
node-role.kubernetes.io/ingress="true"のラベルを持つノードにのみデプロイできるようにします。kubectl -n kube-system patch deployment nginx-ingress-controller -p '{"spec": {"template": {"spec": {"nodeSelector": {"node-role.kubernetes.io/ingress": "true"}}}}}'期待される出力:
deployment.extensions/nginx-ingress-controller patched次のコマンドを実行して、
node-role.kubernetes.io /Ingress="true"というラベルでクラスターノードにデプロイされたingressポッドを表示します。kubectl -n kube-system get pod -o wide | grep nginx-ingress-controller期待される出力:
nginx-ingress-controller-*****nxs 1/1 Running 0 74m 10.1.117.186 cn-shanghai.********.230 nginx-ingress-controller-*****9pm 1/1 Running 0 74m 10.1.117.172 cn-shanghai.********.226