这是《Docker 与 Kubernetes 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 Pod IP 是易变的,Service 提供稳定虚拟 IP、名称和负载均衡能力,是 Kubernetes 内部服务发现的核心。
14.1 Service 类型
| 类型 | 说明 |
|---|---|
| ClusterIP | 集群内虚拟 IP |
| NodePort | 每节点开放端口 |
| LoadBalancer | 云负载均衡器 |
| ExternalName | DNS CNAME |
| Headless | 不分配 ClusterIP |
14.2 ClusterIP
apiVersion: v1
kind: Service
metadata:
name: order-service
spec:
type: ClusterIP
selector:
app: order
ports:
- name: http
port: 80
targetPort: 8080
集群内访问:
http://order-service.default.svc.cluster.local
14.3 Headless
spec:
clusterIP: None
DNS 会返回后端 Pod IP 列表,常用于 StatefulSet、数据库主从和客户端负载均衡。
14.4 NodePort 与 LoadBalancer
NodePort:
spec:
type: NodePort
ports:
- port: 80
targetPort: 8080
nodePort: 30080
LoadBalancer 适合直接暴露 TCP/UDP 服务,云厂商负责创建外部负载均衡器。
14.5 Endpoints
kubectl get endpoints order-service
Service 通过 selector 找到 Pod,并把符合 readiness 的 Pod 加入 Endpoints。
常见问题:
| 现象 | 原因 |
|---|---|
| Endpoints 为空 | selector 错、readiness 失败 |
| 访问不通 | 网络策略、kube-proxy |
| 流量不均 | 长连接、客户端缓存 |
| 502 | 应用未监听 targetPort |
14.6 服务发现
CoreDNS 提供:
service-name.namespace.svc.cluster.local
跨命名空间必须使用完整域名。同命名空间可简化为服务名。
本章小结
Service 屏蔽 Pod IP 变化,实现稳定服务发现和四层负载均衡。ClusterIP 服务内部通信,Headless 服务有状态发现,LoadBalancer 暴露外部流量。
思考题
- Service 如何选择后端 Pod?
- Endpoints 为空如何排查?
- Headless Service 适合什么场景?
- targetPort 和 port 有什么区别?
- 跨命名空间如何访问服务?