Kubernetes 系列【20】服务:EndpointSlice 端点分片

文章目录

  • [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

EndpointSliceKubernetes v1.21 正式稳定的 API 资源,专门用于管理 Service 关联的后端端点列表,核心存储数据为「Pod 真实 IP + 业务端口 + 健康状态」。

kube-proxy 读取 EndpointSlice 作为集群内部流量路由的唯一可信数据源。

精准区分核心职责:

  • Service 管统一访问入口
  • EndpointSlice 管后端真实地址清单
  • kube-proxy 所有的负载均衡规则、流量转发逻辑,全部依赖 EndpointSlice 同步的后端端点数据生成。

2.2 废弃旧版 Endpoints

EndpointSlice 出现之前,K8s 依靠 Endpoints 资源存储后端端点,但原生 Endpoints 存在三大硬伤,无法适配大规模集群生产场景:

  • 不支持双栈网络 :无法同时兼容 IPv4IPv6 双栈集群部署,无法适配新一代云原生网络架构;

  • 能力扩展性极差:不支持流量分布权重、应用协议标识、端点拓扑、健康状态细分等现代化流量治理特性;

  • 单对象容量瓶颈严重 :单个 Endpoints 对象存储的端点数量上限极低,端点超过 1000 个会被直接截断 ,导致大量后端 Pod 无法接入负载均衡,业务流量异常、部分实例无法承接请求。

为解决以上问题,K8s 推出分片式端点管理机制:EndpointSlice 采用动态分片存储 策略,默认每 100 个端点自动生成一个全新的 EndpointSlice 资源。无论后端 Pod 数量多少,都不会出现端点截断、数据丢失问题,完美支撑超大规模集群业务扩容。

2.3 查看 EndpointSlice 资源

集群控制平面会自动 为配置了标签选择器的 Service 创建 EndpointSlice,其中包含所有匹配 Service 标签的 Pod 地址信息。EndpointSlice 会按照 IP 协议族、传输协议、端口、Service 名称进行分组存放端点。

我们可以通过简单实验直观看到 EndpointSlice 分片存储效果,以及它如何绑定 Service 与后端 Pod

基于之前 Kubernetes 系列【16】服务:ClusterIP 核心原理与演示案例

查看集群 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

输出字段说明

  • NAMEEndpointSlice 资源名称,由 Service 名称 + 随机后缀组成,一个 Service 可对应多条分片 EndpointSlice
  • ADDRESSTYPE:地址类型,支持 IPv4 / IPv6,天然兼容双栈集群,仅支持单协议族,一个资源只能存放 IPv4IPv6 地址,若 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 字段),供代理组件读取判断流量转发策略:

  1. serving 服务中:代表当前端点可正常处理业务流量;Pod 场景下等价于 Pod 就绪状态 Ready

  2. terminating 终止中:

    标记该 Pod 已收到删除指令、正在销毁,容器尚未退出。流量代理默认不会转发流量至终止中端点;若所有端点均处于终止状态,则会少量转发,保障滚动更新期间业务无流量丢失。

  3. ready 就绪:等价于「serving 且未终止」;若 Service 开启 publishNotReadyAddresses: true,未就绪端点该状态也会为 true

2.7 拓扑信息

每个端点可携带节点、可用区拓扑元数据,字段如下:

  • nodeName:端点所在节点名称
  • zone:端点所属可用区

3. 进阶说明

3.1 资源管理机制

EndpointSlice 是 Kubernetes 替代传统 Endpoints大规模集群端点分片管理资源 ,具备分片、扩容、多租户、多控制器隔离能力,是现代 kube-proxy 流量转发的核心数据源。

3.1.1 默认资源管理主体

集群默认由 控制平面内置端点分片控制器endpointslice-controller)全权托管:

  • 自动监听集群 ServicePodNode 资源变更;
  • 自动完成 EndpointSlice创建、更新、删除、分片规整
  • 保证 Service 后端端点集合实时、精准、一致。

3.1.2 多控制器共存机制

EndpointSlice 支持多控制器并行管理,适配服务网格、自定义网关、自研负载均衡等拓展场景:

  • IstioAPISIXIngress-Nginx、自定义代理组件可独立维护专属分片
  • 不同控制器互不抢占、互不覆盖,实现流量数据源隔离
  • 原生 kube-proxy 可根据标签精准识别、消费对应分片。

3.1.3 管理方隔离标签

K8s 通过专属标签严格区分资源归属控制器,避免多组件冲突覆盖:

  • 标签键:endpointslice.kubernetes.io/managed-by
  • 系统默认分片:值为 endpointslice-controller.k8s.io,由集群控制器管理;
  • 第三方组件:必须配置唯一自定义标识 (如 istio.iokpng.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 控制器填充分片执行流程

  1. 遍历当前 Service 所有已存在 EndpointSlice
  2. 清理失效、已删除、状态异常的端点;
  3. 更新发生变更的端点 IP、状态、拓扑信息;
  4. 优先复用现有分片,向空闲位置填充新增端点;
  5. 现有分片容量不足时,新建分片,而非强行填满旧分片。

3.3.3 核心设计权衡

官方分片策略遵循:优先降低集群更新开销,不追求分片利用率最大化

设计原因:

  1. 集群所有节点的 kube-proxy 都会监听全部 EndpointSlice 变更
  2. 每次分片更新都会触发全集群节点规则重同步
  3. 频繁合并、填满分片会产生海量全局更新,导致控制面、节点 CPU 暴涨
  4. 牺牲分片饱满度,换取极低的集群广播更新压力

3.3.4 分片规整时机

Deployment 滚动更新、扩缩容重建 场景下:

  • Pod 批量销毁、新 Pod 批量重建;
  • 控制器自动整体重新规整分片
  • 自动填补历史碎片空位,最终实现分片高利用率。

3.4 端点去重规则

由于分片变更同步存在时间差,同一个端点可能同时存在于多个 EndpointSlice

客户端强制规范:

读取 Service 后端列表时,必须遍历该 Service 全部 EndpointSlice,汇总并去重所有端点。kube-proxy 内部 EndpointSliceCache 提供标准聚合去重实现。

相关推荐
寒冰碧海3 小时前
大模型部署从0到1(三):单机多卡 vLLM 部署Qwen3.6实战|Docker Compose 一键启动
docker·容器·vllm
潘正翔14 小时前
docker核心概念
linux·运维·服务器·docker·容器·centos·运维开发
阿里云云原生20 小时前
从 ReAct 到 Harness:AgentScope 2.0 如何用“工程化”定义分布式智能体开发范式?
云原生·agent
刘马想放假1 天前
Docker 从入门到进阶:一篇写给工程师的系统化实战指南
运维·docker·容器
zjun30211 天前
如何搭建TRAE IDE 连接到容器开发环境
docker·容器·ascend·trae
寒冰碧海1 天前
大模型部署从0到1(一):通用环境全流程准备|NVIDIA驱动+Docker+NVIDIA Container Toolkit
运维·docker·容器
hj2862511 天前
K8S 核心组件与资源概念 + 带注释命令 + 实操案例版笔记
笔记·容器·kubernetes