Linux的3.12内核支持6种Namespace:
UTS: hostname
IPC: 进程间通信
PID: "chroot"进程树
NS: 挂载点,首次登陆Linux
NET: 网络访问,包括接口
USER: 将本地的虚拟user-id映射到真实的user-id
虚拟化
NET:网络名称空间:
描述:主要是网络设备、协议栈等实现,假设物理机上有四块网卡,需要创建两个名称空间,这些设备可以单独关联给某个空间所使用的,如第一个网卡分配给第一个名称空间使用,其他就看不见这个设备了,一个设备一般只能授予一个空间,同样有四个网卡就可以使用四个名称空间,使得每个名称空间都可以配置IP地址与外界进行通信。
如果名称空间的数量超过物理网卡数量,每个名称空间内部的进程也是需要通过网络进行通信,应该如何上报,可以使用模拟技术,linux设备支持两种内核级的模拟,是二层设备和三层设备,网卡就是一个二层设备,工作在链路层,能够封装报文实现各设备之间报文转发的实现,这功能是完全可以在Linux之上利用内核中对二层虚拟设备的支持,创建虚拟网卡接口,而且这种虚拟网卡接口很独特,每个网络接口设备是成对出现的,可以模拟为一根网线的两头,其中一头可以插在主机之上,另一头插在交换机之上进行模拟,相当于一个主机连接到交换机上去了,而linux内核源生就支持模拟二层网络设备,使用软件来构建一个交换机。
如果有两个名称空间,那么两台主机就像连接到同一个交换机上进行通信,如果配置的网络地址在同一个网段就可以直接进行通讯了。这就是虚拟化的网络。
OVS:
OpenVSwitch 可以模拟高级的网络技术,二层交换,甚至三层网络设备,vlan,,不属于Linux内核组件,要额外安装,由cisco众多公司所构建的,有云计算的浪潮下,构建网络是比较复杂的,然后才是网络之上所承载的主机,才能通讯,这个网络虚拟化所实现的功能,需要软件硬件结合起来实现,而且把传统意义上的网络平面,控制平面,传输平面等,隔离开来,集中到一个设备之上实现全局的调度,实现SDN(软件定义网络)
通信方式:
同一个物理机上的容器通信
简单的情况: 同一个物理机上的两个容器,或者两个名称空间要通讯,就是在主机上建立一个虚拟的交换机,让两个容器各自使用纯软件的方式,建一对虚拟网卡,一半在交换机上,一半在容器上,从而实现单节点上容器进行通讯,但是也有比较复杂的情况,
复杂的情况: 有两个软交换机的情况,连接不同的容器,这时两个软交换机要连接,需要再做一块网卡,一头在交换机1上,另一头在交换机2之上,如果不同交换机之间要实现路由转发,就需要在两能交换机上加一台路由器,linux内核自身可以当作路由器来使用,打开转发或者使用iptables规则,但是路由器是一个三层的设备,在linux内核直接使用一个单独的名称空间就可以实现,就是再做一个容器当作路由器来使用,当是要模拟出网卡来让它们建立关联关系
不同物理机上的容器进行通信
桥接方式:
所有容器都将自己一半的网卡连接到物理机上,把各自宿主机的物理网卡当做交换机使用,当物理网卡接受到数据时通过MAC地址来确定将数据交给那个容器,所有容器都桥接到一个同一个平面时这种方式容易产生风暴
Nat方式:
一级NAT:
如图中C3与C6通讯,C3是虚拟网卡,C3网卡与物理网卡物理地址不在同一个网段中,C3把网关指向S2,把S3当作宿主机的一个网卡来使用,IP地址与C3在同一个网段,把C3的网关指向S2,然后在物理机上打开核心转发功能,所以当C3与C6通讯时,先转给s2,再到达内核,内核判定查路由列不是自己要到另一个主机上的C6,这时报文回不来,因为C3和C4是一个私有地址,如果要报文能够回来,最后到报文送走物理机之前,要把源IP地址修改成物理网卡的IP地址,这样C5或者C6回复物理主机的IP就可以了,通过NAT表的查询是C3的访问,就把报文送给C3,这就使用NAT实现跨主机之间的通讯.
二级NAT:
但是这里有一个很大的问题,C6也可能是NAT的模式下工作,也就是说它也是使用私有地址的,如果C6要被访问只能把它暴露出去,在物理机的能外网卡上明确说明某个端口是提供服务的,如果要C4能够访问C6,就要先访问C6所在的宿主机的物理地址,再使用H2做dnat发给C6,但是C4发送报文时是通过SNAT出来的,C4也是隐藏在NAT背后的,发出去的报文要其他的主机可以响应就应该改写源地址。所以在跨服务主机实现两个虚拟机之间的通讯要实现两级的NAT操作,从C4到C6,首先C4出去就SNAT,到到C6要使用到DNAT,这样的效率不会高,但是网络比较容易管理。
Nat 路由转换的过程
叠加网络: overlay network
是NAT和桥接的一个解决方案,有多个物理主机,在虚拟机上做一个虚拟的桥,让各虚拟机连接到虚拟桥上,通信时借用物理网络来完成报文的隧道转发,从而实现C1可以直接看见C5或C6,物理主机本来就是使用物理网络连接在一起的,C1与物理网络不在同一个地址段内,但是C1与C5是在同一地址段内的,C1发送报文时,先发送给虚拟机,假设它是知道C5是不要本地的物理主机上的,以是报文要从物理网卡发送出去,但是要做隧道转发,也就是C1的报文源IP地址是C1,目标地址是C5,然后再封装一个IP包头的首部源地址是C1所在物理主机的IP地址,目标地址是C5所在物理主机的IP地址,当报文送到C5所在的物理机,把报文拆完第一层后,第二层的目标地址就是C5的,就直接交给本地的软交换机,再交给C5,C1与C5之间的通讯直接源地址和目标地址就是各自双方,但是它寄于别的网络,本地自身就是一个三层的网络,应该封装二层,但是没有封装,又封装三层四层报文,就是一个TCP或者UDP的首部,再封装一个首部实现一个两级的三层封装,从而完成报文的转发
说简单点就是:nat 在发送的过程是会修改目的地址和源地址的,即先到物理机然后把原地地址换成物理机的地址,在发送回来也是一样(通过nat表来实现)。叠加网络则是通过在封装一层真正的原地址和目的地址来实现公网和私网的通信
ps:部分理论来自其他大佬,只是方便自己总结:P
来源:CSDN
作者:jinjiangcc
链接:https://blog.csdn.net/raogeeg/article/details/85013005