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地址是同一个