K8s bridge、CNI
一、项目地址
k8s CNI 插件
二、项目介绍
bridge、IPAM 插件都在K8s的网络插件里面
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结构
接口
网桥提供了三个接口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运作的模式
- 发送DHCP 请求
- 等待DHCP 响应
- 设定IP到目标网络介质上
- 定期Renew
DHCP模式下有两种运行的形式,一种是CNI模式(提供函数接口),一种是启动一个不停运行的daemon模式(使用rpc提供接口)。
daemon 模式的功用很简单,接受所有来自 CNI 模式的请求,然后切换到目标的 namespace 里面去根据目标的网络介质发送一个 DHCP 请求封包,所以运行 DHCP IPAM 之前,要先在系统上跑一个 daemon,然后会通过 unix socket 的方式等待 DHCP IPAM CNI 发送命令过来,该命令需要包含 目标的namespace和目标的网卡名称。
执行流程图
首先当 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 是哪个