什么是 Ingress?它与 Service 的区别是什么
在 Kubernetes (K8s) 中,Ingress 和 Service 都是用于网络流量管理的机制,但它们处于不同的层级,解决的问题也不同。
简单来说:Service 是后端 Pod 的抽象和流量分组,而 Ingress 是管理外部访问这些 Service 的路由规则(网关)。
以下是详细的解释和对比:
1. 什么是 Ingress?
Ingress 是 Kubernetes 中的一个 API 对象,它管理外部用户如何访问集群内部的 Service。
你可以把 Ingress 想象成一个智能路由或反向代理服务器(类似于 Nginx 或 HAProxy)。它工作在网络模型的 第 7 层(应用层,HTTP/HTTPS)。
Ingress 的核心功能:
- 基于域名的路由 (Host-based routing): 将
api.example.com的流量转发给 Service A,将web.example.com的流量转发给 Service B。 - 基于路径的路由 (Path-based routing): 将
example.com/api转发给后端 API 服务,将example.com/ui转发给前端 Web 服务。 - SSL/TLS 终结: 统一管理 HTTPS 证书,负责加密解密,减轻后端服务的负担。
- 负载均衡: 在多个后端 Pod 之间分配流量。
关键点:Ingress Controller
Ingress 资源本身只是一堆“规则”(YAML 文件)。要让这些规则生效,集群里必须运行一个 Ingress Controller(如 Nginx Ingress Controller, Traefik, Istio 等)。Controller 会监听 Ingress 规则的变化,并动态更新底层的负载均衡器配置。
2. Service 与 Ingress 的区别
为了理解区别,我们需要看它们是如何演进的:
第一层:Pod
Pod 是临时的,IP 地址会变。我们不能直接通过 IP 访问 Pod。
第二层:Service (第 4 层 - TCP/UDP)
Service 定义了一组 Pod 的逻辑集合。它提供了一个固定的 ClusterIP。
- ClusterIP: 只能在集群内部访问。
- NodePort: 在每个节点上打开一个端口(如 30001),外部可以通过
节点IP:30001访问。缺点: 端口管理混乱,不安全。 - LoadBalancer: 向云厂商申请一个负载均衡器(如 AWS ELB)。缺点: 每个 Service 都要申请一个 LB,成本高(一个 IP 对应一个 Service),且通常只支持第 4 层转发,无法识别 URL 路径。
第三层:Ingress (第 7 层 - HTTP/HTTPS)
Ingress 解决了 Service (LoadBalancer) 模式成本高且不够灵活的问题。
| 特性 | Service (主要指 LoadBalancer/NodePort) | Ingress |
|---|---|---|
| 网络层级 | 第 4 层 (Transport Layer) 处理 TCP/UDP 包。 |
第 7 层 (Application Layer) 处理 HTTP/HTTPS 请求。 |
| 作用范围 | 通常是一个 Service 对应一个外部入口 (IP/Port)。 | 一个入口对应多个 Service。通过域名或路径区分。 |
| 成本 | 高。如果用 LoadBalancer 模式,暴露 10 个服务需要 10 个云负载均衡器(和 10 个公网 IP)。 | 低。只需要 1 个负载均衡器(暴露 Ingress Controller),就可以代理后端成百上千个服务。 |
| 功能 | 简单的流量转发。无法根据 URL 路径(如 /v1, /v2)进行路由。 |
智能路由。支持路径重写、限流、鉴权、SSL 卸载、灰度发布等。 |
| 依赖关系 | Service 是 Ingress 的后端。 | Ingress 必须依赖 Service 才能找到后端的 Pod。 |
3. 形象的比喻
为了方便记忆,我们可以用大楼来打比方:
- Cluster (集群): 是一栋大楼。
- Pod: 是在大楼里办公的员工。
- Service: 是部门前台。不管员工(Pod)坐在哪个工位,你只要找“财务部”(Service),前台就会把你带到可用的员工那里。
- NodePort: 相当于在大楼墙上凿了个洞,挂个牌子“财务部请爬窗户 30001 进来”。
- LoadBalancer: 相当于给财务部专门修了一个贵宾电梯,直达财务部。如果有 10 个部门,就要修 10 部电梯,很贵。
- Ingress: 是大楼的总服务台/大堂经理。
- 大楼只有一个大门(公网 IP)。
- 你告诉大堂经理:“我要去财务部”(
api.company.com)或者“我要去人事部”(hr.company.com)。 - 大堂经理根据你的需求,把你指引到对应的“部门前台”(Service)。
总结
- 如果你需要暴露非 HTTP 服务(如数据库、缓存、Socket 连接),通常使用 Service (NodePort 或 LoadBalancer)。
- 如果你需要暴露 HTTP/HTTPS 网站或 API,并且希望节省成本、管理域名和路径路由,Ingress 是标准选择。
流量流向通常是:外部用户 -> 负载均衡器 (Cloud LB) -> Ingress Controller -> Service -> Pod
右滑查看面试常问