39·Service进阶

Endpoints

kubernetesserviceendpointsnetworking

Endpoints

学习目标

  1. 理解 Endpoints 的概念和作用
  2. 掌握 Endpoints 的配置方法
  3. 了解 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

  1. 创建 Service
  2. 查看自动创建的 Endpoints
  3. 验证 Pod IP 映射

练习 2:手动管理 Endpoints

  1. 创建无 selector 的 Service
  2. 手动创建 Endpoints
  3. 验证流量路由

常见误解

1. Endpoints 不是手动管理的

错误:手动管理所有 Endpoints
正确:使用 selector 自动管理

Endpoints Controller 自动更新 Endpoints

2. Endpoints 不是静态的

错误:Endpoints 配置是静态的
正确:Endpoints 是动态的

Pod 变化时 Endpoints 自动更新

小结

要点说明
EndpointsService 后端 Pod IP 列表
自动更新Pod 变化时自动更新
动态映射Service 到 Pod 的动态映射
使用场景自动服务发现、外部服务代理
最佳实践使用 selector 自动管理

练习编辑器

bash
Loading...

继续学习

完成本课后,建议继续学习下一课「Headless Service」 以巩固所学知识。