本文最后更新于:2020年11月14日 下午

容器网络:

环境隔离技术:1)命名空间(namespace);2)机制网络(cgroup)
命名空间(namespace):每个namespace 中的应用看到的是不同的 IP 地址、用户空间、程号等。
机制网络(cgroup):cgroup 全称 control groups,是 Linux 内核提供的一种可以限制、隔离进程使用的资源机制。包含很多子系统:
CPU 子系统使用调度程序为进程控制 CPU 的访问;
cpuset,如果是多核心的 CPU,这个子系统会为进程分配单独的 CPU 和内存;
memory 子系统,设置进程的内存限制以及产生内存资源报告;
blkio 子系统,设置限制每个块设备的输入输出控制;
net_cls,这个子系统使用等级识别符(classid)标记网络数据包,可允许 Linux 流量控制
程序(tc)识别从具体 cgroup 中生成的数据包。

容器与宿主机通信:

在 Linux 下,可以创建一对 veth pair 的网卡,一端绑定docker网桥,一段绑定namespace,实现通信;

容器访问外网:

NAT模式:SNAT

外网访问容器服务:

1)docker-proxy:比如监听10080端口,转换为80端口
2)DNAT:在 -A PREROUTING 阶段加一个规则,将到端口 10080的 DNAT 称为容器的私有网络。

跨节点容器网络方案——flannel:

基于 NAT 的容器网络模型在微服务架构下有两个问题,一个是 IP 重叠,一个是端口冲突,需要通过 Overlay 网络的机制保持跨节点的连通性。
flannel使用UDP实现Overlay:
每一台物理机上运行一个flannel进程,创建出一个flannel.1网卡,所有发到该网卡的包会被flannel进程封装在UDP包里,外层加上源、目物理机IP,发送给目的物理机上的flannel进程处理,拆封UDP包,通过目的物理机的flannel.1网卡发送出去。由于是用户态对数据包进行封装,会有性能损耗。
flannel使用VXLAN实现Overlay:
通过内核netlink机制创建一个VTEP网卡flannel.1,物理机A将数据包发送到flannel.1进行封装,转发到物理机B的flannel.1网卡进行解包,变成内部网络包,再通过物理机网桥转发到容器B内部; VXLAN 在内核态封装, 性能更好一些。

容器网络——Calico:

设计思路:不依赖Overlay网络,不引入额外的网络损耗,利用物理机做路由器,使用三层网络的路由转发实现容器间通信。
Calico组件:
路由配置组件:每台物理机上有一个 agent,当创建和删除容器的时候,配置一条指向该容器的路由。这个 agent 在 Calico 中称为 Felix。
路由广播组件BGP Speaker:将该节点的路由信息进行广播;
安全策略组件:控制任意容器网络的连通;
BGP Route Reflector:节点数多时,为降低网络复杂性,BGP Speaker会直连一个BGP Route Reflector,让它负责广播全网路由信息;规模更大时,使用多个 BGP Router Reflector,每个 BGP Router Reflector 管一部分,服务器和 BGP Router Reflector 之间使用的是数据中心内部的路由协议 iBGP,BGP Router Reflector 之间使用的是数据中心之间的路由协议 eBGP。
跨网段访问问题:Calico的IPIP模式,在两台物理机直接建立隧道,容器IP作为乘客协议放在隧道内,物理机IP作为承载协议。不管外层的 IP 通过传统的物理网络,走多少跳到达目标物理机,从隧道两端看起来,物理机 A 的下一跳就是物理机 B,从而实现了容器网络的跨网段访问。