乐闻世界logo
搜索文章和话题

Kubernetes Ingress 是什么?它如何实现外部访问集群内服务?

2月21日 15:53

Kubernetes Ingress 是一种 API 对象,用于管理外部访问集群内服务的规则,通常是 HTTP 和 HTTPS 路由。Ingress 提供了基于域名和路径的路由、TLS 终止等功能。

Ingress 的作用

  1. 路由规则:根据域名和路径将流量路由到不同的 Service

  2. 负载均衡:在多个 Service 实例之间分发流量

  3. SSL/TLS 终止:在 Ingress 层面处理 HTTPS,简化后端配置

  4. 基于名称的虚拟主机:支持多个域名指向同一个集群

  5. 路径重写:支持 URL 路径重写

Ingress Controller

Ingress Controller 是实现 Ingress 功能的组件,它监听 Ingress 资源的变化并配置负载均衡器。

常见的 Ingress Controller

  1. NGINX Ingress Controller

    • 最流行的 Ingress Controller
    • 基于 NGINX/OpenResty
    • 功能丰富,性能优秀
    • 支持高级路由、限流、认证等
  2. Traefik

    • 云原生设计
    • 自动服务发现
    • 支持 Let's Encrypt 自动证书
    • 配置简单
  3. HAProxy Ingress

    • 基于 HAProxy
    • 高性能
    • 支持高级负载均衡算法
  4. Istio Gateway

    • 服务网格的一部分
    • 支持高级流量管理
    • 集成 mTLS、流量镜像等
  5. AWS ALB Ingress Controller

    • 专门为 AWS 设计
    • 使用 AWS Application Load Balancer
    • 原生集成 AWS 服务

Ingress 资源示例

基本路由

yaml
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: 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: 80

TLS 配置

yaml
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: tls-ingress spec: 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

默认后端

yaml
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: default-backend-ingress spec: 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: 80

Ingress 注解(Annotations)

注解用于配置 Ingress Controller 的特定行为。

NGINX Ingress Controller 常用注解

  1. 重写路径
yaml
nginx.ingress.kubernetes.io/rewrite-target: /$2
  1. 启用 SSL 重定向
yaml
nginx.ingress.kubernetes.io/ssl-redirect: "true"
  1. 限流配置
yaml
nginx.ingress.kubernetes.io/limit-rps: "10" nginx.ingress.kubernetes.io/limit-connections: "5"
  1. CORS 配置
yaml
nginx.ingress.kubernetes.io/enable-cors: "true" nginx.ingress.kubernetes.io/cors-allow-origin: "*"
  1. 认证配置
yaml
nginx.ingress.kubernetes.io/auth-type: basic nginx.ingress.kubernetes.io/auth-secret: basic-auth
  1. 自定义错误页面
yaml
nginx.ingress.kubernetes.io/custom-http-errors: "404,503"

Ingress vs Service

特性IngressService
协议HTTP/HTTPSTCP/UDP
路由基于域名和路径基于端口
负载均衡L7(应用层)L4(传输层)
SSL 终止支持不支持
使用场景Web 应用通用服务

Ingress vs LoadBalancer

特性IngressLoadBalancer
成本低(共享 IP)高(每个 Service 一个 IP)
路由能力强(域名、路径)弱(仅端口)
SSL 终止支持部分支持
适用场景多个 HTTP/HTTPS 服务少量服务或非 HTTP 服务

部署 Ingress Controller

部署 NGINX Ingress Controller

bash
# 添加 Helm 仓库 helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx helm repo update # 安装 helm install ingress-nginx ingress-nginx/ingress-nginx \ --namespace ingress-nginx \ --create-namespace

验证安装

bash
kubectl get pods -n ingress-nginx kubectl get svc -n ingress-nginx

最佳实践

  1. 使用命名空间隔离:将 Ingress Controller 部署在独立的命名空间

  2. 配置资源限制:为 Ingress Controller 设置合理的 CPU 和内存限制

  3. 启用监控:监控 Ingress Controller 的性能指标

  4. 使用 TLS:为生产环境配置 TLS 证书

  5. 配置健康检查:确保后端 Service 的健康检查正常

  6. 使用注解优化:根据应用需求配置合适的注解

  7. 备份配置:定期备份 Ingress 配置

  8. 版本管理:跟踪 Ingress Controller 的版本更新

故障排查

  1. 查看 Ingress 状态
bash
kubectl get ingress kubectl describe ingress <ingress-name>
  1. 查看 Ingress Controller 日志
bash
kubectl logs -n ingress-nginx <pod-name>
  1. 测试 DNS 解析
bash
nslookup example.com
  1. 检查 Service 和 Endpoint
bash
kubectl get svc kubectl get endpoints
  1. 验证证书
bash
kubectl get secret tls-secret -o yaml
标签:Kubernetes