网络基础知识
计算机网络分层
分别为: OSI七层参考模型,TCP/IP参考模型,五层参考模型
网关,网桥,网卡
网桥:一种网络设备,主要用于连接两个或多个局域网(LAN),通常工作在数据链路层。它可以在两个网络之间中继数据帧,确保数据可以在不同的网络之间正确传输。网桥的主要作用是在同类LAN之间连接,而网关则用于连接不同类型的网络或协议
网卡:是计算机与网络进行物理连接的接口设备,全称为网络接口卡。它集成了局域网功能,有时也称为LAN卡或网络适配器。每个网卡都有一个唯一的MAC地址,用于在局域网内寻址。网卡将数字信号转换为电信号,并通过网线发送出去,属于OSI模型的第一和第二层
网关:一种更为复杂的网络设备,用于实现不同局域网(LAN)的连接。与网桥不同,网关建在应用层,并且可以处理不同网络之间的协议转换,使得使用不同通信协议、数据格式或语言的系统可以相互通信。网关的主要优势在于能够将具有不相容的地址格式的网络连接起来,实现不同网络之间的通
网关是邮电局,所有的信息必须通过这里的打包、封箱、寻址,才能发出去与收进来;网卡是设备,也就是邮电局邮筒,你家的信箱;而网桥是邮递员,但他只负责一个镇里面(局域网)不负责广域网
linux的ipip隧道技术:
https://blog.csdn.net/sanhewuyang/article/details/136491896
calico的主要组件
1.Felix:
功能:
分布式键值存储,主要负责网络元数据一致性,确保Calico网络状态的准确性,可以与kubernetes共用
作用:
Felix会监听etcd中心的存储,从它获取事件,比如说用户在这台机器上加了一个IP,或者是创建了一个容器等。用户创建pod后,Felix负责将其网卡、IP、MAC都设置好,然后在内核的路由表里面写一条,注明这个IP应该到这张网卡。同样如果用户制定了隔离策略,Felix同样会将该策略创建到ACL中,以实现隔离。
2.etcd:
功能:
分布式键值存储,主要负责网络元数据一致性,确保Calico网络状态的准确性,可以与kubernetes共用
3.BGP Client(BIRD):
功能:
calico 为每一个主机部署一个BGP Client,使用BIRD实现,BIRD是一个独特的持续发展项目,实现了众多动态路由协议,比如BGP,OSPF,RIP等,caloco的角色是监听host上有Felix注入的路由信息,然后通过BGP广播告诉剩余的主机节点,从而实现网络互通
作用:
BIRD是一个标准的路由程序,它会从内核里面获取哪一些IP的路由发生了变化,然后通过标准BGP的路由协议扩散到整个其他的宿主机上,让外界都知道这个IP在这里,你们路由的时候得到这里来。
4.BGP Route Reflector:
功能:
在大型网络规模中,如果仅仅使用 BGP client 形成 mesh 全网互联的方案就会导致规模限制,因为所有节点之间俩俩互联,需要 N^2 个连接,为了解决这个规模问题,可以采用 BGP 的 Router Reflector 的方法,使所有 BGP Client 仅与特定 RR 节点互联并做路由同步,从而大大减少连接数。
Calico实现的node之间的俩种网络
ipip模式:
采用linux的ipip隧道技术实现数据包的封装和转发
具体流程
1、数据包从 Pod1 出到达Veth Pair另一端(宿主机上,以cali前缀开头)。
2、进入IP隧道设备(tunl0),由Linux内核IPIP驱动封装,把源容器ip换成源宿主机ip,目的容器ip换成目的主机ip,这样就封装成 Node1 到 Node2 的数据包。
3、数据包经过路由器三层转发到 Node2。
4、Node2 收到数据包后,网络协议栈会使用IPIP驱动进行解包,从中拿到原始IP包。
5、然后根据路由规则,将数据包转发给cali设备,从而到达 Pod2。
calico模式的启用
CALICO_IPV4POOL_IPIP来实现ipip功能的开关:默认是Always,表示开启;Off表示关闭ipip。
# kubectl get daemonsets. calico-node -n kube-system -o yaml | grep -iA 1 ipip -
- name: CALICO_IPV4POOL_IPIP
value: "Always"
BGP模式
BGP网络相比较IPIP网络,最大的不同之处就是没有了隧道设备 tunl0。 前面介绍过IPIP网络pod之间的流量发送tunl0,然后tunl0发送对端设备。BGP网络中,pod之间的流量直接从网卡发送目的地,减少了tunl0这个环节。
具体流程
1.数据包也是先从veth设备对另一口发出,到达宿主机上的cali开头的虚拟网卡上(当创建一个pod时帮你先起一个infra containers的容器,调用calico的二进制帮你去配置容器的网络)
2.宿主机根据路由表决定这个数据包到底发送到哪里去,可以从ip route看到路由表信息,这里显示是目的cni分配的子网络和目的宿主机的网络,
3.当进行跨主机通信的时候之间转发到下一跳地址走宿主机的eth0网卡出去
4.一个宿主机的网卡中,在路由表中找到对应的虚拟网卡cali地址
参考链接
https://www.cnblogs.com/goldsunshine/p/10701242.html