OpenYurt 是业界首个非侵入的边缘计算云原生开源项目 , 通过边缘自治 , 云边协同 , 边缘单元化 , 边缘流量闭环等能力为用户提供云边一体化的使用体验 。 在 Openyurt 里边缘网络可以使用数据过滤框架在不同节点池里实现边缘流量闭环能力 。
Yurthub 数据过滤框架解析 Yurthub 本质上是一层 kube-apiserver 的代理 , 在代理的基础上加了一层 cache , 一来保证边缘节点离线的情况下可以使用本地 cache 保证业务稳定性有效的解决了边缘自治的问题 。 二来可以降低大量的 listwatch 操作对云上 api 产生一定的负载 。
Yurthub 的数据过滤通过节点上的 pod 以及 kubelet 的请求通过 Load Balancer 发送给 kube-apiserver , 代理接收到响应消息进行数据过滤处理 , 之后再将过滤后的数据返回给请求方 。 如果节点是边缘节点会根据请求类型对响应请求体中的资源进行本地缓存 , 如果是云端节点考虑到网络状态良好不进行本地缓存 。
Yurthub 的过滤框架实现原理图:
Yurthub 目前包含四种过滤规则 , 通过 addons 请求的 user-agent , resource , verb 判断经过那个过滤器进行相应的数据过滤 。
四种过滤规则功能及实现 ServiceTopologyFilter
主要针对 EndpointSlice 资源进行数据过滤 但 Endpoint Slice 特性需要在 Kubernetes v1.18 或以上版本才能支持 , 如果在 1.18 版本以下建议使用 endpointsFilter 过滤器 。 当经过该过滤器首先通过 kubernetes.io/service-name 找到 endpointSlice 资源所对应的 services 资源 , 之后判断 servces 资源是否存在 openyurt.io/topologyKeys 这个 Annotations , 如果存在那么通过这个 Annotations 的值判断数据过滤规则 , 最后更新 response data 返回给 addons 。
Annotations 的值分为两大类:
1、kubernetes.io/hostname:只过滤出相同节点的 endpoint ip
2、openyurt.io/nodepool 或者 kubernetes.io/zone: 通过这个 Annotations 获取对应节点池 , 最后遍历 endpointSlice 资源 , 通过 endpointSlice 里的 topology 字段中的 kubernetes.io/hostname 字段在 endpointSlice 对象里找到对应的 Endpoints , 之后重组 endpointSlice 里的 Endpoints 后返回给 addons 。
代码实现:
func (fh *serviceTopologyFilterHandler) reassembleEndpointSlice(endpointSlice *discovery.EndpointSlice) *discovery.EndpointSlice { var serviceTopologyType string // get the service Topology type if svcName ok := endpointSlice.Labels[discovery.LabelServiceName
; ok { svc err := fh.serviceLister.Services(endpointSlice.Namespace).Get(svcName) if err != nil { klog.Infof(\"skip reassemble endpointSlice failed to get service %s/%s err: %v\" endpointSlice.Namespace svcName err) return endpointSliceif serviceTopologyType ok = svc.Annotations[AnnotationServiceTopologyKey
; !ok { klog.Infof(\"skip reassemble endpointSlice service %s/%s has no annotation %s\" endpointSlice.Namespace svcName AnnotationServiceTopologyKey) return endpointSlicevar newEps [
discovery.Endpoint // if type of service Topology is 'kubernetes.io/hostname' // filter the endpoint just on the local host if serviceTopologyType == AnnotationServiceTopologyValueNode { for i := range endpointSlice.Endpoints { if endpointSlice.Endpoints[i
.Topology[v1.LabelHostname
== fh.nodeName { newEps = append(newEps endpointSlice.Endpoints[i
)endpointSlice.Endpoints = newEpselse if serviceTopologyType == AnnotationServiceTopologyValueNodePool || serviceTopologyType == AnnotationServiceTopologyValueZone { // if type of service Topology is openyurt.io/nodepool // filter the endpoint just on the node which is in the same nodepool with current node currentNode err := fh.nodeGetter(fh.nodeName) if err != nil { klog.Infof(\"skip reassemble endpointSlice failed to get current node %s err: %v\" fh.nodeName err) return endpointSliceif nodePoolName ok := currentNode.Labels[nodepoolv1alpha1.LabelCurrentNodePool
相关经验推荐
- 苹果|关于3nm量产,台积电新消息传来,压力给到了三星
- 苹果|iPhone屏下专利获批,苹果16有望搭载,果粉等了五年的功能终于来了
- 手机厂商|突然之间,年轻人开始不换手机了,手机厂商的未来又将走向何方?
- |vivoX fold和vivoXnote之间该如何选?
- iPhone|换手机一步到位,这三款手机配置足够强,绝对是不二之选
- 志高空调|realme这个后起之秀,怎么就暗戳戳地卖了千万销量?
- 苹果|马克·古尔曼:苹果将在WWDC22上推出两款Mac电脑
- 苹果|三星巨屏新机首曝!配备7.12英寸真全面屏,还有6700mAh大电池
- 苹果|最大100米传输,支持360°收音,有曼无线麦克风你会选吗?
- 苹果|手机好评榜出炉,小米榜上无名,第一名也并非华为