endpointslice 是为解决 endpoints 在大规模场景下的性能瓶颈而设计的原生机制,通过分片(默认≤100端点/片)降低 api server 压力、减少同步开销并提升节点侧效率;需 kubernetes ≥1.21、kube-proxy 启用 iptables/ipvs 模式,并依赖 endpoint-slice-controller 自动管理。

EndpointSlice 并不是用来“突破 1000 个端点”这个具体数字的临时补丁,而是为了解决传统 Endpoints 资源在大规模场景下天然存在的性能瓶颈——比如 API Server 压力陡增、全量同步开销大、节点侧资源消耗高。它通过分片机制把一个服务的成千上万个端点,拆成多个小而轻的 EndpointSlice 对象(默认每片 ≤100 个端点),让控制平面和数据平面都能更高效地处理。
确认集群和组件版本支持
EndpointSlice 是 Kubernetes 原生能力,从 v1.21 开始稳定可用(GA)。你需要确保:
- Kubernetes 版本 ≥ 1.21,且 feature gate EndpointSlice=true 已启用(v1.21+ 默认开启)
- kube-proxy 运行在 iptables 或 IPVS 模式(userspace 模式不推荐,已弃用)
- 如果你使用 Rancher,需在集群网络提供器中显式开启:
enableEndpointSlice: true - Istio Ambient 模式用户,需确认 pilot 版本 ≥ 1.20,并启用
--enable-endpoint-slice启动参数
避免手动创建,依赖自动控制器生成
EndpointSlice 由 Kubernetes 自带的 endpoint-slice-controller 自动管理,无需手写 YAML。只要 Service 存在且后端 Pod 就绪,控制器就会按需创建/更新/清理切片。关键点是:
- 确保 Service 的
selector准确匹配目标 Pod 标签,否则端点无法被发现 - 不要删除或修改自动生成的 EndpointSlice 对象(它们受 ownerReference 约束)
- 若需调整单片容量(如从默认 100 改为 50),可通过 kube-controller-manager 启动参数设置:
--max-endpoints-per-slice=50
配合网关与服务网格做增量感知
单纯启用 EndpointSlice 只解决了“存储分片”,真正发挥性能优势,还需下游组件支持增量更新:
- Nginx Ingress Controller v1.0+、APISIX Ingress v3.0+ 均原生监听 EndpointSlice 事件,可避免轮询庞大 Endpoints 对象
- Istio Ambient 模式下,ZTunnel 和 Waypoint Proxy 会订阅 EndpointSlice 变更,但需关闭全量推送:在 Istiod 配置中设
PILOT_ENABLE_ENDPOINT_SLICE=true并启用PILOT_USE_ENDPOINT_SLICE=true - 自研客户端若直连 Kubernetes API,应改用 watch EndpointSlice 而非 Endpoints,减少单次响应体积和解析开销
验证是否真正生效
别只看配置开了没,要确认流量路径已实际切换:
- 执行
kubectl get endpointslice -l kubernetes.io/service-name=your-service-name,观察切片数量是否随 Pod 数量增长而增加(例如 1200 个 Pod → 约 12 个切片) - 检查 kube-proxy 日志,搜索
"Using EndpointSlice"或"endpointslice informer",确认其正使用切片而非旧 Endpoints - 对比启用前后指标:
apiserver_request_total{resource="endpoints"}应明显下降,apiserver_request_total{resource="endpointslices"}上升,但总请求耗时降低











