nginx ingress controller 多实例高可用需“多副本+流量分发+故障自愈”三层协同:daemonset模式适用于边缘节点直连宿主机网络;deployment+loadbalancer适用于公有云;nodeport+外部四层lb适用于私有环境;并须配置唯一ingressclass、leader-elect、健康探针及内核参数优化。

云原生环境中实现 Nginx Ingress Controller 多实例高可用,核心是“多副本 + 流量分发 + 故障自愈”三层协同。单靠增加副本数不够,必须配合合理的部署模式和外部接入层设计,才能真正规避单点故障。
用 DaemonSet 模式固定节点部署
适合对网络延迟敏感、需绑定物理网卡或特定硬件资源的场景。通过 hostNetwork: true 让每个 Ingress Controller 实例直接使用宿主机网络栈,避免 Service 转发开销;再结合 nodeSelector(如 ingress: "yes")将实例调度到预选的专用边缘节点上。
- 所有工作节点都运行一个 Ingress Controller 实例,天然分散在不同机器,规避单机宕机风险
- 无需 ClusterIP 或 NodePort Service,端口直接暴露在宿主机上(如 80/443),减少中间转发跳数
- 需提前为边缘节点打标签,并确保这些节点不被普通业务 Pod 占用资源
用 Deployment + LoadBalancer Service 分发流量
公有云环境最常用的方式。部署多个副本(建议 ≥3),通过 Kubernetes 的 LoadBalancer 类型 Service 统一对外暴露,由云厂商 ELB 自动完成健康检查与流量轮转。
- Service 后端自动关联所有 Ready 状态的 Ingress Controller Pod,Pod 重启或漂移后自动更新 Endpoint
- 若在私有环境,可用 MetalLB 替代云厂商 LB,提供类似能力
- 需配置 readinessProbe 和 livenessProbe,确保 LB 只将流量导向健康实例
用 NodePort + 外部四层负载均衡器兜底
适用于自建集群且无法部署 MetalLB 或缺乏云 LB 支持的场景。将 Ingress Controller Service 设为 NodePort 类型,在集群所有节点上开放固定端口(如 30080/30443),再由集群外的 Nginx / Keepalived + LVS 做上游负载。
- 外部负载器只需配置节点 IP 列表,无需感知 Pod 变化,天然适配动态调度
- Nginx stream 模块可做 TCP/UDP 四层代理,支持健康探测和自动剔除异常节点
- Keepalived 提供 VIP 高可用,主备切换时客户端连接几乎无感
关键配套动作不能少
光有多个实例还不够,以下配置直接影响高可用效果:
- 每个 Ingress Controller 必须指定唯一 ingressClass.name 和 controller-class,避免规则冲突
- 启用 leader-elect: true(默认开启),防止多个实例同时写入同一 ConfigMap 或处理 Webhook
- 调整内核参数(如
net.core.somaxconn)和 Nginx worker 参数(如worker_connections: 65536),应对突发流量 - Ingress 资源中显式声明
ingressClassName: xxx,确保流量精准路由到对应控制器











