ClusterIP 服务
学习目标
- 理解 ClusterIP 的工作原理
- 掌握 ClusterIP 的配置方法
- 了解 ClusterIP 的使用场景
核心概念
一句话解释
ClusterIP 是 Kubernetes 默认的 Service 类型,提供集群内部的稳定访问入口,仅在集群内部可访问。
ClusterIP 工作原理
集群内部
┌─────────────────────────────────────────┐
│ ClusterIP Service │
│ IP: 10.96.0.100 │
│ Port: 80 │
│ ┌─────────────────────────────────┐ │
│ │ Endpoints │ │
│ │ - 10.244.1.5:8080 │ │
│ │ - 10.244.2.8:8080 │ │
│ │ - 10.244.1.12:8080 │ │
│ └─────────────────────────────────┘ │
└─────────────────────────────────────────┘
│ │ │
▼ ▼ ▼
┌───────────┐ ┌───────────┐ ┌───────────┐
│ Pod 1 │ │ Pod 2 │ │ Pod 3 │
│ 10.244.1.5│ │ 10.244.2.8│ │ 10.244.1.12│
└───────────┘ └───────────┘ └───────────┘
ClusterIP 配置
apiVersion: v1
kind: Service
metadata:
name: my-service
namespace: default
spec:
type: ClusterIP
selector:
app: my-app
ports:
- name: http
protocol: TCP
port: 80
targetPort: 8080
配置参数说明
| 参数 | 说明 | 默认值 |
|---|---|---|
| type | Service 类型 | ClusterIP |
| selector | Pod 选择器 | 无 |
| port | Service 端口 | 无 |
| targetPort | Pod 端口 | 与 port 相同 |
| protocol | 协议 | TCP |
| name | 端口名称 | 无 |
ClusterIP 访问方式
1. 通过 ClusterIP 访问
curl http://10.96.0.100:80
2. 通过 DNS 名称访问
curl http://my-service.default.svc.cluster.local:80
3. 通过简短 DNS 名称访问(同命名空间)
curl http://my-service:80
ClusterIP 端口映射
┌─────────────────────────────────────────┐
│ Service │
│ port: 80 ──────────────────────────────┼─→ 客户端访问端口
│ targetPort: 8080 ──────────────────────┼─→ Pod 监听端口
└─────────────────────────────────────────┘
ClusterIP 与 Endpoints
# 查看 Service
kubectl get service my-service
# 查看 Endpoints
kubectl get endpoints my-service
# 输出示例
# NAME ENDPOINTS AGE
# my-service 10.244.1.5:8080,10.244.2.8:8080,10.244.1.12:8080 5m
ClusterIP 特性
| 特性 | 说明 |
|---|---|
| 集群内访问 | 仅集群内部可访问 |
| 稳定 IP | Service IP 不会变化 |
| 负载均衡 | 自动分发请求到后端 Pod |
| DNS 解析 | 自动创建 DNS 记录 |
| 健康检查 | 自动移除不健康的 Pod |
ClusterIP 使用场景
1. 内部微服务通信
- 服务 A → Service B → Pod B
2. 数据库访问
- App → DB Service → DB Pod
3. 缓存服务
- App → Redis Service → Redis Pod
4. API 网关
- 外部 → Ingress → API Service → API Pod
ClusterIP 网络规则
┌─────────────────────────────────────────┐
│ iptables/IPVS 规则 │
├─────────────────────────────────────────┤
│ 目标: 10.96.0.100:80 │
│ 规则: 随机选择后端 Pod │
│ - 10.244.1.5:8080 (权重: 1) │
│ - 10.244.2.8:8080 (权重: 1) │
│ - 10.244.1.12:8080 (权重: 1) │
└─────────────────────────────────────────┘
实践练习
练习 1:创建 ClusterIP Service
创建一个 ClusterIP Service:
apiVersion: v1
kind: Service
metadata:
name: web-service
spec:
type: ClusterIP
selector:
app: web
ports:
- port: 80
targetPort: 8080
练习 2:验证 ClusterIP
- 创建 Service
- 查看 Service IP
- 从集群内部访问 Service
- 查看 Endpoints
常见误解
1. ClusterIP 不是外部访问
错误:从集群外部访问 ClusterIP
正确:ClusterIP 仅限集群内部访问
需要外部访问:使用 NodePort 或 LoadBalancer
2. ClusterIP 不是 Pod IP
ClusterIP:Service 的虚拟 IP
Pod IP:Pod 的实际 IP
ClusterIP 是稳定的,Pod IP 是变化的
小结
| 要点 | 说明 |
|---|---|
| ClusterIP | 默认 Service 类型 |
| 集群内访问 | 仅集群内部可访问 |
| 稳定 IP | 提供稳定的访问入口 |
| 负载均衡 | 自动分发请求到后端 Pod |
| 使用场景 | 内部微服务通信 |
练习编辑器
bash
Loading...