Kuryr kubernetes 分为3类独立可执行程序,分别为Kuryr Controller,Kuryr CNI,Kuryr CNI daemon(可选,抽离CNI的watach 功能以减少多pod同时启动时候的资源浪费俄)。
Kuryr Controller 独立运行,功能是 watch k8s API 和从neutron 申请资源port等,通过k8s API修改 pod 的annotate 里网络信息。
Kuryr CNI 在每个work node 备用。当pod启动或删除调用该插件,该插件具体执行veth创建和该veth 和neutron 创建的port 连接管理。如果没有Kuryr CNI daemon,还要负责创建时watch k8s API 直到Kuryr Controller 将网络信息写入 pod 的annotate 。
Kuryr CNI daemon 在每个work node 运行。当他运行时,主要抽离出Kuryr CNI 的watch 功能和执行功能。具体执行veth创建和该veth 和neutron 创建的port 连接管理也归它管理,Kuryr CNI 只保留CNI 入口功能,如同
Kuryr CNI daemon的客户端。
Kuryr CNI 和 Kuryr CNI daemon用同一个应用程序,参数不同运行方式就不同。
Kuryr Controller 入口
kuryr_kubernetes/controller/service.py
class KuryrK8sService(service.Service):
"""Kuryr-Kubernetes controller Service."""
def __init__(self):
super(KuryrK8sService, self).__init__()
objects.register_locally_defined_vifs()
pipeline = h_pipeline.ControllerPipeline(self.tg)//创建pipeline
self.watcher = watcher.Watcher(pipeline, self.tg)
# TODO(ivc): pluggable resource/handler registration
for resource in ["pods", "services", "endpoints"]: //watch k8s API 这三种资源
self.watcher.add("%s/%s" % (constants.K8S_API_BASE, resource))
pipeline.register(h_vif.VIFHandler()) //注册处理函数,watch到的变动将由这些注册过的处理函数处理
pipeline.register(h_lbaas.LBaaSSpecHandler())
pipeline.register(h_lbaas.LoadBalancerHandler())
def start(self):
LOG.info("Service '%s' starting", self.__class__.__name__)
health.ReadinessChecker()
super(KuryrK8sService, self).start()
self.watcher.start()
LOG.info("Service '%s' started", self.__class__.__name__)
关于 watch
kuryr_kubernetes/watcher.py
def start(self):
self._running = True
for path in self._resources - set(self._watching):
self._start_watch(path)
def _start_watch(self, path):
tg = self._thread_group
self._idle[path] = True
if tg:
self._watching[path] = tg.add_thread(self._watch, path)//thread_group添加观察线程
else:
self._watching[path] = None
self._watch(path)