在Kubernetes集群中,Service和Pod之间是一种关键的解耦访问关系。Service的核心作用是为动态变化的Pod集合提供一个稳定的访问入口,并实现负载均衡。
核心关系:解耦的访问模型
1. Service是网络抽象层
- Pod 是Kubernetes中最小的部署与调度单元,每个Pod都拥有独立的IP地址(Pod IP)。然而,Pod的生命周期是短暂的,其IP地址会随着Pod的重启、重建或迁移而动态变化。
- Service 则是一个稳定的网络抽象。它拥有一个固定不变的虚拟IP(ClusterIP)和DNS名称,充当了一组功能相同Pod的统一代理。
2. 通过标签选择器(Label Selector)关联
Service通过定义 selector 来匹配Pod上附着的标签(Labels),从而动态地发现并关联后端Pod。
Service定义示例
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector: # 标签选择器
app: myapp # 选择所有包含 `app: myapp` 标签的Pod
ports:
- port: 80 # Service对外暴露的端口
targetPort: 9376 # 转发到Pod容器内的端口
Pod标签定义示例
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp # 此标签使Pod被上面的Service选中
spec:
containers:
- name: myapp
image: myapp:1.0
3. 内置负载均衡
Service会自动将接收到的客户端请求流量,均匀地分发到所有匹配到的后端Pod上。
客户端请求 → Service (ClusterIP: 10.96.1.1)
↓ (负载均衡)
+---------+---------+---------+
↓ ↓ ↓ ↓
Pod A Pod B Pod C Pod D
关键特性对比
| 特性 |
Pod |
Service |
| IP地址 |
动态变化(Pod IP) |
固定不变(ClusterIP) |
| 生命周期 |
短暂,随应用更新而重建 |
长期稳定,独立于Pod存在 |
| 网络标识 |
通常仅在集群内部可访问 |
可通过多种类型暴露(ClusterIP/NodePort/LoadBalancer) |
| DNS名称 |
无独立的稳定DNS记录 |
拥有固定DNS格式:<service-name>.<namespace>.svc.cluster.local |
| 扩展性 |
水平扩展会产生多个副本Pod |
自动发现并关联所有匹配的副本Pod |
实际工作流程
- 创建Pod:为Pod定义明确的标签,例如
app: frontend。
- 创建Service:定义Service,并通过
selector 指定需要匹配的Pod标签。
- Service Controller:
- 持续监控集群中Pod的变化。
- 动态维护一个名为
Endpoint 的对象,其中保存了所有匹配Pod的IP地址列表。
- 通知每个节点上的
kube-proxy 组件更新网络规则(如 iptables 或 ipvs)。
- 流量转发:
- 当客户端访问Service的IP或DNS时,请求会被节点的
kube-proxy 拦截。
kube-proxy 根据负载均衡策略,将请求转发到 Endpoint 列表中某个真实的Pod。
这个过程是Kubernetes 云原生 架构中服务发现的核心,也是实现运维/DevOps自动化与高可用的基础。
访问方式示例
# 1. 集群内部通过DNS访问(最常用)
curl http://my-service.default.svc.cluster.local
# 2. 通过NodePort在集群外访问(节点端口映射)
# 访问集群中任意节点的IP和指定的NodePort
curl http://<任意Node-IP>:30080
# 3. 通过LoadBalancer访问(云平台)
# 访问云服务商自动提供的外部负载均衡器IP
curl http://<云厂商LB-IP>
特殊Service类型
- Headless Service:通过设置
clusterIP: None 来创建。DNS查询将直接返回所有后端Pod的IP地址列表,而非Service的虚拟IP,常用于有状态应用如数据库主从集群。
- ExternalName Service:将Service映射到一个外部域名(例如
my.database.example.com),用于将集群内访问导向外部服务。
- 无Selector的Service:用户可以手动创建和维护对应的
Endpoint 对象,从而将Service与集群外部的服务端点关联起来。
总结
Pod是容器工作负载的实际运行载体,而Service是访问这些工作负载的稳定网络抽象层。这种设计实现了至关重要的解耦,带来了以下核心优势:
- 对动态性的屏蔽:Pod可以自由地扩缩容、滚动更新或故障迁移,客户端无需感知后端实例的具体变化。
- 内置服务发现与负载均衡:自动发现健康Pod并提供流量分发。
- 部署与访问的解耦:应用部署(Pod)和网络访问策略(Service)可以独立管理和配置。
- 提供稳定的服务标识:通过固定的DNS名称,为微服务之间提供了可靠的调用地址。
|