文章目录
- [1. 前言](#1. 前言)
- [2. 基础说明](#2. 基础说明)
-
- [2.1 什么是 EndpointSlice](#2.1 什么是 EndpointSlice)
- [2.2 废弃旧版 Endpoints](#2.2 废弃旧版 Endpoints)
- [2.3 查看 EndpointSlice 资源](#2.3 查看 EndpointSlice 资源)
- [2.4 分片容量配置](#2.4 分片容量配置)
- [2.6 端点状态](#2.6 端点状态)
- [2.7 拓扑信息](#2.7 拓扑信息)
- [3. 进阶说明](#3. 进阶说明)
-
- [3.1 资源管理机制](#3.1 资源管理机制)
-
- [3.1.1 默认资源管理主体](#3.1.1 默认资源管理主体)
- [3.1.2 多控制器共存机制](#3.1.2 多控制器共存机制)
- [3.1.3 管理方隔离标签](#3.1.3 管理方隔离标签)
- [3.2 资源归属关系](#3.2 资源归属关系)
- [3.3 分片分配与填充逻辑](#3.3 分片分配与填充逻辑)
-
- [3.3.1 分片拆分规则](#3.3.1 分片拆分规则)
- [3.3.2 控制器填充分片执行流程](#3.3.2 控制器填充分片执行流程)
- [3.3.3 核心设计权衡](#3.3.3 核心设计权衡)
- [3.3.4 分片规整时机](#3.3.4 分片规整时机)
- [3.4 端点去重规则](#3.4 端点去重规则)
1. 前言
在 Kubernetes 流量转发体系中,Service 只负责对外提供固定访问入口,真正存储后端 Pod 真实 IP、端口、健康状态 的资源是端点资源。在新版 K8s 中,EndpointSlice 已全面替代传统 Endpoints,成为集群后端端点管理的核心资源,是 kube-proxy 流量转发、负载均衡的核心数据来源。

2. 基础说明
2.1 什么是 EndpointSlice
EndpointSlice 是 Kubernetes v1.21 正式稳定的 API 资源,专门用于管理 Service 关联的后端端点列表,核心存储数据为「Pod 真实 IP + 业务端口 + 健康状态」。
kube-proxy 读取 EndpointSlice 作为集群内部流量路由的唯一可信数据源。
精准区分核心职责:
Service管统一访问入口EndpointSlice管后端真实地址清单kube-proxy所有的负载均衡规则、流量转发逻辑,全部依赖EndpointSlice同步的后端端点数据生成。
2.2 废弃旧版 Endpoints
在 EndpointSlice 出现之前,K8s 依靠 Endpoints 资源存储后端端点,但原生 Endpoints 存在三大硬伤,无法适配大规模集群生产场景:
-
不支持双栈网络 :无法同时兼容
IPv4、IPv6双栈集群部署,无法适配新一代云原生网络架构; -
能力扩展性极差:不支持流量分布权重、应用协议标识、端点拓扑、健康状态细分等现代化流量治理特性;
-
单对象容量瓶颈严重 :单个
Endpoints对象存储的端点数量上限极低,端点超过 1000 个会被直接截断 ,导致大量后端Pod无法接入负载均衡,业务流量异常、部分实例无法承接请求。
为解决以上问题,K8s 推出分片式端点管理机制:EndpointSlice 采用动态分片存储 策略,默认每 100 个端点自动生成一个全新的 EndpointSlice 资源。无论后端 Pod 数量多少,都不会出现端点截断、数据丢失问题,完美支撑超大规模集群业务扩容。
2.3 查看 EndpointSlice 资源
集群控制平面会自动 为配置了标签选择器的 Service 创建 EndpointSlice,其中包含所有匹配 Service 标签的 Pod 地址信息。EndpointSlice 会按照 IP 协议族、传输协议、端口、Service 名称进行分组存放端点。
我们可以通过简单实验直观看到 EndpointSlice 分片存储效果,以及它如何绑定 Service 与后端 Pod。
查看集群 EndpointSlice 资源:
bash
kubectl get endpointslices
输出示例:
java
NAME ADDRESSTYPE PORTS ENDPOINTS AGE
nginx-svc-zdr4z IPv4 80 10.84.42.203,10.99.87.177,10.84.42.200 4h7m
输出字段说明:
NAME:EndpointSlice资源名称,由Service名称 + 随机后缀组成,一个Service可对应多条分片EndpointSlice;ADDRESSTYPE:地址类型,支持IPv4/IPv6,天然兼容双栈集群,仅支持单协议族,一个资源只能存放IPv4或IPv6地址,若Service同时支持双栈(IPv4+IPv6),控制器会生成至少两份独立EndpointSlice,分别存放两种协议地址。PORTS:后端容器监听端口,与Service端口配置对应;ENDPOINTS:后端就绪Pod的真实IP地址清单;当端点数量超过100个,自动拆分生成多条独立EndpointSlice;AGE:资源创建时长。
💡 对比提示:
- 旧资源
Endpoints一个Service只能对应单个对象,大量端点容易截断; EndpointSlice采用分片机制,多个对象共同承载后端列表,无数量上限。
查看 EndpointSlice 详细信息:
bash
kubectl describe endpointslices nginx-svc-zdr4z
输出示例:
bash
Name: nginx-svc-zdr4z
Namespace: default
Labels: endpointslice.kubernetes.io/managed-by=endpointslice-controller.k8s.io
kubernetes.io/service-name=nginx-svc
Annotations: endpoints.kubernetes.io/last-change-trigger-time: 2026-07-14T03:25:22Z
AddressType: IPv4
Ports:
Name Port Protocol
---- ---- --------
http-web 80 TCP
Endpoints:
- Addresses: 10.84.42.203
Conditions:
Ready: true
Hostname: <unset>
TargetRef: Pod/nginx-web-55ff4cbb5c-sbjl8
NodeName: iz2ze60mcbemirrld91q6sz
Zone: <unset>
- Addresses: 10.99.87.177
Conditions:
Ready: true
Hostname: <unset>
TargetRef: Pod/nginx-web-55ff4cbb5c-4pwpn
NodeName: iz2ze60mcbemirrld91q6rz
Zone: <unset>
- Addresses: 10.84.42.200
Conditions:
Ready: true
Hostname: <unset>
TargetRef: Pod/nginx-web-55ff4cbb5c-rl647
NodeName: iz2ze60mcbemirrld91q6sz
Zone: <unset>
Events: <none>
核心观察点:
-
Endpoints:列出所有后端Pod真实IP+ 端口; -
Conditions:标记Pod是否就绪; -
Ports:展示端口协议,支持appProtocol自定义协议识别。
2.4 分片容量配置
默认每个 EndpointSlice 最多存放 100 个端点,可通过 kube-controller-manager 启动参数 --max-endpoints-per-slice 修改,上限为 1000。
2.6 端点状态
EndpointSlice 内置三类端点状态( Conditions 字段),供代理组件读取判断流量转发策略:
-
serving服务中:代表当前端点可正常处理业务流量;Pod场景下等价于Pod就绪状态Ready。 -
terminating终止中:标记该
Pod已收到删除指令、正在销毁,容器尚未退出。流量代理默认不会转发流量至终止中端点;若所有端点均处于终止状态,则会少量转发,保障滚动更新期间业务无流量丢失。 -
ready就绪:等价于「serving且未终止」;若Service开启publishNotReadyAddresses:true,未就绪端点该状态也会为true。
2.7 拓扑信息
每个端点可携带节点、可用区拓扑元数据,字段如下:
nodeName:端点所在节点名称zone:端点所属可用区
3. 进阶说明
3.1 资源管理机制
EndpointSlice 是 Kubernetes 替代传统 Endpoints 的大规模集群端点分片管理资源 ,具备分片、扩容、多租户、多控制器隔离能力,是现代 kube-proxy 流量转发的核心数据源。
3.1.1 默认资源管理主体
集群默认由 控制平面内置端点分片控制器 (endpointslice-controller)全权托管:
- 自动监听集群
Service、Pod、Node资源变更; - 自动完成
EndpointSlice的 创建、更新、删除、分片规整; - 保证
Service后端端点集合实时、精准、一致。
3.1.2 多控制器共存机制
EndpointSlice 支持多控制器并行管理,适配服务网格、自定义网关、自研负载均衡等拓展场景:
Istio、APISIX、Ingress-Nginx、自定义代理组件可独立维护专属分片;- 不同控制器互不抢占、互不覆盖,实现流量数据源隔离;
- 原生
kube-proxy可根据标签精准识别、消费对应分片。
3.1.3 管理方隔离标签
K8s 通过专属标签严格区分资源归属控制器,避免多组件冲突覆盖:
- 标签键:
endpointslice.kubernetes.io/managed-by - 系统默认分片:值为
endpointslice-controller.k8s.io,由集群控制器管理; - 第三方组件:必须配置唯一自定义标识 (如
istio.io、kpng.io),防止资源互相覆盖、错乱同步。
3.2 资源归属关系
所有 EndpointSlice 资源强归属某一个 Service,不存在无归属、多归属分片,保证流量拓扑清晰。
属主关联机制:
- 通过
OwnerReference资源属主字段绑定父级Service; - 删除 Service 时,所有关联
EndpointSlice级联自动回收,杜绝僵尸资源。
系统自动为所有分片注入固定标签:
- 标签:
kubernetes.io/service-name: ${svc-name} - 作用:可通过标签 一次性筛选当前 Service 全部分片,用于排查端点、同步、故障定位。
3.3 分片分配与填充逻辑
EndpointSlice 控制器拥有固定的分片拆分、复用、扩容策略,是大规模集群性能优化的关键。
3.3.1 分片拆分规则
- 一个分片内所有端点必须共用同一组端口规则;
- 若
Service使用命名端口 ,不同Pod同名端口实际端口号不一致,会强制拆分新分片; - 端口集合不同的端点,绝不混装在同一个
EndpointSlice中,保证kube-proxy转发规则正确性。
3.3.2 控制器填充分片执行流程
- 遍历当前
Service所有已存在EndpointSlice; - 清理失效、已删除、状态异常的端点;
- 更新发生变更的端点
IP、状态、拓扑信息; - 优先复用现有分片,向空闲位置填充新增端点;
- 现有分片容量不足时,新建分片,而非强行填满旧分片。
3.3.3 核心设计权衡
官方分片策略遵循:优先降低集群更新开销,不追求分片利用率最大化。
设计原因:
- 集群所有节点的
kube-proxy都会监听全部 EndpointSlice 变更; - 每次分片更新都会触发全集群节点规则重同步;
- 频繁合并、填满分片会产生海量全局更新,导致控制面、节点 CPU 暴涨;
- 牺牲分片饱满度,换取极低的集群广播更新压力。
3.3.4 分片规整时机
在 Deployment 滚动更新、扩缩容重建 场景下:
- 旧
Pod批量销毁、新Pod批量重建; - 控制器自动整体重新规整分片;
- 自动填补历史碎片空位,最终实现分片高利用率。
3.4 端点去重规则
由于分片变更同步存在时间差,同一个端点可能同时存在于多个 EndpointSlice。
客户端强制规范:
读取 Service 后端列表时,必须遍历该 Service 全部 EndpointSlice,汇总并去重所有端点。kube-proxy 内部 EndpointSliceCache 提供标准聚合去重实现。