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: TCP

Endpoints 的核心功能:

  • 后端发现:记录实际可用的 Pod IP 地址
  • 健康状态:只包含通过就绪探针检查的 Pod
  • 动态更新:实时反映后端 Pod 的变化
  • 端口映射:维护 Service port 到 Pod port 的映射

二、详细功能对比

功能特性ServiceEndpoint/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.com

Endpoints 的使用场景

# 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: Local

Endpoints 配置重点

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-service

Endpoints 监控重点

# 检查后端可用性
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-app

Endpoints 性能优化

# 使用 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

八、总结

维度ServiceEndpoint/EndpointSlice
角色服务门面后端实现
稳定性高(VIP/DNS稳定)低(IP动态变化)
关注点如何访问谁能被访问
配置频率低频高频自动更新
网络层级L4 负载均衡后端目标发现
扩展性通过类型扩展通过EndpointSlice扩展

简单比喻:

  • Service 就像餐厅的接待台和菜单 - 提供统一的入口和访问方式
  • Endpoints 就像后厨的厨师列表 - 记录实际提供服务的人员和位置

两者协同工作,Service 定义"什么服务可用",Endpoints 定义"谁可以提供这个服务",共同实现了 Kubernetes 强大的服务发现和负载均衡能力。