Kubernetes Ingress 是什么?它如何实现外部访问集群内服务?
Kubernetes Ingress 是一种 API 对象,用于管理外部访问集群内服务的规则,通常是 HTTP 和 HTTPS 路由。Ingress 提供了基于域名和路径的路由、TLS 终止等功能。Ingress 的作用路由规则:根据域名和路径将流量路由到不同的 Service负载均衡:在多个 Service 实例之间分发流量SSL/TLS 终止:在 Ingress 层面处理 HTTPS,简化后端配置基于名称的虚拟主机:支持多个域名指向同一个集群路径重写:支持 URL 路径重写Ingress ControllerIngress Controller 是实现 Ingress 功能的组件,它监听 Ingress 资源的变化并配置负载均衡器。常见的 Ingress ControllerNGINX Ingress Controller:最流行的 Ingress Controller基于 NGINX/OpenResty功能丰富,性能优秀支持高级路由、限流、认证等Traefik:云原生设计自动服务发现支持 Let's Encrypt 自动证书配置简单HAProxy Ingress:基于 HAProxy高性能支持高级负载均衡算法Istio Gateway:服务网格的一部分支持高级流量管理集成 mTLS、流量镜像等AWS ALB Ingress Controller:专门为 AWS 设计使用 AWS Application Load Balancer原生集成 AWS 服务Ingress 资源示例基本路由apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: simple-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: /spec: rules: - host: example.com http: paths: - path: /app1 pathType: Prefix backend: service: name: app1-service port: number: 80 - path: /app2 pathType: Prefix backend: service: name: app2-service port: number: 80TLS 配置apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: tls-ingressspec: tls: - hosts: - secure.example.com secretName: tls-secret rules: - host: secure.example.com http: paths: - path: / pathType: Prefix backend: service: name: secure-service port: number: 443默认后端apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: default-backend-ingressspec: defaultBackend: service: name: default-service port: number: 80 rules: - host: example.com http: paths: - path: /api pathType: Prefix backend: service: name: api-service port: number: 80Ingress 注解(Annotations)注解用于配置 Ingress Controller 的特定行为。NGINX Ingress Controller 常用注解重写路径:nginx.ingress.kubernetes.io/rewrite-target: /$2启用 SSL 重定向:nginx.ingress.kubernetes.io/ssl-redirect: "true"限流配置:nginx.ingress.kubernetes.io/limit-rps: "10"nginx.ingress.kubernetes.io/limit-connections: "5"CORS 配置:nginx.ingress.kubernetes.io/enable-cors: "true"nginx.ingress.kubernetes.io/cors-allow-origin: "*"认证配置:nginx.ingress.kubernetes.io/auth-type: basicnginx.ingress.kubernetes.io/auth-secret: basic-auth自定义错误页面:nginx.ingress.kubernetes.io/custom-http-errors: "404,503"Ingress vs Service| 特性 | Ingress | Service ||------|---------|---------|| 协议 | HTTP/HTTPS | TCP/UDP || 路由 | 基于域名和路径 | 基于端口 || 负载均衡 | L7(应用层) | L4(传输层) || SSL 终止 | 支持 | 不支持 || 使用场景 | Web 应用 | 通用服务 |Ingress vs LoadBalancer| 特性 | Ingress | LoadBalancer ||------|---------|--------------|| 成本 | 低(共享 IP) | 高(每个 Service 一个 IP) || 路由能力 | 强(域名、路径) | 弱(仅端口) || SSL 终止 | 支持 | 部分支持 || 适用场景 | 多个 HTTP/HTTPS 服务 | 少量服务或非 HTTP 服务 |部署 Ingress Controller部署 NGINX Ingress Controller# 添加 Helm 仓库helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginxhelm repo update# 安装helm install ingress-nginx ingress-nginx/ingress-nginx \ --namespace ingress-nginx \ --create-namespace验证安装kubectl get pods -n ingress-nginxkubectl get svc -n ingress-nginx最佳实践使用命名空间隔离:将 Ingress Controller 部署在独立的命名空间配置资源限制:为 Ingress Controller 设置合理的 CPU 和内存限制启用监控:监控 Ingress Controller 的性能指标使用 TLS:为生产环境配置 TLS 证书配置健康检查:确保后端 Service 的健康检查正常使用注解优化:根据应用需求配置合适的注解备份配置:定期备份 Ingress 配置版本管理:跟踪 Ingress Controller 的版本更新故障排查查看 Ingress 状态:kubectl get ingresskubectl describe ingress <ingress-name>查看 Ingress Controller 日志:kubectl logs -n ingress-nginx <pod-name>测试 DNS 解析:nslookup example.com检查 Service 和 Endpoint:kubectl get svckubectl get endpoints验证证书:kubectl get secret tls-secret -o yaml