ビジネスシナリオによっては、Nginx Ingress Controller の構成を変更する必要があります。このトピックでは、Nginx Ingress Controller を構成して最適なパフォーマンスを実現するためのベストプラクティスについて説明します。
インデックス
Nginx Ingress Controller のパフォーマンスと安定性の向上
適切なレプリカ数とリソース制限の使用
デフォルトでは、Nginx Ingress Controller のレプリカ数は、クラスターで作成されたか、コンポーネントセンターからインストールされたかにかかわらず 2 です。必要に応じてレプリカ数を調整できます。リソースのプリエンプションと単一障害点を防ぐために、Nginx Ingress Controller が異なるノードに分散されていることを確認してください。また、専用ノードを使用して Nginx Ingress Controller のパフォーマンスと安定性を確保することもできます。詳細については、「専用ノードを使用した Nginx Ingress のパフォーマンスと安定性の向上」をご参照ください。メモリ不足 (OOM) エラーによるトラフィックの中断を防ぐため、Nginx Ingress Controller にリソース制限を設定しないことを推奨します。リソース制限を設定する必要がある場合は、CPU 制限を少なくとも 1,000 ミリコア、メモリ制限を少なくとも 2 GiB に設定することを推奨します。
専用ノードを使用した Nginx Ingress のパフォーマンスと安定性の向上
Ingress Controller に高い安定性要件がある場合は、専用ノードを割り当ててリソースのプリエンプションを防ぐことができます。詳細については、「高可用性 Nginx Ingress Controller のデプロイ」をご参照ください。
高ペイロードのシナリオでは、高ペイロードアプリケーションをサポートするように Ingress Controller を構成することもできます。詳細については、「高ペイロードシナリオ向けに Nginx Ingress Controller を構成する」をご参照ください。
Nginx Ingress パフォーマンスの最適化
Nginx Ingress Controller のパフォーマンス最適化は、システムパラメーターの最適化と Nginx パラメーターの最適化に分かれています。
システムパラメーターの最適化: Alibaba Cloud のオペレーティングシステムには、デフォルトで最適化されているいくつかの共通パラメーターがあります。最適化が必要な他のシステムパラメーターには、最大システムバックログや利用可能なポートの最大範囲などがあります。システムパラメーターを最適化すると、Nginx は高同時実行リクエストを処理でき、バックエンド接続はポートの枯渇による失敗がなくなります。
Nginx パラメーターの最適化:
Nginx Ingress Controller が高同時実行リクエストを処理できるように、単一ワーカーの最大接続数を調整します。
接続タイムアウト期間の延長: Nginx Ingress Controller は、デフォルトで持続的接続を使用してバックエンドアプリケーション Pod にリクエストを送信します。単一の接続でより多くのリクエストを処理し、接続のオーバーヘッドを削減するには、接続タイムアウト期間を延長する必要があります。
持続的接続タイムアウト期間の設定: バックエンドサービスの持続的接続タイムアウト期間が Nginx Ingress Controller のそれより短くならないようにしてください。ACK クラスターでのデフォルト値は 900s です。
Nginx Ingress コンポーネントには、ほとんどのシナリオで最適なパフォーマンスを提供する組み込みの最適化があります。特別な要件がある場合は、ConfigMap の関連フィールドを使用して、システムパラメーターと Nginx パラメーターをさらに最適化できます。ConfigMap の詳細については、「ConfigMaps」をご参照ください。
HPA を構成して Nginx Ingress Controller を自動的にスケールアウトする
ほとんどの場合、Nginx Ingress Controller はトラフィックのバーストを処理できます。高ペイロードのシナリオで Nginx Ingress Controller が要件を満たせない場合は、Horizontal Pod Autoscaler (HPA) を構成して Nginx Ingress Controller をスケールアウトできます。詳細については、「Horizontal Pod Autoscaling (HPA) の使用」をご参照ください。
Pod をスケーリングすると、一部のサービス接続が中断される可能性があります。HPA は慎重に構成してください。
次のコードは、サンプル YAML ファイルを提供します。
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
name: nginx-ingress-controller-hpa
namespace: kube-system
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx-ingress-controller
minReplicas: 2
maxReplicas: 5
metrics:
- type: Resource
resource:
name: cpu
targetAverageUtilization: 50バックエンドサービスに適切な preStop フックを構成する
バックエンドサービスのローリングアップデート中、Nginx Ingress Controller は終了中の Pod のエンドポイントを削除し、処理中のリクエストの接続を維持します。バックエンドサービスの Pod が終了信号を受信した直後に終了すると、処理中のリクエストが失敗する可能性があります。タイミングの問題により、一部のトラフィックが終了した Pod に転送され続け、トラフィックの損失が発生することがあります。
ローリングアップデート中のトラフィック損失を防ぐために、バックエンドサービスの Pod に preStop フックを構成することを推奨します。これにより、Pod はエンドポイントが削除された後も一定期間実行し続け、トラフィックの中断を防ぎます。
Pod テンプレートのコンテナー構成に次の内容を追加します。
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: app
lifecycle:
# 終了する前に 30 秒待機するように preStop フックを構成します。
# sleep コマンドはコンテナー内に存在する必要があります。
preStop:
exec:
command:
- sleep
- 30Nginx Ingress Controller の可観測性の向上
SLS と Alibaba Cloud Prometheus を使用して可観測性を向上させる
Nginx Ingress Controller は、Simple Log Service (SLS) ログと Prometheus モニタリングに基づくダッシュボードを提供し、サービストラフィックをよりよく理解するのに役立ちます。
SLS ログ:
クラスターの作成時にログコンポーネントと Ingress ダッシュボードを有効にした場合、Container Service 管理コンソールの ページの [Nginx Ingress 概要] セクションで、Simple Log Service が提供するダッシュボードを表示できます。 また、 で、Nginx Ingress Controller によって生成されたログを直接表示することもできます。 詳細については、「Nginx Ingress アクセスログの分析とモニタリング」をご参照ください。
クラスターの作成時にログと Ingress オプションを選択しなかった場合は、ログ収集コンポーネントとルールを手動で構成できます。詳細については、「Nginx Ingress アクセスログの分析とモニタリング」をご参照ください。モニタリングの詳細については、「Ingress ダッシュボードモニタリング」をご参照ください。
Alibaba Cloud Prometheus モニタリング: クラスターを作成する際に Alibaba Cloud Prometheus モニタリングをインストールするか、クラスターを作成した後に ページでインストールまたは表示できます。詳細については、「Alibaba Cloud Prometheus を使用したモニタリング」をご参照ください。
説明Alibaba Cloud Prometheus モニタリングを使用する場合、クラスター内の Ingress リソースに
hostフィールドを追加してください。そうしないと、一部の Ingress メトリックがデフォルトで収集されません。この問題を解決するには、Nginx Ingress Controller デプロイメントのcontrollerの起動パラメーターに--metrics-per-host=falseを追加することもできます。
Nginx Ingress Controller の高度な機能
複数の Nginx Ingress Controller の使用
一部のアプリケーションでは、パブリックネットワークとプライベートネットワークの分離などの目的で、クラスターに複数の Nginx Ingress Controller をデプロイする必要がある場合があります。詳細については、「複数の Ingress Controller のデプロイ」をご参照ください。
クラスター内から Nginx Ingress Controller にアクセスする
クラスター内では、LoadBalancer サービスの外部 IP アドレス (Nginx Ingress Controller のパブリック IP アドレス) へのトラフィックは、通常 iptables または IPVS によってルーティングされます。externalTrafficPolicy が Local に設定されていて、ノードに対応する Nginx Ingress Pod が存在しない場合、ネットワーク接続障害が発生します。デフォルトでは、ACK クラスターの Nginx Ingress Controller は Local モードで LoadBalancer サービスを使用します。そのため、クラスター内から Nginx Ingress Controller にバインドされた SLB アドレスにアクセスすると、ネットワーク接続障害が発生する可能性があります。Nginx Ingress Controller にアクセスするには、Service ClusterIP または内部ドメイン名 (nginx-ingress-lb.kube-system) を使用することを推奨します。Nginx Ingress Controller 自体からアクセスしないでください。これは、ヘアピン問題によりネットワーク接続障害を引き起こす可能性もあります。この問題の解決策の詳細については、「Kubernetes クラスターで LoadBalancer サービスによって公開された SLB アドレスへのアクセスに失敗する」をご参照ください。
WAF の使用
悪意のあるリクエストをブロックするために、クラスターの Nginx Ingress Controller が使用する SLB インスタンスに対して WAF を有効にすることができます。HTTPS ポートで WAF を有効にする場合、コンソールで使用する証明書を構成する必要があります。この場合、次の問題が発生する可能性があります。
TLS リクエストは WAF で終端されます。したがって、クラスター内の Secret を使用して構成された証明書は、インターネット出口で公開されません。
クラスター内から SLB IP アドレスまたは Service ClusterIP を使用してポート 443 にアクセスすると、WAF を通過しない可能性があり、証明書エラーが発生します。
WAF が有効になっている場合、Nginx Ingress Controller はデフォルトで実際のクライアント IP アドレスを取得できません。ConfigMap に次の内容を追加して Nginx Realip モジュールを有効にし、
X-Forwarded-Forヘッダーを実際のクライアント IP アドレスとして使用できます。コンポーネント管理を使用してインストールされた Nginx Ingress Controller の場合、デフォルトの ConfigMap は kube-system 名前空間の nginx-configuration です。use-forwarded-headers: "true" # バージョン 0.30.0 以前ではこのオプションを使用します。 enable-real-ip: "true" # バージョン 0.44.0 以降ではこのオプションを使用します。 proxy-real-ip-cidr: <WAF から取得したオリジン復帰 IP アドレスの CIDR ブロック>
Nginx Ingress Controller を使用したアプリケーションのブルーグリーンデプロイメントまたは段階的リリース
Container Service for Kubernetes (ACK) コンソール の段階的リリース機能を使用するか、手動でアノテーションを追加して Nginx Ingress Controller が提供する段階的リリース機能を使用できます。詳細については、「Nginx Ingress を使用して段階的リリースとブルーグリーンデプロイメントを実装する」をご参照ください。
元のサービスと段階的リリースサービスを含む、段階的にリリースされるサービスが、段階的リリース Ingress 以外の Ingress リソースによって参照されていないことを確認してください。そうしないと、段階的リリースルールの競合が発生し、トラフィックルーティングエラーが発生する可能性があります。
Nginx Ingress Controller を使用した非 HTTP リクエストのプロキシ
デフォルトでは、Nginx Ingress Controller は HTTP を使用してバックエンドサービスに接続します。また、WebSocket、HTTPS、gRPC など、複数のバックエンドプロトコルもサポートしています。サポートされているバックエンドプロトコルの詳細については、「Backend Protocol」をご参照ください。
WebSocket: Nginx Ingress Controller は WebSocket をネイティブにサポートしています。WebSocket 接続を転送するために設定を行う必要はありません。長時間実行される WebSocket 接続がある場合は、アノテーションを使用してバックエンド接続のタイムアウト期間を調整し、タイムアウトによるサービス切断を防ぐことができます。タイムアウト期間の調整方法の詳細については、「Custom timeouts」をご参照ください。
HTTPS: HTTPS を使用するバックエンドサービスの場合、Ingress に
nginx.ingress.kubernetes.io/backend-protocol:"HTTPS"アノテーションを追加して HTTPS 接続に切り替えることができます。gRPC: gRPC は TLS ポートを介してのみアクセスできます。したがって、Nginx Ingress Controller を介して gRPC サービスにアクセスする場合は、暗号化された TLS ポートを使用するようにしてください。gRPC の構成方法の詳細については、「Nginx Ingress Controller のバックエンドに gRPC サービスをデプロイする」をご参照ください。