1、使用CNI网络插件的工作流程
- Kubernetes 调用CRI创建pause容器,生成对应的network namespace
- 调用网络driver(因为配置的是CNI,所以会调用CNI相关代码)
- CNI driver 根据配置调用具体的CNI插件
- CNI插件给pause容器配置正确的网络,pod中的其他容器都是用pause容器的网络栈。
2、CNI是如何工作的?
- 基于自带的docker-run.sh 和 exec-plugins.sh两个脚本来看。
- 简单说就是检查CNI配置文件目录($NETCONFPATH),读取配置(*.conf)文件,然后把配置输入给配置的type字段的插件。
- 最大的价值在于提供了一致的容器网络操作界面,不论什么网络插件都使用一致的API。
3、flannel
3.1、作用
- 协助k8s,给每一个node上的docker容器都分配互相不冲突的ip地址;
- 在这些ip地址之间建立一个覆盖网络,通过这个覆盖网络(overlay)将数据包原封不动的传递到目标容器。
- 可以为容器提供跨节点网络服务,其模型为集群内所有容器使用一个网络,然后在每个主机上从该网络中划分一个子网。
3.2、解决的问题
- 解决容器ip地址重复问题
- 解决容器IP地址路由问题
3.3、flannel的几种网络模式
- overlay网络:所有被发送到网络中的数据包会被添加上额外的包头封装,这些包头里通常包含了主机本身的ip地址,因为只有主机ip地址是原本就可以在网络里路由传播的。根据不同的封包方式,flannel提供了udp和vxlan两种传输方法,udp使用了flannel的包头协议,数据是在linux的用户态进行封包和解包,当数据进入主机后,需要经历两次内核态到用户态的转换。vxlan封包是采用内置再linux内核里的标准协议,所有的数据装、解包过程均在内核中完成,overlay是第一种解决容器网络地址路由的方法。
- Host-Gateway模式:flannel通过再各个节点上运行的agent将容器网络的路由信息刷到主机的路由表上,这样所有的主机就都有整个容器网络的路由数据了。并没有引入封包解包的机制,安全是普通的网络路由机制。然而,只能修改各个主机的路由表,一旦主机之间隔了其他路由设备,比如三层路由器,这个包就会在路由设备上被丢掉。这种模式只能用于二层直接可达的网络,由于广播风暴,通常规模都比较小。
3.4、架构
分为管理面和数据面;管理面主要包含一个etcd,用于协调各个节点上容器分配的网段;数据面主要再每个节点上运行一个flanneld进程。采用no-server ,不存在所谓的控制节点。
![](https://i-blog.csdnimg.cn/blog_migrate/d76dfb9aa2aae63710befb398e6d5c8d.png)
3.5、flannel在封包的时候怎么知道目的容器所在主机的IP地址?
flannel会观察etcd的数据,在其他节点向etcd更新网段和主机ip信息时,etcd就感知到了,再向其他主机上的容器转发网络包时,用对方容器所在主机的ip进行封包,然后将数据发往对应主机上的flanneld,再交由其转发给目的容器。
3.6、flanneld启动时要做以下几个动作
- 从etcd中获取network的配置信息
- 划分subnet,并在etcd中进行注册
- 将子网信息记录到flannel维护的/run/flannel/subnet.env 文件中
- 将subnet.env转写成一个docker的环境变量文件/run/flannel/docker
3.7、backend
flannel通过在每一个节点上启动一个叫flanneld进程,负责每一个节点上的子网划分,并将相关的配置信息保存到etcd中,而具体的网络包转发交给具体的backend实现。
• UDP:
○ flann