Kubernetes

K8s Ingress 详解

·6 分钟阅读·2093 字

Kubernetes Ingress 七层路由完整原理、与 Service 的区别、配置示例与生产实践

📋 目录

☸️ K8s Ingress 详解

Ingress 是 Kubernetes 的 七层 HTTP/HTTPS 路由 资源,将外部流量按域名/路径分发到不同的 Service。


📖 为什么需要 Ingress?Service 的局限性

Service 只能做 4 层转发(IP+端口),不能做 7 层路由(域名/路径/SSL/重写)

假设集群里有 10 个网站:shop.service.comuser.service.compay.service.com

如果只用 LoadBalancer/NodePort:

  • 每个 Service 需要一个独立的 LoadBalancer → 成本飙升
  • 客户端必须知道每个服务的端口号 → 不友好
  • 无法实现基于域名/路径的路由
  • SSL 终止需要在每个 Service 单独处理

Ingress 的解决方案:

  • 一个统一的公网入口
  • 按域名 + 路径路由到不同 Service
  • 集中管理 SSL 证书(TLS 终止)
  • 支持 URL 重写、连接超时等七层能力

⚡ Ingress 与 Service 对比

特性ServiceIngress
层级四层(TCP/UDP)七层(HTTP/HTTPS)
路由依据IP + 端口域名 + 路径
TLS 终止❌ 不支持✅ 支持
会话保持源 IPCookie(生产首选)
URL 重写❌ 不支持✅ 支持
每服务独立端口✅ 需要❌ 统一 80/443

🔧 Ingress 核心概念

术语说明
IngressK8s API 对象,定义路由规则(期望状态)
Ingress Controller实际处理流量的反向代理/负载均衡器
Ingress ClassIngress 分类,集群可部署多个 Ingress Controller

⚠️ 面试重点:Ingress 资源本身不做流量转发,必须部署 Ingress Controller 才会生效。


⚙️ 配置示例

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  rules:
  - host: app.example.com
    http:
      paths:
      - path: /api
        pathType: Prefix
        backend:
          service:
            name: api-service
            port:
              number: 80
      - path: /
        pathType: Prefix
        backend:
          service:
            name: web-service
            port:
              number: 80
  tls:
  - hosts:
    - app.example.com
    secretName: app-tls-secret

🚀 Ingress Controller 工作原理

客户端请求(app.example.com)
  ↓ DNS 解析到 Ingress Controller 公网 IP
  ↓ Ingress Controller 收到请求
  ↓ 匹配 Ingress 规则(host + path)
  ↓ 转发到对应的 ClusterIP Service
  ↓ Service 通过 kube-proxy DNAT 到后端 Pod

常见 Ingress Controller:nginx-ingress(生产最常用)、Traefik、HAProxy Ingress、云厂商 ALB Ingress


🌐 面试考点

面试题:Ingress 和 Service 的关系?

  1. Ingress 是七层,Service 是四层
  2. Ingress 依赖 Ingress Controller 才能工作
  3. Ingress 统一入口 + TLS,Service 是后端转发
  4. 生产架构:LoadBalancer → Ingress → Service → Pod

面试题:Ingress Controller 和 Ingress 的区别?

  • Ingress 是 声明式 API 资源
  • Ingress Controller 是 实际运行的负载均衡器
  • Controller 持续 watch Ingress 资源变化,动态更新配置
  • 没有 Controller 的 Ingress = 空配置

关联文档

  • ../service/K8s Service 核心原理 — Service 四层转发底层原理
  • ../service/K8s Service DNS 实现原理 — CoreDNS 域名解析
  • kube-proxy 流量转发与代理模式详解 — 流量转发底层机制
  • ../../network/网络 — 七层/四层网络基础

关联文档