Upgrade to Pro — share decks privately, control downloads, hide ads and more …

NGINXENG JP#3 - 2-NGINX-Ingress-Controller-の動作の詳細

hiropo20
February 24, 2023

NGINXENG JP#3 - 2-NGINX-Ingress-Controller-の動作の詳細

■NGINX-エンジニアリング勉強会#3
https://nginx-eng.connpass.com/event/274290/

その他のイベント資料や動画などイベントページをご覧ください。

hiropo20

February 24, 2023
Tweet

More Decks by hiropo20

Other Decks in Technology

Transcript

  1. ©2022 F5 2 NGINXとは nginx(「エンジンエックス」のように発音[1][2]) は、フリーかつオープンソースなWebサーバであ る。処理性能・高い並行性・メモリ使用量の小さ さに焦点を当てて開発されており、 HTTP, HTTPS,

    SMTP, POP3, IMAPのリバースプ ロキシの機能や、ロードバランサ、HTTPキャッ シュなどの機能も持つ。 出典: フリー百科事典『ウィキペディア(Wikipedia)』 作者 Igor Sysoev 開発元 Nginx Inc. 初版 2004年10月4日 (18年前) 最新版 1.22.1 最新評価版 1.23.0 リポジトリ •hg.nginx.org/nginx プログラミング 言語 C言語 対応OS Unix系、Microsoft Windows 種別 Webサーバ、 リバースプロキシ ライセンス BSDライク 公式サイト nginx.org, Nginx Inc. https://ja.wikipedia.org/wiki/Nginx
  2. ©2022 F5 3 NGINXとは HTTPS/gRPC App TCP/UDP SMTP HTML File

    WEBサーバ / Path Routing / キャッシュ / 通信の細かな制御により、 高速 安定 高機能 高機能なReverse Proxy / キャッシュサーバ Load Balancing / API Gateway として利用可能 このNGINXを KubernetesのIngress Controllerした 場合について解説します
  3. ©2022 F5 5 NGINXが提供するソフトウェア NGINX Plus NGINX OSSをベースに、さらなるエンタープライズユースに対応したソフトウェア (分散・冗長性・JWT制御・API制御 に加え、各種セキュリティモジュールの利用が可能)

    NGINX Management Suite NGINX統合管理ソフトウェア。NGINX PlusによるAPI管理 NGINX Instance Manager NGINX OSS、NGINX Plusの統合管理。ヒストリカルなAPM機能、コンフィグ・証明書管理、 管理対象のNGINX OSS / NGINX Plusに対するAPI制御機能を提供 NGINX App Protect WAF F5が提供する、ミッションクリティカル環境に最適な高速な高品質なWAF NGINX App Protect DoS 従来のツールでは検知できないレイヤー7のDoS脅威から高度な保護を提供 NGINX Ingress Controller Kubernetes環境での高度な通信制御を提供。NGINX機能をIngressリソースを通じて管理可能。 NGINX Service Mesh NGINX Plusによるコンテナ間の制御を提供するシンプルなサービスメッシュソリューション NGINX for Azure NGINX PlusをAzureからSaaS環境として提供、コンフィグを貼り付けるだけで活用が可能 All-In-One SW Overview NGINX OSS Dev/Opsに最適な、超軽量・高速・多機能なAll-In-One Software NGINX Unit 動的かつ分散アプリケーション環境向けに設計されたアプリケーションサーバ NJS (NGINX JavaScript) NGINXの機能を拡張するJavaScript言語のサブセットモジュール NJS Open Source Security Container SaaS ソフトウェアとしてNGINX Plus(OSS)を利用
  4. ©2022 F5 6 主要NGINXソフトウェアの構成イメージ App Proxy Client App NJS オンプレミス

    クラウド・コンテナ K8S(コンテナ・NIC) NGINX OSS 環境 App HTTP gRPC etc TCP/ UDP NGINX Plus App オンプレミス クラウド・コンテナ K8S(コンテナ・NIC) App WAF DOS NJS HTTP gRPC etc TCP/ UDP NGINX Unit App オンプレミス クラウド・コンテナ K8S(コンテナ) JS Ruby Go Java Perl PHP Python HTTP NGINX Ingress Controller Pod K8S(NIC) Pod WAF DOS NJS HTTP SMTP etc TCP/ UDP NGINX Service Mesh K8S(NSM) C HTTP gRPC TCP/ UDP Container Container C JWT/OIDC/ActiveHC/ Cookie Persistence/ より詳細なMetrics/ メーカーSupport OSS
  5. ©2022 F5 7 柔軟なアプリケーション展開を実現する高機能なNGINX オンプレミス 外部ネットワークからの攻撃 pod Kubernetes Cluster pod

    pod Kubernetes Cluster pod pod pod 柔軟な通信制御 CRDによる適切な 権限委任 NGINXによる高速で柔軟な通信制御 クラウド・オンプレなど 共通の構成管理 WAF/L7Dos機能の シームレスな統合 共通の運用・構成 プラットフォームの 自由な選択 Ingress Controller Ingress Controller
  6. ©2022 F5 9 コンテナプラットフォームに最適なNGINX Technology Source: Datadog Container Report 2022

    Top Ingress Providers CNCF Survey Source: CNCF Survey 2020 安定・高速動作がクラウドネイティブ環境に最適 実績
  7. ©2022 F5 10 柔軟に拡張できる最高のパフォーマンス HARDWARE SPECS EXPECTED PERFORMANCE 2 CPU

    cores 4 GB RAM 2x10 GbE NIC 74,000 RPS 9,100 SSL TPS (ECC) 4 Gbps throughput 4 CPU cores 8 GB RAM 2x10 GbE NIC 150,000 RPS 17,600 SSL TPS (ECC) 8 Gbps throughput 8 CPU cores 16 GB RAM 2x10 GbE NIC 300,000 RPS 33,000 SSL TPS (ECC) 8 Gbps throughput HARDWARE SPECS EXPECTED PERFORMANCE 2 CPU cores 4 GB RAM 2x1 GbE NIC 90,000 RPS 4,500 SSL TPS (ECC) 1 Gbps throughput 4 CPU cores 4 GB RAM 2x40 GbE NIC 175,000 RPS 8,500 SSL TPS (ECC) 5 Gbps throughput 8 CPU cores 4 GB RAM 2x40 GbE NIC 350,000 RPS 16,000 SSL TPS (ECC) 40 Gbps throughput 0 2000 4000 6000 8000 10000 12000 14000 16000 18000 系列1 0 50000 100000 150000 200000 250000 300000 350000 400000 系列1 0 5000 10000 15000 20000 25000 30000 35000 系列1 0 50000 100000 150000 200000 250000 300000 350000 系列1 2 Core 4 GB 4 Core 4 GB 8 Core 4 GB 2 Core 4 GB 4 Core 8 GB 8 Core 16 GB https://www.nginx.com/resources/datasheets/nginx-plus-sizing-guide/ https://www.nginx.com/resources/datasheets/nginx-ingress-controller-kubernetes/ ベアメタル:CPU/メモリに応じて様々な規模に柔軟な対応 Ingress Controller:アプライアンスに相当する高速・安定な処理 安定・拡張性
  8. ©2022 F5 12 NGINXのプロセス・ファイル Master Process Worker Process Worker Process

    Config File HTML File OS /etc/nginx /var/www /conf.d file socket file process OS Worker Processを含む 全体のプロセス管理 クライアントからの 接続・リクエスト・転送 など通信処理を実施 設定ファイル access.log /var/log/nginx/ error.log HTMLファイル ログファイル stdout stderr 参考情報
  9. ©2022 F5 13 access.log NGINXのコネクション処理 Master Process Worker Process Worker

    Process OS OS App TCP/80 TCP/80 通信の着信を検知 設定に応じた処理 (HTML File) 応答 通信の着信を検知 設定に応じた処理 (Proxy) 応答 アップストリームへ 通信を転送 TCP/3XXXX /var/log/nginx/ 通信の結果を ログへ記録 socket file process OS アップストリームへ 通信を転送 TCP/3XXXX stdout 参考情報
  10. ©2022 F5 14 NGINXのコネクション処理時の設定ロード Master Process Worker Process Worker Process

    OS TCP/80 TCP/80 既存コネクションは 旧プロセスで処理を 継続 新規コネクションから 新しいプロセスで処理 Worker Process TCP/80 Worker Process 設定ファイル読み込みの 影響を最小限に 抑えることができます socket file process OS OS App Config File Config File /etc/nginx /conf.d 設定ファイルの読み込み #nginx –s reload 参考情報
  11. ©2022 F5 16 Kubernetesとは? Ingress Controllerとは? OS CPU MEMORY インターネット

    Container Runtime OS Container Runtime OS Container Runtime コンテナレジストリ Container Container サービス A 構成 Manifest サービスA Deployment Service Ingress LB 外 内 WEB AP WEB Pod Pod Pod HTTP HTTP HTTPS 初期台数 WEB2台 AP1台 リソース CPU x 1 MEM 1G Kubernetes 関連のキーワード Node Node Node コレ!!!
  12. ©2022 F5 17 F5 NGINX Ingress Controllerの種類 kubernetes/ingress- nginx nginxinc/kubernetes

    -ingress with NGINX nginxinc/kubernetes- ingress with NGINX Plus nginxinc/nginx- kubernetes-gateway/ 開発者 Kubernetes コミュニティ F5 / NGINX Team F5 / NGINX Team F5 / NGINX Team NGINX バージョン カスタム NGINX ビルド サードパーティモジュール 公式OSS NGINX (mainline) NGINX Plus (商用版) OSS NGINX 商用サポート ✖︎ ✖︎ ◎ ✖︎ *Kuberntesコミュニティによる開発と提供: https://kubernetes.github.io/ingress-nginx/ *F5 NGINX開発チームによる開発と提供: https://github.com/nginxinc/kubernetes-ingress/ NEW 紹介するのは コレ!!!
  13. ©2022 F5 18 NGINX Ingress Controller 動作環境 • NGINX Ingress

    Controller o Kubernetes 1.26 - 1.21 (NIC 3.0.2) https://docs.nginx.com/nginx-ingress-controller/technical-specifications/ • Kubernetes 動作環境 • AWS EKS (AWS向け公式コンテナイメージ提供開始) • Azure Kubernetes Service • Google Cloud GKE • SUSE Rancher Kubernetes • Kubernetes OSS • Red Hat OpenShift *別途 NGINX Ingress Operator
  14. ©2022 F5 20 NGINX Ingress Controller(NIC)の構成概要 Namespace : nginx-ingress file

    K8S Obj Process Kubernetes Cluster Namespace : service-a pod App pod App Namespace : service-b pod App ServiceA ServiceB Admin ServiceA ServiceB Ingress Controller Admin:NICのデプロイ、運用監視設定 Service A User:管理対象に必要なL7LB設定(Ingress) Service B User :管理対象に必要なL7LB設定(VS) Prometheusより メトリクスの取得 各サービスに対する 外部クライアントからの通信 https://docs.nginx.com/nginx-ingress-controller/intro/how-nginx-ingress-controller-works/ pod
  15. ©2022 F5 21 NICの構成詳細 Namespace : nginx-ingress NGINX IC ConfigFile

    nginx.conf file K8S Obj Process Config Map Kubernetes API Kubernetes Cluster Namespace : service-a pod App Ingress a.xxx.com pod App Config Config /etc/nginx /conf.d Config Template File Namespace : service-b pod App VirtualServer b.xxx.com ServiceA ServiceB Admin ServiceA ServiceB Manifest Manifest Manifest Log(stdout / stderr) • NICイメージをBuildする際に、IC(Goで記 述)と、各種Config Templateが単一のコ ンテナイメージに含まれる • その他、予めKubernetesのProbeや、 Prometheusなどに必要な設定も含まれる • このコンテナイメージを単一のNICとして 実行・利用する pod https://docs.nginx.com/nginx-ingress-controller/intro/how-nginx-ingress-controller-works/
  16. ©2022 F5 22 NICの構成詳細:設定反映(ユーザ操作) Namespace : nginx-ingress pod NGINX IC

    ConfigFile nginx.conf file K8S Obj Process Config Map Kubernetes API Kubernetes Cluster Namespace : service-a pod App Ingress a.xxx.com pod App Config Config /etc/nginx /conf.d Config Template File Namespace : service-b pod App VirtualServer b.xxx.com ServiceA ServiceB Admin ServiceA ServiceB Manifest Manifest Manifest Log(stdout / stderr) Admin: • Config Mapを利用し、NGINXの挙動に関する パラメータの指定(例:Proxyのタイムアウト値) • Config Templateファイルの内容の変更 Service A/B User: • 自身が対象とするNamespaceに、通信転送の処理 内容を記述し反映する。Ingress / VS / VSR / Policy など要件に応じた記述で設定を反映する • Manifestの記述内容に応じて、NGINXの 設定ファイルが生成された後、NGINX Processが再起動し、Worker Processに 反映される • Upstreamの変更についても同様の挙動と なるが、NGINX Plusの場合にはAPIを用 いる事によりNGINX Processの再起動は 発生しない https://docs.nginx.com/nginx-ingress-controller/intro/how-nginx-ingress-controller-works/
  17. ©2022 F5 23 NICの構成詳細:設定反映(ICの動作) file K8S Obj Process Namespace :

    nginx-ingress pod NGINX IC ConfigFile nginx.conf Config Map Kubernetes API Kubernetes Cluster Namespace : service-a pod App Ingress a.xxx.com pod App Config Config /etc/nginx /conf.d Config Template File pod App VirtualServer b.xxx.com ServiceA ServiceB Admin ServiceA Manifest Manifest Manifest Log(stdout / stderr) 1 W W 7 TLS Certificate Namespace : service-b ServiceB 1 Manifestの記述内容を反映。 明らかなManifestの記述ミスなどはエラーが出力される 2 ICがKubernetes APIより最新のリソースの情報を取得 し、更新されていた場合処理を実行する 2 3 ICが.tmpl の拡張子をもつConfig Template Fileの内容 を読み込む 4 ICが適宜処理の内容をLogに書き込む 5 ICが反映されたリソース、Config Templateに従って設 定を生成する。パラメータなど記述にエラーがあった場 合にはエラーが出力される 6 (更新がある場合)ICが各設定で参照されるK8SのTLS Secretの内容を取得し、ファイルを生成する 7 ICがNGINXの現在のコンフィグVersionを取得する 8 ICが「nginx –s reload」により設定を反映する。設定 のロードにエラーがあった場合にはエラーが出力される 9 NGINX Master Processが必要な設定・Certを読み込む。 NGINXのWorker Processが適宜立ち上がる 8 4 5 6 3 9 https://docs.nginx.com/nginx-ingress-controller/intro/how-nginx-ingress-controller-works/
  18. ©2022 F5 24 NICの構成詳細:メトリクスの出力・その他通信 file K8S Obj Process Kubernetes Cluster

    Namespace : service-a pod App Ingress a.xxx.com pod App pod App VirtualServer b.xxx.com ServiceA ServiceB Admin ServiceA Namespace : service-b ServiceB 1 ICが提供するエンドポイントに対し、Prometheusのメ トリクス取得を受け付ける。デフォルト は:9113/metricsで待ち受ける。 2 ICはPrometheusのメトリクスに必要となる情報を、 NGINXが待ち受けるUNIX Socketから取得する https://docs.nginx.com/nginx-ingress-controller/intro/how-nginx-ingress-controller-works/ Namespace : nginx-ingress pod NGINX IC Config Config Map Log(stdout / stderr) TLS Cert 1 W W 2 3 3 NGINX Worker ProcessはHTTP Upstreamのレスポン スの遅延時間に関するログを、UNIX Socketを通じてIC に送付する。その後ICはこれらのログからPrometheus Metricsを生成する ・ログフォーマット log_format response_time '{"upstreamAddress":"$upstream_addr", "upstreamResponseTime":"$upstream_response_time", "proxyHost":"$proxy_host", "upstreamStatus": "$upstream_status"}’; ・メトリクス controller_upstream_server_response_latency_ms_count https://docs.nginx.com/nginx-ingress-controller/logging-and-monitoring/prometheus/ https://github.com/nginxinc/nginx-prometheus-exporter#exported-metrics kubelet :9113/metrics :8081/nginx-ready 1 ICが正しく動作するか確認するため、kubeletが :8081/nginx-readyへProbeを送付する 1
  19. ©2022 F5 25 NICの構成詳細:メトリクスの出力・その他通信 file K8S Obj Process Kubernetes Cluster

    Namespace : service-a pod App Ingress a.xxx.com pod App pod App VirtualServer b.xxx.com ServiceA ServiceB Admin ServiceA Namespace : service-b ServiceB https://docs.nginx.com/nginx-ingress-controller/intro/how-nginx-ingress-controller-works/ Namespace : nginx-ingress pod NGINX IC Config Config Map Log(stdout / stderr) TLS Cert 1 W W 2 3 kubelet :9113/metrics :8081/nginx-ready 1 Controlled By: ReplicaSet/nic1-nginx-ingress-xxx Containers: nic1-nginx-ingress: Container ID: docker://xxxxx Image: yourregistry/nginxplus-ingress-nap-dos:2.4.1 Image ID: docker-pullable://yourregistry/nginxplus-ingress- nap-dos@sha256:xxxx Ports: 80/TCP, 443/TCP, 9113/TCP, 8081/TCP Host Ports: 0/TCP, 0/TCP, 0/TCP, 0/TCP Args: ・・・・ kubectl describe pod コマンド出力抜粋 80/TCP, 443/TCP