0.前言

服务的价值在于通信,而网络协议就是通信基础设施。在微服务化盛行的今天,应用更多是依托容器对外提供服务,所以我们就一起来看看容器中的网络是什么样子的吧~

1.docker容器网络

现在的所说的容器,大多是指的docker容器(容器的一种实现),它是一种虚拟化技术,可以有效的进行资源隔离并且更加轻量级,这里就不再过多介绍了

docker容器的网络模式

1.bridge模式

bridge(桥接模式)是docker 默认的网络模式。它有两个关键的实现的技术点:

1) 虚拟网桥

    当docker服务在宿主机上被启动时,会在宿主机上创建一个虚拟网桥,默认名为docker0,可以把它看做是一个二层网络交换机,通过veth parie的一端连接到docker容器中

2) veth paire

    与docker0相同,veth parie也是一种虚拟的网络设备,它的特点是被创建出来后,总是以两种虚拟网卡的形式成对出现,并且,从其中一个网卡发出的数据包,可以直接出现在与他对应的网卡上。

2,host模式

直连模式 

3,container模式

待补充

4,none模式

 

容器内部如何响应外部请求

当外部请求容器时,会进行以下几步网络转换,转换规则基于iptables

1,当容器启动时并指定了端口映射,此时docker会在宿主机上创建一条iptables规则,这条规则就是对请求地址的转换规则

 

2,外部数据包访问宿主机eth0地址+端口进行访问时,宿主机会匹配到这条iptables规则,并对他进行DNAT目标地址转换

3,此时数据包目标地址会被转发到docker0网桥上,由docker0网桥通过veth设备转发到容器的eth0中(也就是veth的另一端)

DNAT 目标地址转换

              外部访问容器流程

 

同样的,对于容器访问外部网络,也是由docker0网桥进行一次源地址转换

 

             容器内部访问外部网络

 

多节点容器网络需要解决的问题

1,两台docker主机网络是独立的

2,怎么统一管理多台docker主机的容器IP

3,两台docker主机的网段是一个docker内部网络

 

“计算机科学领域里的任何问题,都可以通过引入一个中间层来解决”

 

 

2.CNI网络模型

CNI网络模型需要解决的问题

 

容器集群环境中,往往需要在多个容器之间进行通信,而由于network Namespace的隔离,和容器即插即用的特性,通过宿主机调用容器并不是好的使用方式。

 

所以容器与容器的跨主机通信是单机容器网络无法解决的问题。

 

k8s是一个扁平化网络。

即所有部署的网络组建都必须满足以下要求

1,一个pod一个IP

2,所有的pod都可以与其他的pod直接通信

3,所有节点可以与所有pod直接通信

4,pod内部获取到的IP地址与其他Pod节点与其通信时的IP地址是同一个

  

3.falnnel和calico