在Kubernetes集群运维与应用部署中,Ingress和Service是绕不开的核心流量管理组件。二者均服务于集群内外部应用的可访问性,但定位、功能及使用场景差异显著,且需协同工作才能构建完整的流量链路。本文结合实操经验,从概念、异同点、协作关系及场景选型等维度,带你吃透这两个核心资源。
一、核心概念拆解:各自的定位与核心价值
1. Service:Pod的"稳定访问锚点"
用过K8s的同学都清楚,Pod存在动态漂移特性------重启、扩容缩容、节点调度都会导致Pod的IP频繁变化。而Service的核心作用,就是为一组功能相同的Pod提供一个固定不变的访问入口,解决Pod IP动态变化带来的访问难题。
从本质来看,Service是由K8s原生控制器维护的"虚拟资源",核心构成包括:固定ClusterIP(集群内部虚拟IP)、端口映射规则、基于Label Selector的Pod关联逻辑,以及内置的四层负载均衡能力。
其核心能力可总结为三点:
-
服务发现:通过Label Selector自动关联后端Pod,无需手动维护Pod列表,Pod变动后Service会实时更新可用节点
-
四层负载均衡:默认采用轮询策略,将请求均匀分发至关联的多个Pod,提升服务可用性
-
跨命名空间访问:通过"服务名.命名空间.svc.cluster.local"的域名格式,支持集群内跨命名空间的Pod通信
关于访问范围,Service默认的ClusterIP类型仅允许集群内访问;若需暴露到集群外,可选用NodePort(绑定节点端口)或LoadBalancer(对接云厂商负载均衡器)类型,但这两种方式缺乏灵活的路由与证书管理能力,仅适用于简单场景。
2. Ingress:集群外部流量的"智能网关"
Service虽能解决Pod访问问题,但在应对多服务、多域名的生产场景时显得力不从心------无法基于域名、路径路由流量,也不支持HTTPS证书统一管理。而Ingress的出现,正是为了填补这一空白,专门负责集群外部HTTP/HTTPS流量的精细化管理。
需要特别注意:Ingress本身只是一组"路由规则集合",并非实际的访问入口,必须依赖Ingress Controller(如Nginx Ingress Controller、Traefik)才能生效。Ingress Controller本质是一个运行在集群内的Pod,兼具反向代理与负载均衡功能,负责解析Ingress规则并转发流量。
Ingress的核心能力的是七层流量管控:
-
域名与路径路由:可将不同域名(如api.example.com、web.example.com)或同一域名下的不同路径(如/example/user、/example/admin),精准转发至对应的后端Service
-
SSL终结:在Ingress层面统一配置HTTPS证书,解密外部HTTPS请求后,以HTTP协议转发至后端Service,减少Pod侧的证书管理成本
-
高级流量控制:支持路径重写、请求限流、跨域CORS配置、会话保持等实战所需的高级功能
二、Ingress与Service的异同点梳理
1. 相同点:目标一致的流量支撑
-
核心目标统一:均为解决K8s集群内应用的可访问性问题,适配Pod动态变化的特性
-
依赖Label关联:最终都通过Label Selector(Service直接关联,Ingress间接通过Service关联)指向后端Pod
-
声明式配置:均通过YAML文件定义规则,由K8s控制器自动维护状态,无需手动干预
2. 不同点:分层管控的核心差异
二者的差异集中在工作层级、功能范围、依赖组件等维度,具体对比如下表所示,建议收藏备用:
| 对比维度 | Service | Ingress |
|---|---|---|
| 工作层级 | OSI四层(传输层),基于TCP/UDP端口转发 | OSI七层(应用层),基于HTTP/HTTPS协议解析 |
| 核心功能 | 提供稳定入口、四层负载均衡、服务发现 | 域名/路径路由、SSL终结、七层流量管控 |
| 依赖组件 | K8s原生支持,无需额外部署组件 | 必须依赖Ingress Controller才能生效 |
| 支持协议 | TCP、UDP、SCTP,适配非HTTP类服务 | HTTP、HTTPS、HTTP/2,仅针对应用层协议 |
| 外部访问 | NodePort/LoadBalancer暴露,无灵活路由 | 通过Ingress Controller的IP/域名暴露,支持多域名多路径 |
| SSL处理 | 不支持,需后端Pod自行处理HTTPS | 支持SSL终结,统一管理证书 |
三、协作关系:流量链路的完整闭环
实战中,Ingress与Service并非对立关系,而是协同工作的层级关系------Ingress无法直接访问Pod,必须以Service作为中间层,形成"外部请求→Ingress Controller→Service→Pod"的完整流量链路。
具体链路拆解:
-
外部用户通过域名(如app.example.com)发起HTTP/HTTPS请求,该请求被解析到Ingress Controller的公网IP
-
Ingress Controller根据Ingress规则,识别该域名/路径对应的后端Service
-
Ingress Controller将请求转发至对应Service,由Service通过四层负载均衡,将请求分发至关联的Pod
-
Pod处理请求后,沿原链路返回响应结果给外部用户
实操配置示例(Nginx Ingress)
下面通过简单配置,演示二者的协作方式,直接可复制到集群中测试。
1. Service配置(关联Pod,提供ClusterIP入口)
apiVersion: v1
kind: Service
metadata:
name: my-app-svc
namespace: default
spec:
selector:
app: my-app # 对应Pod的Label
ports:
- port: 80 # Service暴露端口
targetPort: 8080 # Pod容器端口
type: ClusterIP # 集群内访问
2. Ingress配置(路由域名请求至Service)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-app-ingress
namespace: default
annotations:
kubernetes.io/ingress.class: "nginx" # 指定Ingress Controller类型
spec:
rules:
- host: app.example.com # 自定义域名
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-app-svc # 关联上述Service
port:
number: 80
四、场景选型:该用Service还是Ingress?
根据上述分析,结合实战场景,给出明确的选型建议:
优先用Service的场景
-
集群内Pod间通信(如微服务之间的调用),无需暴露到外部
-
需要暴露TCP/UDP协议的服务(如MySQL数据库、Redis缓存、MQ消息队列)
-
测试环境,仅需简单暴露服务,无需域名、HTTPS等高级功能
优先用Ingress的场景
-
生产环境,需通过多个域名、路径路由流量(如一个集群部署多个Web应用)
-
需要统一管理HTTPS证书,实现SSL终结,减少后端服务复杂度
-
需配置限流、跨域、路径重写等七层流量控制策略
-
希望减少云厂商LoadBalancer的使用数量,降低运维成本(一个Ingress Controller可管理多个服务)
总结
一句话概括二者的关系:Service是K8s流量管理的"基础层",解决Pod的稳定访问问题;Ingress是"高级层",基于Service实现外部流量的精细化管控。实战中,需根据服务类型、访问需求,合理搭配二者,构建高效、可靠的K8s流量架构。
如果需要Ingress Controller的部署教程、高级配置技巧(如限流、SSL配置),可以留言交流,后续会补充对应的实操内容。