Endpoints
学习目标
- 理解 Endpoints 的概念和作用
- 掌握 Endpoints 的配置方法
- 了解 Endpoints 的使用场景
核心概念
一句话解释
Endpoints 是 Kubernetes 中存储 Service 后端 Pod IP 和端口的资源,用于实现 Service 到 Pod 的映射。
Endpoints 工作原理
┌─────────────────────────────────────────┐
│ Service │
│ selector: app: my-app │
│ ports: port: 80, targetPort: 8080 │
└─────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ Endpoints │
│ - 10.244.1.5:8080 │
│ - 10.244.2.8:8080 │
│ - 10.244.1.12:8080 │
└─────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ Pod 1, Pod 2, Pod 3 │
│ label: app: my-app │
│ port: 8080 │
└─────────────────────────────────────────┘
Endpoints 配置
apiVersion: v1
kind: Endpoints
metadata:
name: my-service
subsets:
- addresses:
- ip: 10.244.1.5
- ip: 10.244.2.8
- ip: 10.244.1.12
ports:
- port: 8080
protocol: TCP
自动创建 Endpoints
# Service 自动创建 Endpoints
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app
ports:
- port: 80
targetPort: 8080
---
# 自动生成的 Endpoints
apiVersion: v1
kind: Endpoints
metadata:
name: my-service
subsets:
- addresses:
- ip: 10.244.1.5
targetRef:
kind: Pod
name: my-pod-1
- ip: 10.244.2.8
targetRef:
kind: Pod
name: my-pod-2
ports:
- port: 8080
protocol: TCP
Endpoints 与 Service 关系
┌─────────────────────────────────────────┐
│ Service │
│ - selector: app: my-app │
│ - ports: port: 80, targetPort: 8080 │
└─────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ Endpoints Controller │
│ - 监听 Pod 变化 │
│ - 匹配 selector │
│ - 更新 Endpoints │
└─────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ Endpoints │
│ - 后端 Pod IP 列表 │
│ - 自动更新 │
└─────────────────────────────────────────┘
Endpoints 更新流程
1. Pod 创建/删除
└─ Pod IP 变化
└─ label 匹配检查
2. Endpoints Controller
└─ 监听 Pod 变化
└─ 更新 Endpoints
3. kube-proxy
└─ 监听 Endpoints 变化
└─ 更新 iptables/IPVS 规则
4. 流量路由
└─ 请求路由到新 Pod
Endpoints 手动管理
# 手动创建 Endpoints(无 selector 的 Service)
apiVersion: v1
kind: Service
metadata:
name: external-service
spec:
ports:
- port: 80
targetPort: 8080
---
apiVersion: v1
kind: Endpoints
metadata:
name: external-service
subsets:
- addresses:
- ip: 203.0.113.10
- ip: 203.0.113.11
ports:
- port: 8080
protocol: TCP
Endpoints 特性
| 特性 | 说明 |
|---|---|
| 自动更新 | Pod 变化时自动更新 |
| 动态映射 | Service 到 Pod 的动态映射 |
| 健康检查 | 自动移除不健康 Pod |
| 手动管理 | 支持手动创建 Endpoints |
Endpoints 使用场景
1. 自动服务发现
- Service 自动发现后端 Pod
- 无需手动配置
2. 外部服务代理
- 手动创建 Endpoints
- 代理外部服务流量
3. 健康检查集成
- 自动移除不健康 Pod
- 提高服务可用性
4. 流量路由
- 基于 Endpoints 路由流量
- 实现负载均衡
Endpoints 查看和调试
# 查看 Endpoints
kubectl get endpoints my-service
# 查看 Endpoints 详情
kubectl describe endpoints my-service
# 查看所有 Endpoints
kubectl get endpoints
# 查看 Endpoints YAML
kubectl get endpoints my-service -o yaml
Endpoints 与 EndpointSlice
┌─────────────────────────────────────────┐
│ Endpoints (旧) │
│ - 单个 Endpoints 资源 │
│ - 大规模时性能问题 │
└─────────────────────────────────────────┘
┌─────────────────────────────────────────┐
│ EndpointSlice (新) │
│ - 分片存储 │
│ - 更好的扩展性 │
│ - 支持更多后端 │
└─────────────────────────────────────────┘
Endpoints 最佳实践
1. 使用 selector 自动管理
- 避免手动管理 Endpoints
- 利用 Endpoints Controller
2. 配置健康检查
- 自动移除不健康 Pod
- 提高服务可用性
3. 监控 Endpoints
- 检查后端 Pod 状态
- 及时发现问题
4. 使用 EndpointSlice
- 大规模集群使用 EndpointSlice
- 更好的扩展性
实践练习
练习 1:查看 Endpoints
- 创建 Service
- 查看自动创建的 Endpoints
- 验证 Pod IP 映射
练习 2:手动管理 Endpoints
- 创建无 selector 的 Service
- 手动创建 Endpoints
- 验证流量路由
常见误解
1. Endpoints 不是手动管理的
错误:手动管理所有 Endpoints
正确:使用 selector 自动管理
Endpoints Controller 自动更新 Endpoints
2. Endpoints 不是静态的
错误:Endpoints 配置是静态的
正确:Endpoints 是动态的
Pod 变化时 Endpoints 自动更新
小结
| 要点 | 说明 |
|---|---|
| Endpoints | Service 后端 Pod IP 列表 |
| 自动更新 | Pod 变化时自动更新 |
| 动态映射 | Service 到 Pod 的动态映射 |
| 使用场景 | 自动服务发现、外部服务代理 |
| 最佳实践 | 使用 selector 自动管理 |
练习编辑器
bash
Loading...