ClusterIP 是什么
ClusterIP 是 Service 的默认类型:为一组 Pod 分配一个仅集群内可达的虚拟地址,节点上的转发规则把访问该地址与端口的流量分给就绪的后端 Pod。它解决的是「Pod 会被反复重建、IP 一直变」的问题——调用方只认服务名或虚拟地址,后端怎么换都不用改配置。集群内服务互相调用,绝大多数走的就是它。
流量怎么走完这一段
创建 Service 后控制器会按选择器把匹配且通过就绪检查的 Pod 地址写进 EndpointSlice,节点上的数据面组件再据此写入转发规则。请求先到虚拟地址,被改写成某个后端 Pod 的真实地址与端口。这意味着后端列表为空时流量无处可去,而对象本身看起来完全正常。
基本信息
| 适用环境 | 任何 Kubernetes 发行版,默认可直接使用 |
|---|---|
| 资源写法 | kind 为 Service,spec.type 为 ClusterIP(默认值可省略) |
| 访问范围 | 仅在集群网络内可达,集群外无法直连 |
| 后端选择 | 由 spec.selector 匹配的 Pod 标签决定 |
| DNS 名称 | 服务名.命名空间.svc.cluster.local |
| 依赖组件 | kube-proxy 或等价数据面,以及正常工作的 CNI |
典型使用场景
- 服务间调用:前端 Deployment 通过服务名访问后端,不再关心后端 Pod 的地址
- 数据库接入:把一组数据库副本放在同一个服务后面,应用只配一个地址
- 灰度与切换:调整选择器就能把流量整体切到另一组 Pod
- 固定入口:Pod 数量变化、滚动更新期间调用方配置保持不变
- 内部管理口:把监控、管理端点在集群内暴露,供运维 Pod 或节点进程访问
- 中间件解耦:缓存、消息队列等中间件组件用它做统一接入点
Service 清单与验证
Service 清单与验证
apiVersion: v1
kind: Service
metadata:
name: web
namespace: prod
spec:
type: ClusterIP # 默认类型,可省略
selector:
app: web
ports:
- name: http
port: 80 # 服务端口,调用方访问这个
targetPort: 8080 # 容器真实监听端口
protocol: TCP
# sessionAffinity: None # 需要会话保持时可改为 ClientIP连通性验证
连通性验证
kubectl get svc web -o wide # 看虚拟地址与选择器
kubectl get endpoints web # 确认后端端点是否为空
kubectl get endpointslices -l kubernetes.io/service-name=web
kubectl run curl-test --rm -it --image=curlimages/curl:8.6.0 --restart=Never -- curl -s -o /dev/null -w '%{http_code}\n' http://web.prod.svc.cluster.local/关键字段读法
| 字段 | 含义 | 异常表现 |
|---|---|---|
| spec.selector | 决定哪些 Pod 会被当作后端 | 标签写错则端点为空,服务不通 |
| spec.ports.port | 服务对集群内暴露的端口 | 与调用方配置不一致会连不上 |
| spec.ports.targetPort | 转发到容器的端口 | 填错时端点正常但连接被拒 |
| EndpointSlice | 实际就绪的后端地址列表 | 为空说明没有 Pod 通过就绪检查 |
| spec.clusterIP | 分配的虚拟地址 | 创建后不可修改,只能删除重建 |
| sessionAffinity | 是否把同一客户端会话固定到同一后端 | 设为 ClientIP 会影响负载均衡均匀度 |
虚拟地址没有实体网卡,ping 不通属于正常现象;验证连通性要用 curl 或 telnet 测端口,不要用 ping 下结论。
把 spec.clusterIP 设为 None 得到 Headless Service:DNS 直接返回后端 Pod 地址列表,供有状态服务做实例级寻址与客户端自行负载均衡。
访问路径可简写:同命名空间内直接用服务名,跨命名空间用服务名.命名空间,完整写法是服务名.命名空间.svc.cluster.local。
和另外几种暴露方式对比
- ClusterIP:仅集群内可达,服务间互调与内部管理口的默认选择
- NodePort:在每台节点上开端口,便于测试与小规模环境,端口管理成本高
- LoadBalancer:由云或本地实现申请外部负载均衡器,适合对外服务
- Ingress:七层入口,按域名与路径分发,需要控制器支持