K8s发现和负载均衡-Endpoints和EndpointSlice
K8s发现和负载均衡-Endpoints和EndpointSlice
基于1.25
什么是EndPoints
EndPoints定义了网络端点的列表
- K8s限制单个EndPoints对象容纳的端点数量
Endpoints字段
// Endpoints is a collection of endpoints that implement the actual service. Example: |
Endpoints初始化
Endpoint控制器监听Service和Pod的变化:
- 根据Service指定的LabelSekector筛选符合条件的Pod,在根据条件判断是否Ready
- 如果设置`service.Spec.PublishNotReadyAddressre:true,不管Pod是否就绪都加入Address
- 不然就判断就绪状态
- Ref:https://github.com/kubernetes/kubernetes/blob/6cb5ea56cb96f6a4ddec677d3d94faf07179368d/pkg/controller/endpoint/endpoints_controller.go#L611
// addEndpointSubset add the endpoints addresses and ports to the EndpointSubset. |
追加注释和标签
在生成过程中,会自动追加标签、注释
追加的注释
注解key | 注解value | 说明 |
---|---|---|
endpoints.kubernetes.io/over-capacity | truncated | 当Endpoints超过1000个端点,就会截断 |
endpoints.kubernetes.io/last-change-trigger-time | 时间戳 | 表示某些Pod或者Service最后一次触发Endpoints对象的时间戳 |
追加的标签
标签key | 标签value | 说明 |
---|---|---|
service.kubernetes.io/headless | “” | Headless Service对应的Endpoints |
什么是EndpointSlice
原来EndpointAPI上提供了在K8s网络端点中的一种简单而且直接的方法,但是随着K8s服务端点变动,要处理大量网络端点带来挑战。
EndpointSlice包含了一组网络端点的引用
- 默认情况下,管理端点不超过100个
- 通过修改
kube-controller-manager
的--max-endpoints-per-slice
可以修改数量
EndpointSlice字段说明
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object |
拓扑感知提示
拓扑感知提示提供了一种将流量限制到它发起区域之内的机制,也称拓扑感知路由
在计算Service的端点的时候,EndpointSlice控制器会评估每个端点的拓扑,填充提示字段。kube-proxy就可以使用这些提示信息来影响流量的路由(倾向于拓扑上相邻的端点)
用户可以通过把Service的
service.kubernetes.io/topology-aware-hinits
设置为auto来开启拓扑感知提示(并不保证一定设置,只有在安全的时候)
// podToEndpoint returns an Endpoint object generated from a Pod, a Node, and a Service for a particular addressType. |
复制功能
控制平面会把Endpoints资源复制为EndpointSlice资源
- 从K8s1.19默认开启
但是在以下情况不会复制:
- Endpoints资源设置了Label:endpointslice.kubernetes.io/skip-mirror=true
- Endpoints资源设置了Annation:control-plane.alpha.kubernetes.io/leader
- Endpoint资源对应的Service不存在
- Endpoint资源对应的Service资源设置了非空的Selector
- 一个Endpints资源存在IPv4和IPv6冲突的时候,会被复制为多个EndpointSlice资源,每周地址最多复制1000个
数据分布管理机制
控制平面管理EndpointSlice中数据尽可能填满,但是不会在多个EndpointSlice数据不均衡的情况下主动执行(Rebalance)操作,步骤如下:
- 遍历所有EndpointSlice资源,删除其中不需要的Endpoints,更新匹配的Endpoints
- 遍历上一遍更新的Endpoints,填充需要新增的Endpoints
- 如果还有新的待添加的Endpoints,尝试其添加到未更新的EndpointSlice资源汇总,或者创建新的EndpointSlice资源并且添加(优先考虑)
追加添加的注释和标签
追加的注释
注解key | 注解value | 说明 |
---|---|---|
Endpoints.kubernetes.io/last-change-trigger-time | 时间戳 | 表示某些Pod或Service 的最后一次更新EndpointSlice的时间 |
追加的标签
标签key | 标签value | 说明 |
---|---|---|
kubernetes.io/service-name | Service Name | 指定属于的Service |
Endpointslice.kubernetes.io/managed-by | Endpointslice-controller.k8s.io | 固定标签,表明该对象呗EndpointSlice控制器管理 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Joohwan!
评论