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

  • 时间:
  • 浏览:2
  • 来源:万人炸金花_万人炸金花官网

//或者此处endpoint这么 对应的service,猜想会把endpoint的name当成key传入queue,就是在完后 的逻辑中判断获取service name错误,于是删除endpoint

}

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

endpointController的主要逻辑在syncService函数

// 等待图片pod、service、endpoint列表同步

}

// 完后 service完后 被删除,则也要删除对用的endpoint资源

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

}

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{}) {

}

1.5 Endpoint检测

完后 说的是当Endpoint和Service绑定的完后 Service和Pod改变时的一系列操作,现在大伙回到什么的问题,完后 Endpoint单独指在,K8S是怎样检测就是删除的?

大伙重新看看Run函数中的

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

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

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

}

func (e *EndpointController) processNextWorkItem() bool {

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

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

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

}

// 执行worker函数,for死循环处置queue中的key

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

基于k8s release-1.13

1.2 源码目录底部形态

完后 大伙重点看Endpoint次责,就是大伙只看Endpoint相关的源码

Endpoint

1.3 Endpoint的初始化

文件位置: endpoints_controller.go

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

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

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

K8S在运行Run函数的完后 启动了有另1个协程去检测当前所有的Endpoint

func (e *EndpointController) worker() {

}

// NewEndpointController returns a new *EndpointController.

//大伙还需用看过在Endpoint初始化的完后 ,完后 注册了有另1个informer,分别是podInformer,serviceInformer,endpointsInformer

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

创建Service的完后 使用Selector,那我还需用自动创建Endpoint

在创建Endpoint还需用创建Service,那我才还需用持久化Endpoint

go func() {

}

大伙看看pod注册的Handler引用了哪几个函数

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

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

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

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

1.3.1 e.addPod

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

//实例化有另1个pod对象

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

场景重现

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

}

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

//轮询所有endpoint

}

1.3.2 e.updatePod

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