在 Kubernetes 中,Endpoints 可以理解为 Service 的动态通讯录或真实路由表。
它的核心作用是:记录 Service 背后所有健康 Pod 的真实 IP 地址和端口列表。
Endpoints 与 Service 的关系
如果把 Kubernetes 的网络访问比作打电话:
- Service 就像是一个固定的总机号码(提供稳定的虚拟 IP 和 DNS 名称)。
- Endpoints 就像是总机后台的分机花名册(实时记录着今天有哪些员工在上班,以及他们具体的工位分机号)。
- Pod 就是具体的员工(Pod 的 IP 经常变化,随时可能离职或换工位)。
当你访问 Service 时,Kubernetes 会去查阅 Endpoints 这本“花名册”,找到当前所有健康的 Pod IP,然后把流量转发给其中一个。
Endpoints 是如何工作的?
Endpoints 的工作流程完全是自动化的:
- 监听与匹配:当你创建一个带有
selector(标签选择器)的 Service 时,Kubernetes 内部的 Endpoints Controller 会持续监听集群中所有 Pod 的变化。 - 自动收录:一旦发现某个 Pod 的标签匹配了 Service 的
selector,并且该 Pod 处于健康(Ready)状态,Controller 就会把这个 Pod 的IP:Port自动加入到 Endpoints 对象中。 - 动态剔除:如果 Pod 被删除、发生故障或者就绪探针(Readiness Probe)检查失败,Endpoints Controller 会立刻将其 IP 从列表中剔除。
- 流量转发:节点上的
kube-proxy组件会实时监听 Endpoints 的变化,并更新节点上的 iptables 或 IPVS 规则,确保流量只会被转发到 Endpoints 列表里存在的健康 Pod 上。
实战:如何查看 Endpoints
你可以通过
kubectl 命令直观地看到 Service 和 Endpoints 的对应关系。假设你有一个名为
my-nginx-svc 的 Service,后端有两个 Nginx Pod:-
查看 Service(总机号码):
kubectl get svc my-nginx-svc
输出会显示一个稳定的集群虚拟 IP(ClusterIP),例如 10.100.200.30。
查看 Endpoints(分机花名册):
kubectl get endpoints my-nginx-svc
# 或者简写
kubectl get ep my-nginx-svc
输出示例:
NAME ENDPOINTS AGE
my-nginx-svc 10.244.1.5:80,10.244.2.8:80 1m
可以看到,Endpoints 精确地记录了后端两个 Pod 的真实 IP(10.244.1.5 和 10.244.2.8)以及端口 80。
-----
在早期的 Kubernetes 版本中,所有的 IP 列表都塞在同一个 Endpoints 对象里。但随着集群规模扩大(例如一个 Service 背后有上千个 Pod),这个对象会变得极其庞大,导致 API Server 和 kube-proxy 更新压力剧增。
因此,Kubernetes 引入了 EndpointSlices 作为 Endpoints 的升级版。它将庞大的 IP 列表分片存储(每个分片最多包含 100 个端点),大大提高了大规模集群下的网络性能和扩展性。在较新的 K8s 版本中,EndpointSlices 已经成为默认机制。
欢迎来撩 : 汇总all
