Kubernetes EndpointSlice
是在Kubernetes 1.16
版本中引入的一种资源,它提供了一种更有效的方式来表示Kubernetes
服务的网络端点。
EndpointSlice
为现有的Endpoints
资源提供了一种替代方案,对于具有大量网络端点的非常大型服务,Endpoints
资源可能会成为性能瓶颈。 EndpointSlice
将服务的网络端点分成更小、更易管理的块,每个块由单独的EndpointSlice
资源表示。
每个EndpointSlice
包含有关服务的一部分端点的信息,包括它们的IP地址、端口和附加的元数据,例如拓扑信息。这使得Kubernetes
更容易有效地管理和更新服务的网络端点。
EndpointSlice
还支持其他功能,例如支持多协议服务和支持加权负载平衡,这些功能在原始的Endpoints
资源中不可用。
与 Endpoints
的比较
原来的 Endpoints API
提供了在 Kubernetes
中跟踪网络端点的一种简单而直接的方法。随着 Kubernetes
集群和服务逐渐开始为更多的后端 Pod
处理和发送请求, 原来的 API
的局限性变得越来越明显。最明显的是那些因为要处理大量网络端点而带来的挑战。
由于任一 Service
的所有网络端点都保存在同一个 Endpoints
对象中,这些 Endpoints
对象可能变得非常巨大。对于保持稳定的服务(长时间使用同一组端点),影响不太明显; 即便如此,Kubernetes
的一些使用场景也没有得到很好的服务。
当某 Service
存在很多后端端点并且该工作负载频繁扩缩或上线新更改时,对该 Service
的单个 Endpoints
对象的每次更新都意味着(在控制平面内以及在节点和 API 服务器之间)Kubernetes
集群组件之间会出现大量流量。 这种额外的流量在 CPU
使用方面也有开销。
使用 EndpointSlices
时,添加或移除单个 Pod
对于正监视变更的客户端会触发相同数量的更新, 但这些更新消息的大小在大规模场景下要小得多。
EndpointSlices
还支持围绕双栈网络和拓扑感知路由等新功能的创新。
可以使用下面的yaml
文件创建Service
观察对应的EndpointSlice
.
1 | cat > ep.yaml <<EOF |
1 | ➜ kubernetes git:(master) k get svc --show-labels |
1 | // staging/src/k8s.io/api/discovery/v1/types.go |
syncService
是循环处理函数,从workqueue
中取key
然后进行处理
1 | // pkg/controller/endpointslice/endpointslice_controller.go |
为了管理服务的EndpointSlices
分发,Kubernetes
维护了一个名为TopologyCache
的EndpointSlices
缓存。TopologyCache
跟踪服务所有EndpointSlices
的状态,并允许Kubernetes
快速、高效地将流量路由到适当的端点。
TopologyCache
是由服务控制器提供的端点拓扑信息构建的。控制器根据标签和选择器确定服务端点的拓扑,并生成一组基于拓扑信息的EndpointSlices
,并使用新的EndpointSlices
更新TopologyCache
。
REF:
1.https://kubernetes.io/zh-cn/docs/concepts/services-networking/endpoint-slices/