一、为什么需要Ingress控制器?
在Kubernetes集群中,Service负责把流量引入Pod,但它本身没法处理复杂的路由规则。想象一下你开了一家连锁便利店,但所有顾客必须通过同一个门进出——这时就需要一个"智能前台"帮忙分流转发。Nginx Ingress就是这个"前台",它能根据域名、路径等规则定向转发流量,支持SSL加密、路径重写等高级功能,成为微服务架构中不可或缺的组件。
二、部署Nginx Ingress控制器
我们先通过Helm快速部署Nginx Ingress(技术栈:Kubernetes v1.23 + Helm 3.8):
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
# 安装(生产环境建议自定义values.yaml)
helm install ingress-nginx ingress-nginx/ingress-nginx \
--namespace ingress-nginx \
--set controller.service.type=LoadBalancer \
--set controller.ingressClassResource.enabled=true
验证部署状态:
kubectl get pods -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx
三、从零配置一个完整Ingress规则
假设我们有两个服务:用户中心(user-service)和商品服务(product-service),需要通过不同路径暴露。
示例1:基础路由配置
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: demo-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
ingressClassName: nginx
rules:
- host: shop.example.com
http:
paths:
- path: /user/(.*)
pathType: Prefix
backend:
service:
name: user-service
port:
number: 8080
- path: /product/(.*)
backend:
service:
name: product-service
port:
number: 80
关键注释解析:
rewrite-target将路径中的正则捕获组内容重写转发- pathType定义匹配策略(Exact/Prefix/ImplementationSpecific)
四、SSL终结实战:让流量穿上铠甲
示例2:通过Cert-Manager自动申请SSL证书
# 先部署Cert-Manager(参考官方文档)
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: admin@example.com
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- http01:
ingress:
class: nginx
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: secure-ingress
annotations:
cert-manager.io/cluster-issuer: "letsencrypt-prod"
spec:
tls:
- hosts:
- shop.example.com
secretName: shop-tls-secret
rules:
- host: shop.example.com
http:
paths: [...] # 路由规则类似示例1
SSL配置要点:
- 强制HTTPS跳转的注解:
nginx.ingress.kubernetes.io/force-ssl-redirect: "true" - HSTS安全增强头配置
- TLS版本控制(推荐禁用TLS 1.1/1.0)
五、路径重写的魔法艺术
示例3:URL规范化改造
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: rewrite-demo
annotations:
nginx.ingress.kubernetes.io/configuration-snippet: |
rewrite ^/v1/legacy-api/(.*) /modern-api/$1 break;
spec:
rules:
- host: api.example.com
http:
paths:
- path: /modern-api/
backend:
service:
name: modern-service
port: 80
进阶技巧:
- 使用
server-snippet自定义Nginx配置块 - 正则表达式匹配分组的高级用法
- 路径前缀追加与删除的对比方案
六、必须要知道的调优参数
示例4:限流保护配置
annotations:
nginx.ingress.kubernetes.io/limit-connections: "100"
nginx.ingress.kubernetes.io/limit-rps: "200"
nginx.ingress.kubernetes.io/limit-burst: "50"
生产环境推荐优化项:
- 调整keepalive连接数:
nginx.ingress.kubernetes.io/upstream-keepalive-connections - 请求体大小限制:
nginx.ingress.kubernetes.io/proxy-body-size - 自定义错误页面
七、技术选型的辩证思考
优势分析:
- 配置热更新无需重启
- 丰富的注解系统(目前支持100+种配置项)
- 社区活跃度高,兼容各类CNI网络插件
局限性:
- 复杂配置需要深入理解Nginx底层机制
- 横向扩展时资源消耗较明显
- 某些高级功能依赖商业版Nginx Plus
八、我踩过的七个坑
- 路径匹配黑洞:忘记设置
pathType导致404 - 重写规则顺序导致的优先级混乱
- 大文件上传被截断(需调整
proxy-body-size) - WebSocket连接中断(需要开启保持连接配置)
- IP白名单配置的正确姿势
- 证书自动续期失败的排查方法
- 压测时的worker进程数调优
九、典型应用场景全景
- 混合云环境下的统一入口管理
- AB测试流量分割(Canary发布)
- 多租户SaaS平台的路由隔离
- 前后端分离架构的API网关
- 灰度发布与故障注入演练
本文深入解析Kubernetes环境中Nginx Ingress控制器的核心配置技巧,涵盖SSL证书自动化管理、路径重写高级方案及生产环境调优策略。通过完整示例演示如何实现安全可靠的流量入口管理,对比分析技术方案的优缺点,提供避坑指南和实践建议,适合正在构建云原生架构的运维和开发人员参考学习。
评论