一个Blog (jerichoking.wtf) 自建网站欢迎来戳
一、项目地址
GitHub - containernetworking/plugins: Some reference and example networking plugins, maintained by the CNI team.
二、项目介绍
bridge、IPAM 插件都在K8s的网络插件里面
![](https://img-blog.csdnimg.cn/d0a433365ae84b1aa2d6b3663d0f7cb9.jpeg)
三、bridge
1.原理:
bridge插件首先创建一个虚拟网桥,其功能类似物理交换机,将所有容器接入一个二层网络;容器接入是通过创建的veth pair(虚拟网卡对)实现,将网卡对的一端放在容器中并分配IP地址,另一端放在host的namespace内连上虚拟网桥,网桥上可以配置IP作为容器的网关,通过网桥连接了两个不同namespace内的网卡,容器内发出的数据包可通过网桥转发到host网络协议栈或进入另一个容器,最终实现容器之间、容器和主机间、容器和服务间的通信。
2.工作流程
创建容器时的动作
1)按名称检查网桥是否存在,若不存在则创建一个虚拟网桥
2)创建虚拟网卡对,将host端的veth口连接到网桥上
3)IPAM从地址池中分配IP给容器使用,并计算出对应网关配置到网桥
4)进入容器网络名称空间,修改容器端的网卡ip并配置路由
5)使用iptables增加容器内部网段到外部网段的masquerade规则
6)获取当前网桥信息,返回给调用者
删除容器时的动作
1)按输入参数找到要删除容器的IP地址,调用ipam插件删除地址并将IP归还地址池
2) 进入容器网络隔离ns,根据容器IP找到对应的网络接口并删除
3) 在节点主机上删除创建网络时添加的所有iptables规则
数据结构
解析bridge配置需转化的json结构
![](https://img-blog.csdnimg.cn/44a443c33cc143189dfb51c4db236ca3.png)
接口
网桥提供了三个接口add、del、check
add:解析配置文件,创建网桥,虚拟网卡对、获取当前namespace,用虚拟网卡对将网桥和namespace连接,调用ipam插件给namespace侧的虚拟网卡对分配ip,配置路由,配置snat,返回bridge信息
del: 通过ipam插件删除容器申请的IP地址,并归还到地址池,进入容器ns删除对应的网络接口veth和IP地址,snat
check: 调用ipam插件ExecCheck进行检查, 检测bridge端口类型和mac地址,检测容器接口类型和mac地址,检查bridge和容器的veth是否配对,检查ip是否配置正确,检查route是否配置正确
四、IP Address Management (IPAM)
DHCP模式
一个DHCP的服务流程需要两个组件DHCP Client 和DHCP Server,而DHCP IPAM扮演的角色就是DHCP Client,DHCP Client运作的模式
1.发送DHCP 请求
2.等待DHCP 响应
3.设定IP到目标网络介质上
4.定期Renew
DHCP模式下有两种运行的形式,一种是CNI模式(提供函数接口),一种是启动一个不停运行的daemon模式(使用rpc提供接口)。
daemon 模式的功用很简单,接受所有来自 CNI 模式的请求,然后切换到目标的 namespace 里面去根据目标的网络介质发送一个 DHCP 请求封包,所以运行 DHCP IPAM 之前,要先在系统上跑一个 daemon,然后会通过 unix socket 的方式等待 DHCP IPAM CNI 发送命令过来,该命令需要包含 目标的namespace和目标的网卡名称。
执行流程图
![](https://img-blog.csdnimg.cn/ad4f1c1024d34f95a6d2e5c0063ac9a4.png)
- 首先当 DHCP CNI被调用后,会先通过 unix socket 的方式通知 daemon
- daemon 接着到该 ns 之中,确认这个ns存在就发送对应的DHCP 請求
- magic 的意思代表沒有限定数据包要怎么处理,总之 DHCP 封包要有办法出去
- 最后外面的(甚至同一台机器)上面的 DHCP Server 可以看到 Request 并且回复Reply
- 最后当DHCP Daemon 发送 DHCP 请求的那个 thread 接收到 DHCP 回复后,就会给目标网卡设置 IP 地址。
Static模式
static IPAM 是一个非常简单的 IPAM 插件,可以将 IPv4 和 IPv6 地址静态分配给容器。 这将有助于调试目的以及在不同 vlan/vxlan 中为容器分配相同 IP 地址的情况。
需要手动设置
- IP 地址,包含了 ipv4/ipv6
- Route 路由表
- DNS 设置
Host-Local模式
大部分CNI 会使用这个IPAM去处理IP分配的问题
1.config格式
{
"ipam": {
"type": "host-local",
"ranges": [
[
{
"subnet": "10.10.0.0/16",
"rangeStart": "10.10.1.20",
"rangeEnd": "10.10.3.50",
"gateway": "10.10.0.254"
},
{
"subnet": "172.16.5.0/24"
}
]
]
}
}
返回的ip格式
"cniVersion": "0.2.0",
"ip4": {
"ip": "10.10.1.20/16",
"gateway": "10.10.0.254"
},
"dns": {}
}
2.IP分配原理
host-local IPAM 插件从一组地址范围中分配 IP 地址。 它将状态本地存储在主机文件系统上,从而确保单个主机上 IP 地址的唯一性。 分配器可以分配多个范围,并支持多个(不相交的)子网集。 分配策略在每个范围集中进行round-robin
3.状态存储路径
默认路径 /var/lib/cni/networks/
$ sudo find /var/lib/cni/networks/ -type f
/var/lib/cni/networks/last_reserved_ip.0
/var/lib/cni/networks/10.10.1.20
/var/lib/cni/networks/10.10.1.22
/var/lib/cni/networks/10.10.1.21
$ sudo find /var/lib/cni/networks/ -type f | xargs -I % sh -c 'echo -n "%: ->"; cat %; echo "";'
/var/lib/cni/networks/last_reserved_ip.0: ->10.10.1.22
/var/lib/cni/networks/10.10.1.20: ->ns1
/var/lib/cni/networks/10.10.1.22: ->ns1
/var/lib/cni/networks/10.10.1.21: ->ns1
每个被用过的 IP 都会产生一个以该 IP 为名的文件,该文件中的內容非常简单,就是使用的 container ID(ns1),last_reserved_ip 的文件,该文件用来记住每个 range 目前分配的最后一个 IP 是哪个
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)