Kubernetes Ingress控制器与YAML配置详解
1. Ingress控制器与YAML基础解析
在Kubernetes生态中,Ingress控制器是实现外部访问集群服务的核心组件。它通过解析用户定义的YAML资源配置,生成具体的转发规则。以官方Nginx Ingress为例,其工作原理可概括为:
- 监听Kubernetes API中Ingress资源的变化
- 解析Ingress规范中的路由规则
- 动态生成Nginx配置文件
- 重新加载Nginx服务
典型的Ingress YAML包含三个关键部分:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: rules: - host: demo.example.com http: paths: - path: /api pathType: Prefix backend: service: name: api-service port: number: 80801.1 核心字段深度解读
metadata.annotations:控制器扩展配置入口
nginx.ingress.kubernetes.io前缀的注解会被Nginx控制器识别- 常用注解包括:重写规则、SSL配置、限流参数等
spec.rules:路由规则定义
- 支持基于host/path的多维度路由
- pathType需明确指定(Exact/Prefix/ImplementationSpecific)
backend:服务关联配置
- 必须指向已存在的Service资源
- 端口可引用名称或数字
特别注意:YAML中的缩进必须使用空格而非Tab,这是Kubernetes资源定义的硬性要求
2. 高级配置实战解析
2.1 多路径路由配置
实现同一域名下不同路径的流量分发:
spec: rules: - host: app.example.com http: paths: - path: /static backend: {...} # 静态资源服务 - path: /api backend: {...} # API服务 - path: / backend: {...} # 主应用服务2.2 TLS安全传输配置
添加HTTPS支持需要:
- 创建包含证书的Secret
kubectl create secret tls example-tls \ --cert=path/to/cert.pem \ --key=path/to/key.pem - 在Ingress中引用:
spec: tls: - hosts: - app.example.com secretName: example-tls
2.3 流量切分配置
通过注解实现金丝雀发布:
metadata: annotations: nginx.ingress.kubernetes.io/canary: "true" nginx.ingress.kubernetes.io/canary-weight: "30"3. 常见问题排查指南
3.1 典型错误状态分析
| 现象 | 可能原因 | 排查命令 |
|---|---|---|
| 503 Service Unavailable | 后端服务不可用 | kubectl get endpoints <service-name> |
| 404 Not Found | 路径匹配错误 | kubectl describe ingress <ingress-name> |
| 502 Bad Gateway | 服务端口配置错误 | kubectl get svc <service-name> -o yaml |
| SSL证书错误 | 证书过期/不匹配 | openssl x509 -in cert.pem -text |
3.2 调试技巧
- 查看控制器日志:
kubectl logs -n ingress-nginx <controller-pod-name> - 检查生成的Nginx配置:
kubectl exec -it <controller-pod-name> -- cat /etc/nginx/nginx.conf - 测试路由解析:
curl -v -H "Host: demo.example.com" http://<ingress-ip>/api
4. 性能优化实践
4.1 连接参数调优
在ConfigMap中调整全局参数:
data: keep-alive: "75" keep-alive-requests: "100" upstream-keepalive-connections: "1000"4.2 动态配置建议
- 启用动态证书加载:
metadata: annotations: nginx.ingress.kubernetes.io/auth-tls-secret: "default/tls-secret" - 使用配置片段(Snippet):
metadata: annotations: nginx.ingress.kubernetes.io/server-snippet: | if ($host = 'old.example.com') { return 301 https://new.example.com$request_uri; }
4.3 监控指标暴露
Nginx控制器默认暴露Prometheus指标,可通过以下配置启用:
metrics: enabled: true serviceMonitor: enabled: true5. 版本适配与升级策略
5.1 API版本兼容性
| Kubernetes版本 | 推荐Ingress API版本 |
|---|---|
| 1.18及以下 | extensions/v1beta1 |
| 1.19-1.21 | networking.k8s.io/v1beta1 |
| 1.22+ | networking.k8s.io/v1 |
5.2 控制器升级步骤
- 备份现有配置:
kubectl get ingress --all-namespaces -o yaml > ingress-backup.yaml - 检查版本变更说明:
curl -sSL https://github.com/kubernetes/ingress-nginx/releases \ | grep -A 10 "Breaking Changes" - 滚动升级控制器:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.1/deploy/static/provider/cloud/deploy.yaml
6. 安全加固方案
6.1 基础安全配置
metadata: annotations: nginx.ingress.kubernetes.io/enable-cors: "false" nginx.ingress.kubernetes.io/enable-underscores-in-headers: "false" nginx.ingress.kubernetes.io/hsts: "true"6.2 请求限制策略
- 全局速率限制:
annotations: nginx.ingress.kubernetes.io/limit-rps: "100" - 客户端连接控制:
nginx.ingress.kubernetes.io/limit-connections: "50" nginx.ingress.kubernetes.io/limit-burst-multiplier: "5"
6.3 WAF集成方案
通过ModSecurity实现Web应用防火墙:
- 安装插件:
helm upgrade --install ingress-nginx ingress-nginx/ingress-nginx \ --set controller.admissionWebhooks.enabled=true \ --set controller.admissionWebhooks.patch.image=your-registry/ingress-nginx/kube-webhook-certgen - 启用防护规则:
annotations: nginx.ingress.kubernetes.io/enable-modsecurity: "true" nginx.ingress.kubernetes.io/modsecurity-snippet: | SecRuleEngine On Include /etc/nginx/owasp-modsecurity-crs/nginx-modsecurity.conf
