
F5、Nginx、K8s 经常在讨论网络服务并发可用性时被放在一起比较甚至有人直接问“哪个更好能扛多大的并发”。先把结论摆清楚这三个不是同一个赛道。F5 是网络入口处的硬件负载均衡设备Nginx 是跑在服务器上的软件反向代理K8s 是管理容器应用副本和弹性的编排平台。它们都能提升服务可用性但各自解决的瓶颈层完全不一样落地时通常是配合使用而不是三选一。所以“并发可用性怎么样”这个问题不能只看单点性能要先看你说的服务处在什么位置、请求从哪一层进来、瓶颈最容易出现在哪里。下面按实际项目中经常用到的拆解方式把三者的定位、能力、成本和配合关系讲清楚。如果你正在纠结选型、梳理架构或者准备面试这篇能帮你把概念和落地边界理得比较顺。1. 先分清 F5、Nginx、K8s 各管的是哪一层1.1 三个角色的通俗理解可以把一次用户请求想象成进一个园区。F5 是园区门口的安检和分流站。它是一台专用硬件设备部署在网络入口处接收来自外部的大量连接按策略把流量分配到后端的服务器或服务上。它的工作重心是网络层面的入口流量管理处理的是 TCP、HTTP、HTTPS 这类连接和请求。Nginx 是园区内部主要楼栋的门厅引导员。它跑在服务器上是一个软件进程负责接收 HTTP 或 TCP/UDP 请求再转发给真实处理业务的后端服务。它关心的不是“园区门口有多少人涌进来”而是“每栋楼每个服务应该怎么分配进来的人”。因为 Nginx 也支持负载均衡、反向代理、缓存、限流所以很多人把它理解成软件负载均衡器。K8s 则是整个园区的物业调度中心。它不直接处理用户请求也不负责转发具体流量它管理的是业务应用本身的运行状态应用要跑几个副本、副本分布在哪台机器、某个副本挂了要不要重启、流量上来之后要不要增加副本数。这三者经常被一起提起是因为都跟“服务能不能稳定访问”有关但是关注点完全不同。1.2 为什么经常被放在一起比较很多人把 F5、Nginx、K8s 放在一起通常是在选型时看到不同资料里反复出现这几个词误以为它们是解决同一个问题的不同方案。其实它们更像是一条链路上的不同环节F5 管理“对外入口的流量进入”Nginx 管理“请求到具体业务服务的转发”K8s 管理“业务服务本身的实例数量和生命周期”如果只问“哪个并发高”答案会很片面。一台 F5 处理连接的能力非常强但如果你后端的服务只有单实例或者不能水平扩展前端再强也可能被业务本身拖垮。Nginx 单机可以扛住几万个甚至更多连接但如果每个请求都阻塞很久或依赖一个瓶颈很明显的数据库整体可用性照样上不去。K8s 能够自动扩容应用副本但如果没有入口流量分发扩出来的一组实例也不知道该接哪份请求。所以比较之前先确认你关心的是网络入口并发、应用转发并发还是应用实例弹性。维度F5NginxK8s类型硬件负载均衡设备软件反向代理/负载均衡容器编排平台常见位置数据中心或机房网络入口应用服务之前、集群入口容器应用调度与弹性主要处理对象L4-L7 网络流量HTTP/TCP/UDP 代理转发容器调度、扩容、服务发现、自愈提升可用性的方式专用硬件加速、连接卸载、池健康检查多 worker 事件驱动、上游健康检查、限流多副本分担、自动伸缩、故障自愈成本硬件采购成本高开源但需要运维能力开源但集群运维成本不低最适合的场景大型入口、金融、运营商、头部互联网Web 后端、微服务入口、集群 Ingress容器化应用的大规模编排管理2. F5硬件负载均衡的门槛和优势2.1 硬件处理高并发的能力来源F5 的 BIG-IP 系列是很多大型企业里能见到的硬件负载均衡设备。它之所以能长时间稳定扛住高并发核心原因不是“软件写得好”而是它有专门的硬件层面处理能力不需要像普通服务器那样把所有网络包都交给 CPU 慢慢算。这类设备可以做的事情包括四层和七层流量分发支持多种负载均衡算法比如轮询、最小连接、会话保持。SSL 卸载把 HTTPS 加解密的计算量从后端服务器移到负载均衡设备上后端服务不用每台都消耗大量 CPU 做加密运算。TCP 连接优化和连接复用减少后端服务器维护连接的开销。健康检查定期探测后端服务器或者应用端口发现异常成员就自动摘除。全局流量管理可以在多个数据中心或链路之间调配流量。这些能力叠加起来让 F5 在“入口大流量、长连接、高并发”场景下表现很稳。尤其是金融、运营商、大型电商这类对连接稳定性和安全要求都很高的环境前端放一台 F5 这类硬件负载均衡还是比较常见的选择。2.2 F5 适合什么场景成本边界在哪F5 最明显的优势是稳定和承载规模大但它的成本也明显高于普通软件方案。如果你只是一个小型 Web 服务或者内部系统完全没有必要直接上 F5。一台普通服务器装好 Nginx 或者直接用云服务的负载均衡产品通常就够用了。F5 更适合那种“入口流量非常大、服务中断代价非常高、团队也有专业网络运维能力”的环境。硬件设备还有一个特点扩容不如软件灵活。软件负载均衡可以随时加服务器、改配置、横向扩展硬件设备虽然也支持扩展槽位和多设备堆叠但整体上更像一台专用机器采购、部署、更换的周期都比软件方案长。另外要注意接触 F5 时不要只记住“F5 很贵很稳”这句话。它内部要配置 Virtual Server、Pool、Pool Member、Monitor、SNAT、iRule 等内容学习成本是真实存在的。哪怕只是转发业务请求也要先把虚拟服务器和成员池的概念理解清楚。如果只是做技术验证或者学习可以先从云上的负载均衡产品入手或者自己搭 Nginx。真正到了“一台设备要承载千万级连接、还需要链路级冗余”的程度再考虑 F5 这类硬件方案不迟。3. Nginx软件负载均衡里的主力3.1 事件驱动模型和并发参数Nginx 能成为软件负载均衡和反向代理里的主力核心优势是它的事件驱动模型。传统服务往往是一个连接对应一个进程或者一个线程连接多了之后进程/线程切换和内存占用会快速上涨。Nginx 不太一样它通过少量的 worker 进程处理大量连接连接状态不是靠阻塞监听而是靠事件机制驱动。所以在同样一台服务器上Nginx 可以支撑的连接数通常比那种“一连接一线程”的方式高很多。实际调整 Nginx 并发能力时主要关注这几个参数worker_processes auto; worker_rlimit_nofile 65535; events { worker_connections 4096; use epoll; } http { keepalive_timeout 65; keepalive_requests 1000; upstream backend { server 10.0.0.11 weight3; server 10.0.0.12; keepalive 32; } server { listen 80; location / { proxy_pass http://backend; proxy_set_header Host $host; proxy_next_upstream error timeout invalid_header http_500 http_502 http_503; } } }这里的逻辑是worker_processes控制 worker 进程数量一般配置成和 CPU 核心数一致或者直接使用 auto。worker_connections表示每个 worker 进程能同时打开的最大连接数。use epoll是 Linux 上的高效事件模型。upstream定义后端服务器组可以配置权重。keepalive 32是 Nginx 与后端服务之间的长连接复用能减少反复建连的开销。proxy_next_upstream决定哪些失败情况可以继续转给下一个后端节点这是提升可用性的关键配置之一。高并发连接和高并发请求要区分开。连接数上来之后如果每个连接都很快完成请求Nginx 处理压力相对可控。如果每个连接都长时间占用资源、大量请求都出现慢响应Nginx 本身再快也会被后端拖住。所以不要只看worker_connections也要看后端服务的响应时间和超时设置。3.2 用 Nginx 做流量入口时要盯住几个点单台 Nginx 在常见服务器配置下处理几万连接是常见情况但这不是一个可以从参数直接推断的固定值。它受 CPU 核心数、内存、文件描述符上限、网卡中断处理、后端响应速度影响很大。如果后端服务平均响应时间很长Nginx 能同时保持的有效连接就会下降。实际排查时我会先做几件事看 Nginx 错误日志确认 502、504 发生在哪一段。看 upstream 后端机器的负载如果后端响应慢即使 Nginx 连接数不高用户也会觉得服务不稳定。看系统文件描述符限制很多人只改 Nginx 配置忘了调整系统层面的ulimit导致高并发时连接创建失败。看 keepalive 是否配置合理如果不复用连接每次请求都新建 TCP 连接高 QPS 下性能会差很多。Nginx 做入口还有一个容易忽略的问题它本身是单点。即使单机性能再高如果机器挂了后端服务再稳也没有入口。所以生产环境通常会给 Nginx 前面再加一层负载均衡入口或者至少用 keepalived、VIP 等方式做高可用。4. K8s 提供的是应用层弹性和自愈4.1 K8s 怎么提升可用性K8s 的核心价值不是替代负载均衡而是让“服务实例本身”变得可控、可扩展、可自愈。没有 K8s 的时候如果一台应用服务器宕机要么人工重启要么等运维介入。有了 K8s 之后应用被封装成容器并通过 Deployment 管理副本数量。某个副本运行异常K8s 会根据健康检查结果重启或者重新调度。一旦访问量上涨HorizontalPodAutoscaler 可以根据 CPU、内存或自定义指标自动增加 Pod 副本。这个过程解决的是业务层的可用性和弹性问题。一个简单的 HPA 配置示例apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: web-app-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: web-app minReplicas: 2 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 60这个配置的意思是web-app这个 Deployment 最少运行 2 个副本最多 10 个副本当 CPU 平均利用率超过 60% 时触发扩容。实际生产里还要设置好 livenessProbe 和 readinessProbe否则可能出现“Pod 还在运行但你无法正常响应请求”的情况。4.2 K8s 不是负载均衡器但要和负载均衡配合有人一开始会把 K8s 当成一种“更强大的负载均衡”这是一个常见的认知偏差。K8s 里的 Service 确实会给一组 Pod 提供一个稳定的虚拟 IP流量进入 Service 后会转发到某个 Pod。但这个能力更偏向服务发现和集群内路由不能直接等同于入口负载均衡。尤其是外部流量要进入集群时通常还会再经过一层入口Service 类型是 ClusterIP 时只能在集群内部访问。NodePort 会把节点端口暴露出去但只是一个过渡方案。LoadBalancer 类型会调用云平台或硬件的负载均衡能力分配一个外部入口。Ingress 则是把 HTTP/HTTPS 路由规则转给入口控制器比如 Nginx Ingress Controller。所以 K8s 提高并发可用性的方式比较特殊它不直接处理百万连接而是通过自动伸缩、滚动更新、故障重建保证“无论流量怎么波动总有足够数量的应用副本在运行”。这也是为什么 K8s 常被误解。如果只关注单个请求的速度K8s 不会让你觉得“更快”如果关注的是长时间运行的稳定性、突发流量下的自动扩容、节点故障时的服务迁移K8s 的价值就非常明显。5. 真实项目里的组合方式而不是三选一5.1 典型三层入口链路在实际架构里F5、Nginx、K8s 可以出现在同一条链路上各自负责一段职责。比较常见的组合是这样的外部流量 → F5或云负载均衡 → Nginx Ingress Controller → K8s Service → Pod这个链路里的每一层都有明确目的F5 负责最外层的入口流量管理做全局限速、SSL 卸载、健康检查解决网络入口的并发接入。Nginx Ingress Controller 负责集群内部的 HTTP 路由把不同域名或路径转发到不同 Service。K8s Service 负责在多个 Pod 之间做负载分发。Deployment 和 HPA 负责保证 Pod 数量始终满足业务需要。如果业务规模不大也可以简化成外部流量 → Nginx → 应用服务先把最基础的单点或少量节点跑通再逐步增加前面提到的入口层和容器化平台。5.2 不同团队的选型建议不同团队在选型上的判断标准应该不一样。小团队、内部系统、早期版本优先用 Nginx。它部署简单、资料多、排错也直接一台机器就能解决问题。不要为了追新而强行引入 K8s否则维护集群本身会成为新的负担。团队已经有容器化基础需要频繁发布、自动扩缩容、多环境管理再上 K8s。这时候 Nginx 通常会以 Ingress Controller 的形式继续存在负责集群流量入口。业务规模达到一定量级流量集中在极少数入口、需要链路级高可用和硬件卸载能力F5 或者云平台负载均衡才会变得更必要。有一个判断原则可以复用先确认当前最明显的瓶颈是哪一层。如果是前端入口扛不住优先解决入口层如果是应用实例不够优先考虑副本扩容如果是单点服务故障频繁优先做健康检查和自动重建。没有瓶颈泛泛谈并发最终容易做出一套看起来很完整但运维起来很重的架构。6. 并发可用性到底怎么验证、怎么排查6.1 从现象到根因的排查顺序遇到“服务不稳定、并发高了卡顿、用户连不上”这类问题不要一开始就怀疑某一层而是按链路逐层看。现象优先排查层常用检查点连接建立不了或直接超时网络入口/防火墙/负载均衡F5 虚拟服务器状态、安全策略、后端成员健康、交换机端口状态页面返回 502 / 504Nginx 与后端之间upstream 配置、后端端口监听、超时参数、后端负载接口偶尔失败、很快恢复应用层容器是否频繁重启、HPA 是否触发扩容、探针是否误判高峰期整体变慢资源层CPU、内存、磁盘、数据库连接池、慢查询、连接数大量请求集中在单台机器负载均衡算法问题会话保持策略、权重配置、副本数是否足够推荐顺序是客户端表现 → 入口负载均衡 → Nginx 日志 → 后端应用日志 → 数据库和依赖服务。如果跳过某一层直接看代码很容易绕远路。6.2 我一般会观察这些指标和参数做压测或者线上排查时我基本不会只看一个“并发数”而是同时看几个关联指标每秒请求数 QPS判断系统当前能处理多少请求。平均响应时间和 P95/P99 响应时间判断延迟分布是否健康。连接数和连接复用率判断连接层是否有瓶颈。错误率包括超时、连接拒绝、5xx 状态码。Nginx upstream 响应时间判断性能瓶颈在后端还是代理层。K8s 的 Pod 副本数变化和 HPA 扩容事件判断是否触发自动伸缩。F5 或云负载均衡的连接数上限与池成员健康状态。压测的时候不要一上来就开满负载。先小规模跑一遍确认链路通、日志正常、数据符合预期再逐步加大并发。否则失败之后很难判断到底是压测工具的问题、网络问题还是服务问题。6.3 几个容易踩的坑高并发问题里很多坑其实是共通的列几个我遇到最多的Nginx 配置改了但系统文件描述符没改。连接数一高就报错看起来像 Nginx 问题实际上是系统限制问题。只加了 worker_connections没调上游超时。后端处理慢时Nginx 的连接被长时间占用整体请求吞吐上不去。K8s 只做了副本扩容但数据库连接池没扩。前端多实例确实分散了请求但数据库成为新的瓶颈。健康检查只查“进程还在”不查“接口能否正常响应”。结果服务已经无法处理业务请求但负载均衡仍然继续转发用户感知就是大量超时。做压测时忽略客户端机器自身的连接限制和网络瓶颈最后测的不是目标服务而是压测机本身。先关注“瓶颈在哪一层”再谈“用什么工具提升”会让思路清楚很多。F5 很好、Nginx 很好、K8s 也很好但它们解决的问题不同不是一个简单的替代关系更多是一条链路上的不同环节。落地时最省事的做法是保持分层清晰入口层负责接入和卸载代理层负责路由和转发应用编排层负责实例数量和自愈。把每一层该干的活分清楚并发可用性才不会变成一句空话。