导读
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地址管理
敬请期待!