1. 先来点背景:为什么你的请求总是迷路?
想象一下,你开了一家网红餐厅(集群),客人(流量)通过服务员(Ingress)指引到不同的桌子(Pod)。但突然有些客人抱怨找不到座位,或者被分到了错误的位置——这就是路由失效。还有客人投诉服务员说方言(证书不匹配)导致沟通失败。要解决这些问题,得先理清Ingress的核心逻辑。
技术栈说明:本文示例统一基于Nginx Ingress Controller,其他Ingress控制器(如Traefik)的原理类似,但配置细节可能不同。
2. 路由失效的三大场景与实战排障
2.1 路径匹配的"鬼打墙"
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: coffee-shop
spec:
rules:
- host: cafe.example.com
http:
paths:
- path: /v1
pathType: Prefix
backend:
service:
name: coffee-v1
port:
number: 80
- path: /v1/special
pathType: Prefix
backend:
service:
name: coffee-special
port:
number: 80
问题分析:
当用户访问cafe.example.com/v1/special
时,会被第一个/v1
规则截胡,因为Prefix
匹配优先级按顺序执行。此时咖啡特供版永远无法触达。
修复方案:
将更精确的路径放在前面,或改用Exact
匹配模式:
# 正确配置示例
- path: /v1/special
pathType: Exact # 精准匹配
2.2 域名解析的"双重人格"
# 错误示例:相同的host配置冲突
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: duplicate-host
spec:
rules:
- host: bar.example.com
http:
paths:
- path: /
pathType: Prefix
backend: ...
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: another-ingress
spec:
rules:
- host: bar.example.com # 重复的host
http:
paths:
- path: /api
pathType: Prefix
backend: ...
问题现象:
两个Ingress都声明了bar.example.com
,Nginx会合并配置但可能覆盖部分规则,导致访问/api
时返回404。
排查工具:
使用kubectl exec
查看实际生效的Nginx配置:
kubectl exec -n ingress-nginx <nginx-pod> -- cat /etc/nginx/nginx.conf | grep 'bar.example.com'
2.3 注解配置的"隐形杀手"
# 错误示例:注解缺失导致路径重写失效
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: tea-service
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2 # 正则捕获组替换
spec:
rules:
- host: teahouse.example.com
http:
paths:
- path: /shop(/|$)(.*) # 缺少正则标记
pathType: Prefix
backend: ...
问题表现:
预期将/shop/admin
重写为/admin
,实际转发路径仍为/shop/admin
。
核心要点:
必须同时在path
和注解中声明正则表达式:
path: /shop/(.*) # 添加正则表达式
annotations:
nginx.ingress.kubernetes.io/use-regex: "true" # 启用正则解析
3. 证书问题:HTTPS背后的猫鼠游戏
3.1 证书链不完整的连环套
# 查看证书链完整性(在客户端执行)
openssl s_client -connect teahouse.example.com:443 -showcerts
# 常见错误提示
Verify error:num=20:unable to get local issuer certificate
解决方案:
确保Secret中同时包含服务器证书和中间CA证书:
apiVersion: v1
kind: Secret
type: kubernetes.io/tls
metadata:
name: fullchain-tls
data:
tls.crt: |
-----BEGIN CERTIFICATE-----
# 服务器证书
...
-----BEGIN CERTIFICATE-----
# 中间CA证书
...
-----END CERTIFICATE-----
tls.key: ...
3.2 SAN列表里的漏网之鱼
# 错误示例:证书未包含备用域名
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: multi-domain-ingress
spec:
tls:
- hosts:
- store.example.com
- api.example.com # 证书未覆盖该域名
secretName: wrong-secret
检查工具:
解析证书包含的SAN(Subject Alternative Name):
openssl x509 -in tls.crt -noout -text | grep DNS:
经验准则:
生产环境推荐使用通配符证书或通过Let's Encrypt自动续签。
4. 关联技术深度解析
4.1 探活机制的暗流涌动
# 正确配置健康检查
apiVersion: v1
kind: Service
metadata:
name: coffee-service
spec:
ports:
- port: 80
targetPort: 8080
selector:
app: coffee
---
# Ingress需要依赖Endpoint状态
kubectl get endpoints coffee-service # 确认Pod IP已注册
典型故障链:
如果后端服务的readinessProbe
配置错误 → Endpoint列表为空 → Ingress返回503。
5. 技术选型中的"甜点与陷阱"
方案 | 优点 | 缺点 |
---|---|---|
Nginx Ingress | 高性能、社区活跃 | 配置复杂度较高 |
Traefik | 动态配置更新快 | 大规模集群性能稍逊 |
AWS ALB Ingress | 深度云集成 | 仅适用于AWS环境 |
6. 避坑备忘录(血的教训总结)
证书轮换的死亡30秒
更新Secret后,使用以下命令强制刷新Nginx配置:kubectl rollout restart deploy -n ingress-nginx
多环境配置的隐身差异
在开发环境测试通过的Annotation,可能在生产环境因版本不同失效:kubectl describe ingress <name> | grep Annotations # 检查实际生效参数
浏览器缓存的双面性
HTTPS故障时,Chrome可能缓存错误的HSTS策略,导致强制重定向无法测试:chrome://net-internals/#hsts # 手动清除缓存
7. 终极防御:构建你的排查兵器库
实时流量镜像工具
通过注解开启调试模式:annotations: nginx.ingress.kubernetes.io/enable-access-log: "true" nginx.ingress.kubernetes.io/configuration-snippet: | proxy_set_header X-Original-URI $request_uri;
全链路追踪方案
在Ingress和后端服务中注入TraceID:annotations: nginx.ingress.kubernetes.io/service-upstream: "true"
8. 总结:运维的哲学之道
路由与证书问题本质是配置的精确性和完整性之战。推荐建立标准化检查清单:
- 使用OpenSSL验证证书链
- 通过
curl -v
逐层测试路由 - 定期审计Annotation与K8s版本的兼容性
最终解决方案是人的认知提升与工具化建设并重。就像优秀的餐厅经理既需要熟悉菜单,也要懂得维护点餐系统。