Kube-OVN源码解析(一) | kube-ovn-controller

2022-08-11 11:14:50 浏览数 (3)

导读

Kube-OVN是一款基于OVS/OVN的K8s网络项目,它通过将 OpenStack 领域成熟的网络功能平移到 K8s,极大增强了 K8s 容器网络的安全性、可运维性、管理性和性能,为 K8s 生态的落地带来了独特的价值。

本系列文章,我们将分享kube-ovn-controller、Pod IP地址管理、Pod 网卡管理-CNI插件、Pod 安全组功能、vagrant统一编译和测试环境,深度分析Kube-OVN,帮助您快速上手。

作者:Kube-OVN社区贡献者 Mr.Li

作者说

kube-ovn-controller是kube-ovn项目主要资源的CRD控制器,主要功能包含vlan、provider、vpc、subnet等CRD资源的处理,也包括pod的IP分配、ovn port创建删除等操作。注:当前版本:v1.8.0

容器编排

kube-ovn-controller是以deployment的形式部署到k8s集群中的,其编排在install.sh脚本中根据不同配置生成,然后apply到集群中。详见下图install.sh

kube-ovn-controller的镜像也是kubeovn/kube-ovn:v1.8.0,是通过软连接kube-ovn二进制文件为kube-ovn-controller,然后使用kube-ovn-controller命令启动来区分走controller流程的,详见下图

Controller主流程

main函数

Controller初始化

Controller运行

Controller的worker

我们这里先介绍controller的关键工作worker,这样后续介绍如VPC资源的处理时,大家才能更容易找到入口。controller作为资源控制器,会创建很多的worker(go routine)来处理对应资源如VPC资源的创建、更新、删除事件。每个worker其实都有自己的工作队列,当资源出现新的事件时,就将事件放入队列中,后续worker从队列中取出处理。

比如VPC资源的事件入队注册:

以add事件为例:

worker创建:

VPC资源的runAddVpcWorker:

其他资源如subnet、pod等基本模式都和上述VPC基本一致。

Controller的关键初始化

默认VPC:

创建:

代码语言:javascript复制
InitDefaultVpc()

kube-ovn在部署完成之后会默认为用户创建默认VPC(custom vpc是后续版本引入的功能,早期版本应该是只有这个默认VPC)。用户创建的其它资源如subnet、pod默认都是处于该默认VPC下的,除非进行了特殊指定。

VPC在kube-ovn项目中其实和VPC在Openstack项目中的含义接近,都是为了描述一组用户隔离的网络资源。比如VPC之间是相互隔离的,VPC下的子网也是相互隔离的,不同用户VPC可以使用相同的子网网段等。VPC资源至少包含一个对应ovn项目的逻辑路由器,即我们用ovn-nbctl lr-add创建出来的lr资源。

这里的InitDefaultVpc()就是为了保证K8s集群中有一个默认名为ovn-cluster的VPC:

VPC资源处理:

从上文我们知道controller会有worker专门来处理vpc资源的add/update事件(当然也有worker处理vpc的delete事件,这里暂不介绍了),接下来我们就来看看这个worker实际上做了哪些内容。

从上述代码可知,默认VPC的关键操作就是创建ovn的逻辑路由器,custom VPC则还多了一个静态路由的处理。我们看下逻辑路由器的创建:

Kube-OVN源码解析系列由社区成员倾情奉献

手把手教你征服Kube-OVN

下期:我们讲Pod IP地址管理

敬请期待!

0 人点赞