Kubernetes网络自学系列 | 打开万花筒:Docker的四大网络模式
Posted COCOgsta
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kubernetes网络自学系列 | 打开万花筒:Docker的四大网络模式相关的知识,希望对你有一定的参考价值。
素材来源:《Kubernetes网络权威指南》
一边学习一边整理内容,并与大家分享,侵权即删,谢谢支持!
附上汇总贴:Kubernetes网络自学系列 | 汇总_COCOgsta的博客-CSDN博客
2.2 打开万花筒:Docker的四大网络模式
从网络的角度看容器,就是network namespace + 容器的组网方案。利用network namespace,可以为Docker容器创建隔离的网络环境。容器具有完全独立的网络栈,与宿主机隔离。用户也可以让Docker容器共享主机或者其他容器的network namespace。network namespace的相关技术点已经在第1章详细地介绍过,本节不再赘述。
容器的网络方案可以分为三大部分:
·单机的容器间通信;
·跨主机的容器间通信;
·容器与主机间通信。
本节将介绍单机下Docker的4种网络通信模式。
我们在使用docker run命令创建Docker容器时,可以使用--network选项指定容器的网络模式。Docker有以下4种网络模式:
·bridge模式,通过--network=bridge指定;
·host模式,通过--network=host指定;
·container模式,通过--network=container:NAME_or_ID指定,即joiner容器;
·none模式,通过--network=none指定。
在安装完Docker之后,Docker Daemon会在宿主机上自动创建三个网络,分别是bridge网络、host网络和none网络,可以使用docker network ls命令查看,如下所示:
2.2.1 bridge模式
Docker在安装时会创建一个名为docker0的Linux网桥。bridge模式是Docker默认的网络模式,在不指定--network的情况下,Docker会为每一个容器分配network namespace、设置IP等,并将Docker容器连接到docker0网桥上。严谨的表述是,创建的容器的veth pair中的一端桥接到docker0上。docker0网桥是普通的Linux网桥,而非OVS网桥,因此我们通过brctl命令查看该网桥信息:
注意,现在的docker0网桥上还没有任何对接的网卡。我们创建一个容器后再来看docker0有什么变化。
如上所示,当我们成功创建了一个容器后,docker0上就挂接了一块新的网卡,这块网卡就是新建容器时创建的,并放在主机network namespace的veth pair一端。
在默认情况下,docker0的IP地址均为172.17.0.1(除非在Docker Daemon启动时自行配置),而接到docker0上的Docker容器的IP地址范围是172.17.0.0/24。连接在docker0上的所有容器的默认网关均为docker0,即访问非本机容器网段要经过docker0网关转发,而同主机上的容器(同网段)之间通过广播通信。下面的容器内的路由表信息证实了这一点:
不仅如此,发到主机上要访问Docker容器的报文默认也要经过docker0进行广播,请看下面主机上的路由表信息:
bridge模式为Docker容器创建独立的网络栈,保证容器内的进程使用独立的网络环境,使容器和容器、容器和宿主机之间能实现网络隔离。
2.2.2 host模式
连接到host网络的容器共享Docker host的网络栈,容器的网络配置与host完全一样。host模式下容器将不会获得独立的network namespace,而是和宿主机共用一个network namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
我们先查看主机的网络:
然后创建host网络的容器,再查看容器的网络信息:
host模式下的容器可以看到宿主机的所有网卡信息,甚至可以直接使用宿主机IP地址和主机名与外界通信,无须额外进行NAT,也无须通过Linux bridge进行转发或者进行数据包的封装。Docker的host模式网络原理如图2-2所示,其中虚线框表示是容器和主机共享network namespace。
图2-2 Docker的host模式网络原理
当然,host模式有利有弊,优点是没有性能损耗且配置方便,缺点也很明显,例如:
·容器没有隔离、独立的网络栈:容器因与宿主机共用网络栈而争抢网络资源,并且容器崩溃也可能使主机崩溃,导致网络的隔离性不好;
·端口资源冲突:宿主机上已经使用的端口就不能再用了。
2.2.3 container模式
创建容器时使用--network=container:NAME_or_ID模式,在创建新的容器时指定容器的网络和一个已经存在的容器共享一个network namespace,但是并不为Docker容器进行任何网络配置,这个Docker容器没有网卡、IP、路由等信息,需要手动为Docker容器添加网卡、配置IP等。
需要注意的是,container模式指定新创建的容器和已经存在的任意一个容器共享一个network namespace,但不能和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。
Kubernetes的Pod网络采用的就是Docker的container模式网络,我们将在后面的章节详细介绍。
2.2.4 none模式
none模式下的容器只有lo回环网络,没有其他网卡。none模式网络可以在容器创建时通过--network=none指定。这种类型的网络没有办法联网,属于完全封闭的网络。唯一的用途是客户有充分的自由度做后续的配置。
这种模式下的Docker容器拥有自己的network namespace,但是并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息,需要我们自己为Docker容器添加网卡、配置IP等。
以上是关于Kubernetes网络自学系列 | 打开万花筒:Docker的四大网络模式的主要内容,如果未能解决你的问题,请参考以下文章
Kubernetes网络自学系列 | 打通CNI与Kubernetes:Kubernetes网络驱动
Kubernetes网络自学系列 | 终于等到你:Kubernetes网络
Kubernetes网络自学系列 | 前方高能:Kubernetes网络故障定位指南