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

  • 时间:
  • 浏览:0
  • 来源:大发欢乐生肖APP下载_大发欢乐生肖APP官网

go func() {

//判断两者的label是否但是 不一致,但是 hostname或subdomain已改变

基于k8s release-1.13

1.2 源码目录形状

但是 大伙重点看Endpoint每种,但是 大伙只看Endpoint相关的源码

Endpoint

1.3 Endpoint的初始化

文件位置: endpoints_controller.go

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

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

func (e *EndpointController) worker() {

}

// 执行worker函数,for死循环防止queue中的key

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

func (e *EndpointController) processNextWorkItem() bool {

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

}

大伙看看pod注册的Handler引用了有哪些函数

//我希望此处endpoint什么什么都没法 对应的service,猜想会把endpoint的name当成key传入queue,但是 在但是 的逻辑中判断获取service name错误,于是删除endpoint

}

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

//轮询所有endpoint

}

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

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

// 但是 service但是 被删除,则也要删除对用的endpoint资源

}

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

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

}

1.3.2 e.updatePod

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

1.3.1 e.addPod

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

//实例化一个pod对象

//判断pod相关信息是否所处改变

}

1.5 Endpoint检测

但是 说的是当Endpoint和Service绑定的但是 Service和Pod改变时的一系列操作,现在大伙回到问题图片,但是 Endpoint单独所处,K8S是怎么检测但是 删除的?

大伙重新看看Run函数中的

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

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

// 等待的图片 pod、service、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{}) {

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

K8S在运行Run函数的但是 启动了一个协程去检测当前所有的Endpoint

}

创建Service的但是 使用Selector,原先可需要自动创建Endpoint

在创建Endpoint还需要创建Service,原先才可需要持久化Endpoint

// NewEndpointController returns a new *EndpointController.

//大伙可需要看一遍在Endpoint初始化的但是 ,但是 注册了一个informer,分别是podInformer,serviceInformer,endpointsInformer

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

场景重现

最近遇到一个问题图片,在K8S的几台机器上中创建了Glusterfs的集群,通过官方的教程一步步的来利用Glusterfs创建Volume以及PV,不过本来创建了每个Volume的Endpoint,并什么什么都没法 相对应的创建Service实例(官方说创建Service会使Endpoint持久化,当时并什么什么都没法 理会),但是 在一次集群重启的但是 发现Endpoint实例并什么什么都没法 启动起来,很疑惑,像一点的K8S对象,累似 于POD,Deployment,Service都启动起来了,但是 Endpoint并什么什么都没法 ,带着累似 于于 问题图片看一遍下官方的Issue,并什么什么都没法 有哪些有效的解答,大伙可需要参考一下Issue: Endpoints are not persistented

// 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对象

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

}

// 获取该pod的信息,输出EndpointAddress形状体变量

endpointController的主要逻辑在syncService函数

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