Service VS Endpoint
Service 和 Endpoint/EndpointSlice 在 Kubernetes 中有明确的功能分工,它们共同构成了服务发现和负载均衡的基础。以下是详细的区别分析:
一、核心功能定位
Service - 抽象服务层
apiVersion: v1
kind: Service
metadata:
name: web-service
spec:
selector:
app: web-server
ports:
- protocol: TCP
port: 80 # 服务端口
targetPort: 8080 # 后端 Pod 端口
type: ClusterIP # 服务类型Service 的核心功能:
- 服务抽象:提供稳定的虚拟 IP 和 DNS 名称
- 访问入口:定义客户端如何访问服务
- 负载均衡策略:指定流量分发方式
- 服务类型:ClusterIP、NodePort、LoadBalancer、ExternalName
Endpoint/EndpointSlice - 后端实现层
apiVersion: v1
kind: Endpoints
metadata:
name: web-service # 必须与 Service 同名
subsets:
- addresses:
- ip: 10.244.1.5
targetRef:
kind: Pod
name: web-pod-1
- ip: 10.244.1.6
targetRef:
kind: Pod
name: web-pod-2
ports:
- port: 8080
protocol: TCPEndpoints 的核心功能:
- 后端发现:记录实际可用的 Pod IP 地址
- 健康状态:只包含通过就绪探针检查的 Pod
- 动态更新:实时反映后端 Pod 的变化
- 端口映射:维护 Service port 到 Pod port 的映射
二、详细功能对比
| 功能特性 | Service | Endpoint/EndpointSlice |
|---|---|---|
| 抽象级别 | 逻辑抽象层 | 物理实现层 |
| 数据内容 | 虚拟IP、端口、选择器 | 实际Pod IP地址、端口 |
| 稳定性 | 稳定的VIP和DNS | 动态变化的IP列表 |
| 创建方式 | 手动定义 | 自动生成(或手动) |
| 更新频率 | 低频变更 | 高频动态更新 |
| DNS解析 | 返回Service IP | 不直接参与DNS |
| 负载均衡 | 定义策略 | 提供后端目标 |
三、实际工作流程
1. 服务访问流程
客户端请求 → Service VIP → kube-proxy → Endpoints → 实际 Pod
↓ ↓ ↓ ↓ ↓
DNS解析 虚拟IP iptables/ 后端IP列表 具体容器
10.96.x.x IPVS规则 10.244.x.x 应用服务2. 数据流向示例
# 客户端访问
curl http://web-service.default.svc.cluster.local
# DNS 解析返回 Service IP
nslookup web-service.default.svc.cluster.local
# 返回: 10.96.123.456
# kube-proxy 根据 Endpoints 配置转发
iptables -t nat -L KUBE-SERVICES | grep 10.96.123.456
# 转发到: 10.244.1.5:8080, 10.244.1.6:8080四、使用场景差异
Service 的使用场景
# 1. 内部服务访问
apiVersion: v1
kind: Service
metadata:
name: internal-api
spec:
type: ClusterIP
selector:
app: api-server
ports:
- port: 8080
# 2. 外部访问
apiVersion: v1
kind: Service
metadata:
name: external-web
spec:
type: LoadBalancer
selector:
app: web-frontend
ports:
- port: 80
nodePort: 30080
# 3. 外部服务代理
apiVersion: v1
kind: Service
metadata:
name: external-database
spec:
type: ExternalName
externalName: database.example.comEndpoints 的使用场景
# 1. 自动后端管理(默认)
# Kubernetes 自动维护匹配 Pod 的 Endpoints
# 2. 外部服务集成
apiVersion: v1
kind: Service
metadata:
name: legacy-system
spec:
ports:
- port: 3306
---
apiVersion: v1
kind: Endpoints
metadata:
name: legacy-system
subsets:
- addresses:
- ip: 192.168.1.100 # 外部数据库
ports:
- port: 3306
# 3. 多端口复杂服务
apiVersion: v1
kind: Service
metadata:
name: complex-app
spec:
ports:
- name: http
port: 80
- name: https
port: 443
- name: metrics
port: 9090五、配置和管理差异
Service 配置重点
apiVersion: v1
kind: Service
metadata:
name: optimized-service
annotations:
# 负载均衡配置
service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
# 会话保持
service.kubernetes.io/aws-load-balancer-backend-protocol: "http"
spec:
type: LoadBalancer
selector:
app: optimized-app
sessionAffinity: ClientIP
sessionAffinityConfig:
clientIP:
timeoutSeconds: 10800
ports:
- name: http
port: 80
targetPort: 8080
# 流量策略(仅对外部流量)
externalTrafficPolicy: LocalEndpoints 配置重点
apiVersion: v1
kind: Endpoints
metadata:
name: custom-endpoints
labels:
# 用于网络策略选择
environment: production
subsets:
- addresses:
- ip: 10.244.1.10
nodeName: worker-1
targetRef:
kind: Pod
name: app-pod-1
namespace: production
- ip: 10.244.1.11
nodeName: worker-2
targetRef:
kind: Pod
name: app-pod-2
namespace: production
# 多端口定义
ports:
- name: http
port: 8080
protocol: TCP
- name: metrics
port: 9090
protocol: TCP
- name: health
port: 8081
protocol: TCP六、监控和调试差异
Service 监控重点
# 检查 Service 状态
kubectl get services
kubectl describe service web-service
# Service 相关指标
kubectl top services # 如果支持
kubectl get --raw /api/v1/namespaces/default/services/web-service/proxy/metrics
# DNS 解析测试
kubectl run test-$RANDOM --image=busybox --rm -it -- nslookup web-serviceEndpoints 监控重点
# 检查后端可用性
kubectl get endpoints
kubectl describe endpoints web-service
# 验证后端 Pod 状态
kubectl get pods -l app=web-server -o wide
# 检查就绪探针
kubectl get pods -l app=web-server -o jsonpath='{.items[*].spec.containers[*].readinessProbe}'
# 直接测试后端连通性
kubectl run test-$RANDOM --image=busybox --rm -it --
# 在容器内: telnet 10.244.1.5 8080七、性能考虑差异
Service 性能优化
apiVersion: v1
kind: Service
metadata:
name: high-performance
annotations:
# 使用 IPVS 模式提高性能
service.kubernetes.io/service.beta.kubernetes.io/ipvs-scheduler: "wrr"
spec:
type: ClusterIP
clusterIP: None # Headless Service,减少一层转发
selector:
app: high-perf-appEndpoints 性能优化
# 使用 EndpointSlice 提高大规模集群性能
apiVersion: discovery.k8s.io/v1
kind: EndpointSlice
metadata:
name: web-service-abc123
labels:
kubernetes.io/service-name: web-service
addressType: IPv4
ports:
- name: http
protocol: TCP
port: 8080
endpoints:
- addresses:
- "10.244.1.5"
conditions:
ready: true
# 拓扑感知,优化路由
zone: us-west-2a
hints:
forZones:
- name: us-west-2a八、总结
| 维度 | Service | Endpoint/EndpointSlice |
|---|---|---|
| 角色 | 服务门面 | 后端实现 |
| 稳定性 | 高(VIP/DNS稳定) | 低(IP动态变化) |
| 关注点 | 如何访问 | 谁能被访问 |
| 配置频率 | 低频 | 高频自动更新 |
| 网络层级 | L4 负载均衡 | 后端目标发现 |
| 扩展性 | 通过类型扩展 | 通过EndpointSlice扩展 |
简单比喻:
- Service 就像餐厅的接待台和菜单 - 提供统一的入口和访问方式
- Endpoints 就像后厨的厨师列表 - 记录实际提供服务的人员和位置
两者协同工作,Service 定义"什么服务可用",Endpoints 定义"谁可以提供这个服务",共同实现了 Kubernetes 强大的服务发现和负载均衡能力。