• 容器网络原理


    对于Linux可以通过查看/proc/net/nf_conntrack文件的内容来跟踪包的链路情况

    参考:浅析 /proc/net/nf_conntrack 文件(转)_cnxhsy的技术博客_51CTO博客


    Bridge:
    docker通过docker0这个网桥来保证容器间的通信,但是网桥一般是只认mac地址,不认ip地址,属于二层网络设备,路由器属于三层网络设备,我们发送一个包到一个ip后,首先三层网络设备会广播arp包来询问局域网中的ip地址所属的mac地址,找到mac地址后将mac地址写到网络包中的目的mac地址上,然后二层网络设备就能通过mac地址找到对应的网卡也就是说,网桥一般是二层设备,是没有ip地址的,那么docker0是一个虚拟网桥,为什么要设置一个ip地址呢,这是因为给网桥设置一个ip地址后,它就跟内核协议栈关联起来了,这样所关联的网络命名空间就能和主机,以及公网进行通信

    veth-pair:
    Linux的一个网络设备,这个网络设备有两个端点,数据从一个端点进入,必然从另外一个端点流出,每个veth都可以被赋予ip地址,并参与三层网络路由过程网络设备被赋予ip之后,那它的一端就可以被认为与协议栈相连

    docker启动一个容器后,会创建一个veth-pair网卡,一端链接docker0,一端链接容器内的协议栈,并且为他们创建路由(为什么两端都要创建路由)
    我们创建了一个veth-pair设备后,我们两端分别有两个网段的ip,我们从ip1 ping到 ip2的时候,如果没有相应的路由规则,那么主机会不知道该吧包发送到哪个设备,我们创建路由后协议栈就知道该发往veth-pair设备,但是发送后vethpair需要目的地的mac地址,我们的ip2收到arp请求之后,回复mac地址,但是它回复的请求也不知道该发送到哪个设备,所以也需要创建路由来匹配


    docker容器间及跟主机的通信:
    docker的容器之间通信就是通过docker0这个网桥,启动一个容器后创建一个veth-pair设备,一端链接容器内部网络命名空间协议栈,一端链接docker0,这样docker0作为一个网桥就可以使得荣期间可以通信,如果容器间的ip是不同网段,那么需要配置路由表,否则arp包会找不到地址导致无法返回mac地址,然后容器内部网络命名空间怎么跟主机通信呢,这需要docker0配置一个ip地址来链接主机的网络协议栈,然后容器内部需要添加路由规则,配置下一跳地址为docker0,这样docker0就可以转发包到主机

    docker访问外网:
    其实容器链接主机协议栈之后就可以跟主机通信也可以跟外网通信,但是有个前置条件:
    1.运行防火墙,路由转发
    iptables -A FORWARD -j ACCEPT
    2.内核允许路由转发,修改值为1
    vim /proc/sys/net/ipv4/ip_forward
    3.配置iptables -t nat -A POSTROUTING -S 192.168.15.0/24 -J MASQUERADE  这个配置是将192.168.15.0/24 地址出去的ip的源地址改为网关地址,如果不替换的话回来就会找不到该网卡

    flannel vxlan:实现不同主机容器通信: 
    vxlan是一种Linux上的网络设备(是一个二层网络设备),这个设备能够对内部要发出去的包进行udp的封装,对外部到达到vxlan上的包进行解包,vxlan收到包时,会在fdb表中通过要发送包的mac地址去反查要送达的ip地址.

    vxlan通过查找fdb表项来进行转发收到的包,

    比如通过bridge fdb查看
    ......
    00:00:00:00:00:00 dev vxlan0 dst 192.168.64.4 via enp0s1 self permanent 
    这个表示任何mac地址的包只要到达vxlan0这个网络设备上,他就会被发往一个目的ip为192.168.64.4的这个主机上去,k8s上稍有不同

    calico 是通过配置路由规则来实现一个不同主机间的通信,他的优势是没有封包解包,比较高效

  • 相关阅读:
    线性回归大结局(岭(Ridge)、 Lasso回归原理、公式推导),你想要的这里都有
    流畅的Python读书笔记(五)序列:序列的排序及管理
    FCOS论文复现:通用物体检测算法
    FSL 6.07安装
    【LeetCode】437. 路径总和 III
    JAVA 枚举的基础、应用和原理
    大数据课程L7——网站流量项目的操作步骤
    Java8 Stream 的这些知识,你了解吗
    2022年双十一买哪款蓝牙耳机?学生党值得买的蓝牙耳机推荐
    第一章:R语言与Rstuido 第一节:R语言介绍与Rstudio
  • 原文地址:https://blog.csdn.net/dw147258dw/article/details/125916573