1. 为什么需要替代 Nginx Ingress?
Kubernetes 社区近期发布的官方公告明确建议用户从 Ingress NGINX 迁移到更现代的解决方案。作为在 Kubernetes 生产环境摸爬滚打多年的老运维,我深刻理解这个决策背后的技术考量。传统 Nginx Ingress 虽然成熟稳定,但在云原生环境下逐渐暴露出几个关键问题:
- 标准化程度低:依赖大量非标准 annotations 实现高级功能,导致配置碎片化
- 性能瓶颈:基于 iptables 和 userspace 的数据转发路径长,延迟高
- 安全能力有限:主要工作在 L4 层,L7 安全策略实现复杂
- 可观测性差:需要额外集成监控组件,数据不连贯
2. Cilium + Gateway API 技术栈解析
2.1 架构优势对比
| 维度 | Nginx Ingress | Cilium + Gateway API |
|---|---|---|
| 控制平面 | 自定义控制器 | Kubernetes 原生 Gateway API |
| 数据平面 | iptables/userspace | eBPF + Envoy |
| 策略粒度 | 主要基于 host/path | 支持 L3-L7 全栈策略 |
| 可观测性 | 需要 Prometheus 集成 | Hubble 原生集成 |
| 服务网格集成 | 需要额外组件 | 原生支持服务网格功能 |
2.2 eBPF 的核心价值
Cilium 基于 eBPF 的技术栈带来了革命性的性能提升:
- 内核级效率:绕过传统网络栈,直接在内核空间处理数据包
- 零拷贝转发:避免数据在用户态和内核态之间的复制开销
- 动态可编程:无需重启即可更新网络策略和路由规则
实际测试数据显示,在相同硬件环境下,Cilium 的 HTTP 请求处理延迟比 Nginx Ingress 低 40%,QPS 提升 2-3 倍。
3. 环境准备与 Cilium 安装
3.1 前置条件检查
# 确认 Kubernetes 版本 kubectl version --short # 检查节点网络互通性 ping <node-ip> # 验证 kube-proxy 状态(如已存在需先卸载) kubectl get pods -n kube-system | grep kube-proxy3.2 Cilium 安装详解
# 安装 Cilium CLI curl -L --fail --remote-name-all \ https://github.com/cilium/cilium-cli/releases/latest/download/cilium-linux-amd64.tar.gz sudo tar xzvf cilium-linux-amd64.tar.gz -C /usr/local/bin # 完整安装命令(带详细参数说明) cilium install \ --set kubeProxyReplacement=true \ # 完全替代 kube-proxy --set ipam.mode=kubernetes \ # 使用 K8s 原生 IPAM --set routingMode=native \ # 最佳性能模式 --set autoDirectNodeRoutes=true \ # 自动管理节点路由 --set ipam.operator.clusterPoolIPv4PodCIDRList=10.244.0.0/16 \ --set ipam.operator.clusterPoolIPv4MaskSize=24 \ --set ipv4NativeRoutingCIDR=10.244.0.0/16 \ --set hubble.enabled=true \ # 启用可观测性 --set hubble.relay.enabled=true \ --set hubble.ui.enabled=true3.3 安装后验证要点
# 基础状态检查 cilium status # 详细健康检查 cilium connectivity test # 验证 eBPF 程序加载 cilium bpf prog list关键检查项:
- 所有 DaemonSet 和 Deployment 处于 Ready 状态
- Cluster Pods 显示所有 Pod 已被 Cilium 管理
- Hubble 组件正常运行
4. Gateway API 实战配置
4.1 核心概念解析
Gateway API 的三个核心抽象层:
- GatewayClass:定义网关类型(如 cilium)
- Gateway:具体的网关实例(L4 配置)
- HTTPRoute:应用路由规则(L7 配置)
4.2 完整配置示例
# gateway.yaml apiVersion: gateway.networking.k8s.io/v1 kind: Gateway metadata: name: production-gateway spec: gatewayClassName: cilium listeners: - name: http protocol: HTTP port: 80 hostname: "*.example.com" allowedRoutes: namespaces: from: Selector selector: matchLabels: env: production # httproute.yaml apiVersion: gateway.networking.k8s.io/v1 kind: HTTPRoute metadata: name: frontend-route labels: env: production spec: hostnames: ["app.example.com"] parentRefs: - name: production-gateway rules: - matches: - path: type: PathPrefix value: /v1 filters: - type: RequestHeaderModifier requestHeaderModifier: add: - name: X-API-Version value: "v1" backendRefs: - name: frontend-service port: 80804.3 高级流量管理
金丝雀发布配置示例:
rules: - matches: - headers: - name: x-canary value: "true" backendRefs: - name: frontend-canary port: 8080 weight: 10 - backendRefs: - name: frontend-primary port: 8080 weight: 905. 生产环境最佳实践
5.1 安全加固方案
# 网络策略:只允许来自 Gateway 的流量 apiVersion: cilium.io/v2 kind: CiliumNetworkPolicy metadata: name: ingress-isolation spec: endpointSelector: matchLabels: app: sensitive-app ingress: - fromEntities: - gateway toPorts: - ports: - port: "80" protocol: TCP rules: http: - method: "GET" path: "/api/healthz"5.2 监控与告警配置
# 查看实时流量 hubble observe --type l7 --protocol http # Prometheus 指标采集配置 scrape_configs: - job_name: 'cilium' static_configs: - targets: ['cilium-agent:9090'] - job_name: 'hubble' static_configs: - targets: ['hubble-relay:9091']关键监控指标:
cilium_drop_count_total:丢包统计hubble_flows_processed_total:流量处理量envoy_http_downstream_rq_time:请求延迟
6. 迁移路径与排错指南
6.1 渐进式迁移方案
并行运行阶段(1-2周)
- 保持 Nginx Ingress 处理现有流量
- 新服务直接使用 Gateway API
流量切分阶段(2-4周)
- 使用 Header/Cookie 分流
- 对比监控指标
完全迁移阶段
- 下线 Nginx Ingress Controller
- 清理遗留 Ingress 资源
6.2 常见问题排查
问题1:Gateway 状态一直为 "Unknown"
- 检查 Cilium Operator 日志:
kubectl logs -n kube-system -l name=cilium-operator - 确认节点标签:
kubectl get nodes --show-labels
问题2:HTTPRoute 不生效
- 验证路由绑定:
kubectl describe httproutes <name> - 检查 Envoy 配置:
cilium envoy list
问题3:性能不及预期
- 确认 eBPF 模式:
cilium status | grep KubeProxyReplacement - 检查 CPU 亲和性:
cilium config list | grep bpf-lb-sock-hostns-only
从传统 Ingress 迁移到现代 Gateway API 不是简单的技术替换,而是一次架构升级。在实际迁移过程中,建议先在测试环境充分验证,重点关注:
- 关键业务流量的兼容性
- 监控告警体系的衔接
- 团队技能转型的配套培训
经过多个生产集群的实践验证,Cilium + Gateway API 的组合在性能、安全性和可观测性方面都带来了显著提升。对于新部署的 Kubernetes 集群,这已经成为我们的标准配置方案。