十、云原生网络架构
随着云原生技术的不断发展和演进,实现容器间互联的云原生网络架构也在不断地进行优化和完善,从 Docker 本身的动态端口映射网络模型到 CNCF 的 CNI 容器网络接口,再到“Service Mesh+CNI”层次化的 SDN。
容器网络
以容器的典型实现 Docker 为例,其自身在网络架构上默认采用桥接模式,即 Linux 网桥模式,创建的每一个 Docker 容器都会桥接到这个 docker0 的网桥上,形成一个二层互联的网络。同时还支持 Host 模式、Container 模式、None 模式的组网。
Host 模式:host 模式下 docker 不会为容器创建网络名称空间而是与宿主机共用一个网络名称空间,并使用宿主机的网卡、端口等信息,但是其他名称空间,比如用户、文件系统等还是和宿主机隔离开的。
Bridge 网络模式:这是容器默认的设置,创建的容器默认会连接到 docker 的网桥上(即 docker0),通过 docker 网桥及 iptables nat 表配置与宿主机进行通信。
Container 网络模式:指定新创建的容器与已存在的容器共享网络名称空间,新创建的容器不会创建网卡,而是与已存在的容器共享一个网卡、IP 等,两个容器之间可以通过 lo 回环网卡设备进行通信,但是其他名称空间,比如用户、文件系统等还是和容器隔离开的。
None 网络模式:none 模式下创建的容器除了自带的 lo 回环网卡设备外,没有任何网卡、路由等信息,就是一种封闭式容器。这种模式下给了用户很大的自由度,用户可以根据自己的需求来定义网络环境。
K8S 网络
容器网络接口(Container Network Interface,CNI)是由 Google 和 CoreOS 主导制定的容器网络标准,综合考虑了灵活性、扩展性、IP 分配、多网卡等因素。CNI 旨在为容器平台提供网络的标准化。目前采用 CNI 提供的网络方案一般分为两种:Overlay 组网方案和路由组网方案。
Overlay 组网:以 Flannel、Cilium、Weave 等为代表的容器集群组网架构,默认均采用基于隧道的 Overlay 组网方案。比如,Flannel 会为每个主机分配一个 Subnet,Pod 从该 Subnet 中分配 IP,这些 IP 可在主机间路由,Pod 间无须 NAT 和端口映射就可以跨主机通信。而在跨主机间通信时,会采用 UDP、VxLAN 等进行隧道封装,形成 Overlay 网络。
路由组网:以 Callico 为代表的容器组网架构提供了一个纯三层的网络模型。在这种三层通信模型中,每个 Pod 都通过 IP 直接通信。Callico 采用 BGP 路由协议,使得所有的节点和网络设备都记录下全网路由,这样每个容器所在的主机节点就可以知道集群的路由信息。整个通信的过程中始终都是根据 BGP 进行路由转发,并没有封包、解包的过程,这样转发效率就会快很多。然而这种方式会产生很多无效的路由,同时对网络设备路由规格要求较大。
服务网格
当前在云原生网络中,服务网格(Service Mesh)是一个非常流行的架构方案。与 SDN 类似,Service Mesh 通过逻辑上独立的数据平面和控制平面来实现微服务间网络通信的管理。但是 Service Mesh 并不能替代 CNI,它需要与 CNI 一起提供层次化微服务应用所需要的网络服务。这就可以看出,Service Mesh 与 SDN 还是有着一定的区别,SDN 主要解决的是 L1~L4 层的数据包转发问题,而 Service Mesh 则主要解决 L4/L7 层微服务应用间通信的问题。二者可以通过互补配合的方式,共同实现云原生网络架构。
版权声明: 本文为 InfoQ 作者【穿过生命散发芬芳】的原创文章。
原文链接:【http://xie.infoq.cn/article/7d80851b9aa0591e02fe83ced】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论