从‘Hello World’到生产就绪:我的Kubernetes Ingress配置演进全记录(含TLS/多域名)

从‘Hello World’到生产就绪:我的Kubernetes Ingress配置演进全记录(含TLS/多域名) 从‘Hello World’到生产就绪我的Kubernetes Ingress配置演进全记录含TLS/多域名记得第一次在本地Minikube集群里跑通Ingress时那种看到Hello World页面在自定义域名下显示的兴奋感。但真正把服务部署到生产环境时才发现当初那个简单配置连及格线都达不到。本文将用真实项目经历带你走过Ingress配置从实验室玩具到生产级工具的完整进化之路。1. 初识Ingress从单服务暴露开始刚开始接触Kubernetes时我像大多数人一样用NodePort直接暴露服务。直到某天发现需要同时管理多个服务的端口映射才意识到需要更优雅的解决方案。Ingress的出现完美解决了这个痛点——它就像集群的智能门卫能根据域名和路径将流量精准路由到不同服务。最简Ingress配置示例apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: basic-ingress spec: ingressClassName: nginx rules: - host: demo.localdev.me http: paths: - path: / pathType: Prefix backend: service: name: web-service port: number: 80这个配置实现了三个核心功能通过ingressClassName指定使用Nginx控制器定义demo.localdev.me域名的路由规则将所有流量(/)转发到web-service的80端口提示本地开发时可以使用.localdev.me等通配域名它会自动解析到127.0.0.1省去修改hosts文件的麻烦2. 进阶配置多域名与路径路由当项目需要同时提供API和前端服务时单一域名就显得捉襟见肘了。我们的电商项目需要store.example.com面向消费者api.example.com提供后端接口admin.example.com内部管理界面多域名Ingress配置优化apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: multi-domain-ingress spec: ingressClassName: nginx rules: - host: store.example.com http: paths: - path: / pathType: Prefix backend: service: name: store-frontend port: number: 80 - host: api.example.com http: paths: - path: /v1 pathType: Prefix backend: service: name: api-service port: number: 8000 - host: admin.example.com http: paths: - path: / pathType: Prefix backend: service: name: admin-panel port: number: 8080这个配置中我踩过两个坑路径匹配类型选择不当导致404错误后端服务端口配置混淆名称vs数字路径匹配类型对比类型匹配规则适用场景Prefix前缀匹配通用路由规则Exact精确匹配特定API端点ImplementationSpecific由控制器决定特殊路由需求3. 安全加固TLS证书自动化管理当服务需要对外公开时HTTPS不再是可选项而是必选项。我们最初手动配置证书的方式在证书过期时造成了服务中断。后来通过Cert-manager实现了Lets Encrypt证书的自动签发和续期。TLS自动化配置示例apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: tls-ingress annotations: cert-manager.io/cluster-issuer: letsencrypt-prod spec: ingressClassName: nginx tls: - hosts: - store.example.com - api.example.com secretName: example-tls rules: - host: store.example.com http: paths: - path: / pathType: Prefix backend: service: name: store-frontend port: number: 80关键配置点使用cert-manager.io/cluster-issuer注解指定证书颁发者tls字段定义需要HTTPS的域名列表证书会存储在secretName指定的Secret中注意生产环境建议使用Lets Encrypt的prod环境而非staging虽然有限额但更可靠4. 性能优化高级流量控制随着用户量增长基础路由配置已无法满足需求。我们通过以下优化显著提升了服务稳定性4.1 负载均衡配置annotations: nginx.ingress.kubernetes.io/load-balance: ewma nginx.ingress.kubernetes.io/upstream-hash-by: $request_uri4.2 连接限流annotations: nginx.ingress.kubernetes.io/limit-connections: 100 nginx.ingress.kubernetes.io/limit-rps: 504.3 缓存控制annotations: nginx.ingress.kubernetes.io/proxy-buffering: on nginx.ingress.kubernetes.io/proxy-buffer-size: 16k这些配置使我们的API服务在流量高峰期的错误率降低了70%。监控数据显示平均响应时间从320ms降至180ms。5. 实战技巧调试与问题排查即使配置再完善生产环境总会遇到意外情况。以下是我总结的Ingress问题排查checklist基础检查kubectl get ingress # 查看Ingress状态 kubectl describe ingress name # 查看详细事件 kubectl get pods -n ingress-nginx # 确认控制器运行状态日志分析kubectl logs -n ingress-nginx controller-pod配置验证kubectl exec -n ingress-nginx controller-pod -- nginx -T网络诊断kubectl run -it --rm debug --imagenicolaka/netshoot -- bash curl -v http://service.namespace.svc.cluster.local遇到最棘手的问题是路径重写导致的无限重定向最终通过以下配置解决annotations: nginx.ingress.kubernetes.io/rewrite-target: /$2 nginx.ingress.kubernetes.io/use-regex: true6. 生产就绪配置全案综合所有优化后我们的生产环境Ingress配置模板如下apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: production-ready-ingress annotations: cert-manager.io/cluster-issuer: letsencrypt-prod nginx.ingress.kubernetes.io/load-balance: ewma nginx.ingress.kubernetes.io/limit-rps: 100 nginx.ingress.kubernetes.io/proxy-buffer-size: 16k nginx.ingress.kubernetes.io/cors-allow-origin: * nginx.ingress.kubernetes.io/enable-cors: true spec: ingressClassName: nginx tls: - hosts: - *.example.com secretName: wildcard-tls rules: - host: store.example.com http: paths: - path: /static(/|$)(.*) pathType: Prefix backend: service: name: static-assets port: number: 80 - path: / pathType: Prefix backend: service: name: store-frontend port: number: 3000 - host: api.example.com http: paths: - path: /v1(/|$)(.*) pathType: Prefix backend: service: name: api-v1 port: number: 8000 - path: /v2(/|$)(.*) pathType: Prefix backend: service: name: api-v2 port: number: 8000这个配置实现了通配符证书自动管理多版本API共存静态资源分离CORS支持智能负载均衡请求限流保护