一、为什么 ClusterIP 是默认值

当你创建一个 Service 但没有显式指定 type 时,它默认就是 ClusterIP。这意味着:

  • Kubernetes 会为它分配一个虚拟 IP
  • 这个 IP 只在集群内可访问
  • 客户端通过这个 IP 或 Service DNS 名称访问后端 Pod

因此 ClusterIP 特别适合内部服务互调,比如 API 调 API、前端调后端、应用调中间件。

二、先创建后端 Deployment

原文先用一个 nginx Deployment 作为后端:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
        ports:
        - containerPort: 80

这里有两个很关键的字段:

  • spec.template.metadata.labels:Pod 会带上的标签
  • spec.selector.matchLabels:Deployment 用来识别自己 Pod 的条件

三、再定义 ClusterIP Service

最小可用 Service 配置如下:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

如果容器端口起了名字,targetPort 也可以直接引用端口名:

ports:
- containerPort: 80
  name: http-web-svc
---
ports:
- protocol: TCP
  port: 80
  targetPort: http-web-svc

这在容器端口可能变化、但服务入口要保持稳定时很实用。

四、Service 建好后,为什么 Pod IP 变了也不怕

原文用删除全部 Pod 再重建的方式演示了这一点:

kubectl delete pod -l app=nginx
kubectl get pod -l app=nginx -o wide
kubectl get svc
curl 10.0.35.90

你会发现:

  • Pod IP 变了
  • Service 的 ClusterIP 不变
  • 服务访问仍然正常

这正是 Service 的核心价值:让客户端不直接依赖瞬时 Pod 地址。

五、ClusterIP 怎么在集群内被访问

原文给了两种非常典型的访问方式。

1.1 同命名空间访问

在同一命名空间里,直接访问服务名就行:

kubectl exec -it nginx-deployment-xxx -- sh
wget http://my-service

这背后依赖的是集群 DNS,会把 my-service 解析成 my-service.default.svc.cluster.local 对应的 ClusterIP。

1.2 跨命名空间访问

跨命名空间时,需要把命名空间补上:

wget http://metrics-server.kube-system:443

这也是很多集群组件互调时常见的写法。

六、如何在集群里验证 ClusterIP 解析

原文还通过 debug 工具 Pod 演示了 DNS 解析和访问:

kubectl create deploy cluster-test --image=registry.cn-hangzhou.aliyuncs.com/zq-demo/debug-tools -- sleep 3600
kubectl exec -it cluster-test-xxx -- bash
nslookup my-service
curl my-service

你会看到:

  • nslookup 返回的是 Service 的 ClusterIP
  • curl 命中的是后端 nginx 页面

所以可以把 ClusterIP 理解成“只在集群内部有效的稳定虚拟入口”。只要业务流量不需要直接暴露到集群外,ClusterIP 往往就是最简单也最稳妥的选择。