Kubernetes 中,Service、Endpoint 和 Pod 的关系
1. Pod
- 最小部署单元:Pod 是 K8S 中最小的调度单位,包含一个或多个容器(通常为 1 个)。
- 动态生命周期:Pod 是临时的,可能因故障、扩缩容或节点调度被重建,导致 IP 变化。
- 独立 IP:每个 Pod 有独立的集群内 IP(但不可靠,重启后会变化)。
2. Service
- 抽象服务层:Service 为一组功能相同的 Pod 提供稳定的访问入口(VIP),屏蔽 Pod 的动态变化。
- 核心功能:
- 服务发现:通过标签选择器(Label Selector)关联后端 Pod。
- 负载均衡:将请求均匀分发到多个 Pod。
- 稳定访问点:提供固定的 ClusterIP、DNS 名称(如
my-svc.default.svc.cluster.local
)和端口。
- 类型:
ClusterIP
(默认):集群内访问。NodePort
:通过节点端口暴露服务。LoadBalancer
:集成云厂商的负载均衡器。Headless
(无头服务):直接返回 Pod IP,用于 StatefulSet 或自定义服务发现。
3. Endpoint
- 动态映射表:Endpoint 是 K8S 自动维护的资源,记录 Service 关联的 Pod 的 IP:Port 列表。
- 核心作用:
- 当 Service 通过 Label Selector 匹配到 Pod 时,Endpoint 会实时更新这些 Pod 的网络地址。
- 若 Pod 宕机或新增,Endpoint 会立即同步变化,确保流量只路由到健康的 Pod。
- 手动指定:可以不使用 Label Selector,直接手动配置 Endpoint 指向外部服务(如数据库)。
三者的关系
- Service → Endpoint
- Service 通过 Label Selector 或手动配置关联到 Endpoint。
- Endpoint 是 Service 的“下游数据平面”,存储实际可用的 Pod 地址。
- Endpoint → Pod
- Endpoint 中的地址来自匹配 Label Selector 的 Pod 的
IP:Port
。 - Pod 必须通过
readinessProbe
就绪检测才会被加入 Endpoint。
- Endpoint 中的地址来自匹配 Label Selector 的 Pod 的
- Service → Pod(间接)
- 用户通过访问 Service 的 ClusterIP 或 DNS,流量最终由 kube-proxy 根据 Endpoint 列表转发到具体 Pod。
关键流程示例
-
创建 Deployment(管理 Pod):
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deploy spec: selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx
-
创建 Service(关联 Pod):
apiVersion: v1 kind: Service metadata: name: nginx-svc spec: selector: app: nginx # 匹配 Pod 的 Label ports: - protocol: TCP port: 80 targetPort: 80
-
查看生成 Endpoint:
kubectl get endpoints nginx-svc
输出示例:
NAME ENDPOINTS AGE nginx-svc 10.244.1.2:80 10s
知识点
- kube-proxy:负责维护 Service 的 IPVS/Iptables 规则,将 Service IP 转发到 Endpoint 中的 Pod IP。
- Headless Service:当不需要负载均衡时,设置
clusterIP: None
,DNS 直接返回 Pod IP 列表。 - EndpointSlice:K8S 1.21+ 推荐替代 Endpoint,支持更高效的大规模端点管理。
总结图
用户请求 → Service (ClusterIP/DNS) → Endpoint (Pod IP列表) → Pod (实际容器)
通过这种设计,K8S 实现了 解耦(服务与 Pod 分离)、高可用(自动剔除故障 Pod)和 弹性伸缩(动态更新 Endpoint)。
评论需开启科学上网!