### [虚拟集群 IP (ClusterIP)](https://www.jiyueip.com/topic/1871) **Published:** 2026-03-05T11:25:10 **Author:** 斑斓 **Excerpt:** ClusterIP 是 Kubernetes(K8s)中最默认、最核心的 Service 类型。它的主要作用是为集群内部的一组 Pod(通常是一个应用的多个副本)提供一个稳定的虚拟 IP 地址和 DNS 名称。 以下是关于 ClusterI ClusterIP 是 Kubernetes(K8s)中最默认、最核心的 Service 类型。它的主要作用是为集群内部的一组 Pod(通常是一个应用的多个副本)提供一个稳定的虚拟 IP 地址和 DNS 名称。 以下是关于 ClusterIP 的核心概念、工作原理及使用场景的详细解析: ### **1\. 核心定义** - 内部访问:ClusterIP 只能在 Kubernetes 集群内部访问。集群外部的客户端无法直接通过该 IP 访问服务。 - 虚拟 IP:这个 IP 不是绑定在某台具体物理机或虚拟机网卡上的真实 IP,而是一个由 `kube-proxy` 组件在逻辑上维护的“虚拟”IP。 - 负载均衡:当流量发送到 ClusterIP 时,Kubernetes 会自动将请求负载均衡到后端所有健康的 Pod 上。 - 服务发现:Kubernetes 会自动为每个 Service 创建 DNS 记录(格式通常为 `..svc.cluster.local`),集群内的其他应用可以通过域名直接访问,而无需硬编码 IP。 ### **2\. 工作原理** ClusterIP 的实现主要依赖以下两个组件的协作: 1. kube-proxy: - 它在每个节点上运行,负责监听 Kubernetes API Server 中 Service 和 Endpoint 的变化。 - 一旦检测到新的 ClusterIP Service,它会在节点上配置网络规则(通常使用 iptables 或 IPVS 模式)。 - 当数据包发往 ClusterIP 时,这些规则会将数据包的目标地址重写(DNAT)为后端某个具体 Pod 的 IP 地址。 2. Endpoints (端点): - Service 本身只是一个抽象层,它通过标签选择器(Label Selector)找到后端的 Pod。 - Kubernetes 会自动创建一个与 Service 同名的 `Endpoints` 对象,其中记录了所有匹配标签的 Pod 的真实 IP 和端口列表。 - 如果后端 Pod 重启或扩缩容,Endpoints 会自动更新,kube-proxy 也会随之刷新网络规则,确保流量只转发给健康的 Pod。 ### **3\. 典型使用场景** 由于 ClusterIP 无法从外部直接访问,它通常用于以下场景: - 微服务间通信:这是最常见的用法。例如,前端服务(Frontend)需要调用后端数据库服务(Database)或缓存服务(Redis)。前端服务只需访问 `db-service` 的 ClusterIP 或域名,无需知道数据库 Pod 的具体 IP。 - 内部监控与度量:Prometheus 等监控系统通过 ClusterIP 抓取集群内各个组件的指标数据。 - 作为其他暴露方式的后端:NodePort、LoadBalancer 或 Ingress 通常背后指向一个 ClusterIP Service。外部流量先到达 NodePort/Ingress,然后被转发到 ClusterIP,再由 ClusterIP 分发给 Pod。 ### **4\. 示例配置 (YAML)** 以下是一个典型的 ClusterIP Service 定义: | | | | --- | --- | | 1

2

3

4

5

6

7

8

9

10

11

12

13 | `apiVersion: v1`

`kind: Service`

`metadata:`

`  name: my-backend-service`

`  namespace: default`

`spec:`

`  type: ClusterIP  # 默认值,即使不写也是 ClusterIP`

`  selector:`

`    app: my-backend-app  # 标签选择器,匹配带有此标签的 Pod`

`  ports:`

`    - protocol: TCP`

`      port: 80           # Service 暴露的端口 (ClusterIP 监听的端口)`

`      targetPort: 8080   # 后端 Pod 容器实际监听的端口` | 访问方式: 在集群内的任意 Pod 中,可以通过以下方式访问: - 通过域名:`curl http://my-backend-service.default.svc.cluster.local:80` - 通过短域名:`curl http://my-backend-service:80` (在同一 Namespace 下) - 通过 IP:`curl http://:80` (需先通过 `kubectl get svc` 查看 IP) ### **5\. ClusterIP 与其他类型的对比** ![](https://img.jiyueip.com/wp-content/uploads/2026/03/20260305192504838.png) ### **总结** ClusterIP 是 Kubernetes 服务网格的基石。它屏蔽了后端 Pod 的动态变化(IP 会变、数量会变),为集群内部提供了稳定的服务入口和自动负载均衡能力。如果你需要在集群外部访问服务,通常需要结合 Ingress Controller 或 LoadBalancer 类型,但它们最终往往还是会路由到 ClusterIP。 ---