透过真实场景分析K8S的EndpointController的源码

  • 时间:
  • 浏览:1
  • 来源:uu快3网站_uu快3充值_玩法

//查找逻辑为逐个对比service的selector与该pod的label,肯能service的selector为该pod label的子集,则表示该pod属于service

func (e EndpointController) getPodServiceMemberships(pod v1.Pod) (sets.String, error) {

// 根据key获取service的namespace和name

}

1.3.2 e.updatePod

func (e *EndpointController) updatePod(old, cur interface{}) {

}

//add:以再加的service的namespace/name形式为key,并将该key加入 queue

//倘若此处endpoint这么对应的service,猜想会把endpoint的name当成key传入queue,可是 在前一天的逻辑中判断获取service name错误,于是删除endpoint

}

1.4 Endpoint-Controller具体逻辑

// Run will not return until stopCh is closed. workers determines how many

// endpoints will be handled in parallel.

func (e *EndpointController) Run(workers int, stopCh <-chan struct{}) {

// checkLeftoverEndpoints lists all currently existing endpoints and adds their

// service to the queue. This will detect endpoints that exist with no

// corresponding service; these endpoints need to be deleted. We only need to

// do this once on startup, because in steady-state these are detected (but

// some stragglers could have been left behind if the endpoint controller

// reboots).

func (e *EndpointController) checkLeftoverEndpoints() {

//拉取当前所有的endpoint对象

}

// 执行worker函数,for死循环外理queue中的key

}

K8S在运行Run函数的前一天启动了另一有俩个多 协程去检测当前所有的Endpoint

}

1.5 Endpoint检测

前一天说的是当Endpoint和Service绑定的前一天Service和Pod改变时的一系列操作,现在大伙儿回到什么的大问题,肯能Endpoint单独指在,K8S是如可检测可是 删除的?

大伙儿重新看看Run函数中的

go func() {

//判断pod相关信息与否指在改变

func (e *EndpointController) worker() {

// NewEndpointController returns a new *EndpointController.

//大伙儿还都还可以想看 在Endpoint初始化的前一天,肯能注册了另一有俩个多 informer,分别是podInformer,serviceInformer,endpointsInformer

func NewEndpointController(podInformer coreinformers.PodInformer, serviceInformer coreinformers.ServiceInformer,

}

//判断两者的label与否肯能不一致,肯能hostname或subdomain已改变

func podChanged(oldPod, newPod *v1.Pod) bool {

//podChanged函数,其检测逻辑为,肯能新旧另一有俩个多 pod的DeletionTimestamp字段不等则返回true,可是 继续判断两者的就绪情况汇报,肯能不等则返回true,最后再判断新旧pod的ip、nodename、namespace、UID与否相等,肯能相等则返回false,可是 返回true。将返回结果赋值给podChangedFlag

//判断错误,则获取对应的service和pod映射关系

// 肯能service肯能被删除,则也要删除对用的endpoint资源

// 获取该pod的信息,输出EndpointAddress行态体变量

//获取pod与service的映射关系

1.3.1 e.addPod

func (e *EndpointController) addPod(obj interface{}) {

//实例化另一有俩个多 pod对象

//将service集合以namespace/name为key逐个加入到queue中

// 1、肯能tolerateUnreadyEndpoints为true,允许未就绪的pod也列入Addresses列表,肯能tolerateUnreadyEndpoints为false但pod情况汇报为ready则将pod列入Addresses列表;

}

场景重现

最近遇到另一有俩个多 什么的大问题,在K8S的几台机器上中创建了Glusterfs的集群,通过官方的教程一步步的来利用Glusterfs创建Volume以及PV,不过可是 创建了每个Volume的Endpoint,并这么相对应的创建Service实例(官方说创建Service会使Endpoint持久化,当时并这么理会),可是 在一次集群重启的前一天发现Endpoint实例并这么启动起来,很疑惑,像某些的K8S对象,类式POD,Deployment,Service都启动起来了,可是 Endpoint并这么,带着某些什么的大问题想看 下官方的Issue,并这么什么有效的解答,大伙儿还都还可以参考一下Issue: Endpoints are not persistented

//轮询所有endpoint

//update:以更新后的service的namespace/name形式为key,并将该key加入 queue

//delete:以删除的service的namespace/name形式为key,并将该key加入 queue

//比较两者的ResourceVersion,对比更新后的pod与原pod,肯能两者的资源版本相等,则直接返回,不进行入队操作

// 等待歌曲pod、service、endpoint列表同步

基于k8s release-1.13

1.2 源码目录行态

肯能大伙儿重点看Endpoint帕累托图,可是 大伙儿只看Endpoint相关的源码

Endpoint

1.3 Endpoint的初始化

文件位置: endpoints_controller.go

func (e *EndpointController) processNextWorkItem() bool {

创建Service的前一天使用Selector,原先还都还可以自动创建Endpoint

在创建Endpoint还需要创建Service,原先并还都还可以持久化Endpoint

endpointController的主要逻辑在syncService函数

func (e *EndpointController) syncService(key string) error {

}

大伙儿看看pod注册的Handler引用了什么函数

}

猜你喜欢

知新温故,从知识图谱到图数据库

在Neo4j的集群部署中,一般使用zookeeper来负责neo4jserver的心跳检测。ACID操作是保证数据一致性的基础。Neo4j确保了在3个 事务后边的多个操作并肩

2020-02-23

游客zn7wog45ozbes的主页

文章:54丨粉丝:4034丨话题:1函数计算研发经理。2010年加入阿里云,参与了阿里云飞天分布...文章:11丨粉丝:2594丨话题:0文章:10丨粉丝:2518丨话题:0阿

2020-02-23

RedisManager使用手册(四)

下拉加载更多至此,大功告成。Github地址:https://github.com/ngbdf/redis-managerRedisManager使用手册(七)--集群伸缩参数

2020-02-23

游客m5s4i7yt25eze的主页

文章:1丨粉丝:63764丨话题:0文章:12丨粉丝:63887丨话题:1阿里云ET专家,重点在智能语音、人脸识别、图像识别、OCR等...文章:0丨粉丝:63278丨话题:0

2020-02-23

关于意大利留学的问题,请高手解答

展开删剪为你推荐:都都要去上海上师出国咨询一下意大利留学,亲戚亲戚朋友的意大利留学在上海做得很不错的!本回答由前网友视频推荐你对这俩回答的评价是?下载百度知道APP,抢鲜体验展

2020-02-22