K8S cni开发

一、前题准备

网络通信前有个路由转发的功能,需要开启:

1、允许防火墙,路由转发
iptables -A FORWARD -j accept
2、内核允许路由转发,修改值为1
sudo bash -c 'echo 1' >/proc/sys/net/ipv4/ip_forward

二、基础概念

1、netns

network namespace
-- 主机ip栈的逻辑拷贝,隔离的网络协议栈,有独立的网络接口,ip,路由表和iptables规则
-- 每个pod是个独立的netns

ip netns add pod1

ip link add name eth0 type weth peer name weth1

2、bridge

bridge 是个 linux 下支持创建的虚拟网络设备,作用就和物理设备的网桥差不多,或者说它更像交换机,同时具备二层转发和三层路由的能力

1)、查看bridge:

brctl show

2)、添加bridge:

brctl addbr br-vx

3)、其他操作

brctl addif eth0
ip link set docker0 up

3、vxlan:

linux系统上的一个虚拟的网络设备,它能够对主机上要发出去的包进行udp的封装

1)、添加vxlan:

ip link add vxlan10 type vxlan id 100 remote 192.168.153.120 dstport 4789

4、网关:

网关的本质是作为ip通信的中转站,网络包在传输过程中,目的ip是不会变的,一直在变化的是mac地址,每到一台主机,那么目的mac地址就会发生变化,变成下一个网关的mac地址。数据包需要到达的下一台主机被称作"下一跳"

三、同一主机上pod通信原理

想实现同一台节点上,互相隔离的两个 pod 之间通信,一般采用的办法就是 veth pair + bridge。

1、首先 linux 支持创建 veth pair 设备,这是一对儿虚拟设备,大家可以简单地想象成它就是一根儿网线,网线两头各自有个插头,这个插头可以自由插入 linux 下 net ns 或者其他虚拟网络设备,然后从某一头发送的消息可以送达到另外一头儿

2、bridge 也是个 linux 下支持创建的虚拟网络设备,作用就和物理设备的网桥差不多,或者说它更像交换机,同时具备二层转发和三层路由的能力

3、我们将要创建一个 bridge,然后再创建一对儿 veth pair,将 veth 的一头儿插入到 bridge 上,将另一头儿插入到 pod 所在的 netns 中(其实 pod 所谓的网络资源隔离就是单纯地通过 netns 做的,因此只需要将 veth 插到这个 netns 中就 ok 了。而这个 netns 是在 CRI 调用插件时就传过来了)

4、利用 ipam 从 etcd 中获取当前节点上的 pod 所在网段,比如是 10.244.0.0,然后我们默认使用这个 网段+ 1 的 IP 作为 bridge 的 ip 地址,比如 master 节点的网段是 10.244.0.0,则让网桥地址是 10.244.0.1,其他节点也是如此,分别塞上 10.244.1.1/10.244.2.1/10.244.3.1/......,将这个 10.244.0.1 塞给网桥后,当将 ip 塞给网桥的瞬间,网桥就具备的三层的路由能力,然后它就可以作为所有连在它身上的网络设备的网关了

5、给 pod 内的 netns 设置默认路由,网关为 bridge,让 pod 内部可以 ping 通 10.244.0.0 之外的网段

6、当有新的 pod 被创建时,重复上述 5 、6、7、9 的动作

7、vxlan之间传输的包:用arp协议封装的一个mac包

四、实现不同节点的 pod 互通

要实现让不同节点的设备互通方法有很多,不过总的归类来讲,大致有三种:

  1. 走主机的静态路由,这种方式相对简单,我们就采用这种方式
  2. overlay 网络,也叫隧道网络
  3. 动态路由网络

像类似第二种方式,在 flannel 里叫 gw-host,第三种方式可以使用 vxlan 或者其他隧道网络技术,第四种是 calico 主要采用的方式,使用 BGP 协议在多台主机上做动态路由设置

 

posted @ 2023-05-20 00:32  南昌拌粉的成长  阅读(20)  评论(0编辑  收藏  举报