对象定位
Endpoints 是 Service 后端的地址清单,由控制器根据 Service 选择器与 Pod 的就绪状态自动维护;EndpointSlice 是它的分片化实现,把后端切成每片默认至多 100 个地址的小对象,并携带每个地址的就绪条件。适用平台是 Kubernetes(1.21 起 EndpointSlice 默认启用)。排障时它是判断「Service 有没有可用后端」最直接的依据,也是 502/503 类问题的第一现场。
基本信息
| 适用平台 | Kubernetes,EndpointSlice 为当前推荐机制,Endpoints 仍保留兼容 |
|---|---|
| 维护方 | 控制面控制器,按 Service 的 selector 匹配 Pod 并跟踪就绪状态 |
| 分片规则 | 每片默认最多 100 个地址,超出后拆成多个切片 |
| 关联方式 | 通过 kubernetes.io/service-name 标签关联到对应 Service |
典型使用场景
- 服务不通的第一站:确认是「后端为空」还是「后端存在但连不上」
- 核对滚动发布影响:观察端点数量在发布过程中的波动是否会造成容量缺口
- 检查选择器写错:Service 的 selector 与 Pod 标签不一致时,端点会一直为空
- 无选择器的 Service:手工管理 Endpoints 或指向外部地址时,用它核对条目
- Headless 服务排查:确认每个 Pod 是否都有独立地址进入列表
查看后端
查看后端
kubectl get endpoints web -o yaml # 传统清单:addresses 与 notReadyAddresses
kubectl get endpointslices -l kubernetes.io/service-name=web # 分片视图
kubectl get endpointslice web-abc12 -o yaml | head -40 # 单个切片的条件与端口
kubectl get endpoints web -o jsonpath='{.subsets[*].addresses[*].ip}' # 只取就绪 IP
kubectl get svc web -o jsonpath='{.spec.selector}' # 与 Pod 标签比对
kubectl get pods -l app=web -o wide # 核对 READY 列关注点
| 字段 | 含义 | 排障价值 |
|---|---|---|
| addresses | 就绪的后端地址 | 为空说明没有 Ready Pod,服务必然 503 |
| notReadyAddresses | 未就绪地址 | 有地址但不在此列才接流量,可据此判断探针问题 |
| conditions.ready | EndpointSlice 中单个终止点是否就绪 | false 时被剔除出转发目标 |
| ports | 该切片对应的后端端口 | 与 targetPort 核对,端口不一致会 502 |
排查 502 或连接拒绝时,先确认 Service 的 Endpoints 是否有地址,再看地址指向的 Pod 是否真的在监听端口,避免把应用层问题误判成网络问题。
Endpoints 与 EndpointSlice 的内容应当一致;两者长期不一致通常说明控制器异常或集群里同时运行了旧的双写逻辑,值得单独排查。