前言
Docker 网络 vs. Kubernetes 网络
Docker 网络采用的 Bridge 模式,这也是 Docker 默认的网络驱动(network driver)。Bridge 模式使用网络地址转发(NAT),所以发往集群外的数据包中,容器的源 IP、Port 和 MAC 都要经过转换成节点的 IP、Port 和 MAC。集群外发往容器的数据,则要把目的 Ip、Port 和 MAC 地址从节点改为容器。因此不同节点上的容器 IP 可以相同,如图所示。
Kuberntes 网络则遵循 IP-per-pod 的原则,不同 Pod 的 IP 地址不相同,且可以通过 Pod IP 相互通信。
从网络的角度谈 Pod
每个 Pod 包含一个 pause 容器和若干应用容器。pause 容器除了创建 network namespace 供其他容器使用外,无其他任务。这样做的好处是,不会因应用容器挂了,而导致其他应用容器网络不可用。 Kubernetes 这种做法可等价于下图 docker 的操作:
全部 Pod 组成一个子网,整个子网又可以根据不同 Node 分配网络范围(CIDR)。不同节点的 CIDR 互相没有重叠。CIDR 地址块的大小对应于每个节点的最大 Pod 数量。
Pod IP vs. Cluster IP
- Pod IP:指向固定地址,即 Pod。不同 Pod 间通信使用该地址。
- Cluster IP:分配给 Service 的网络地址,用于服务代理。Service IP 是虚拟 IP,通过 iptables 实现。
服务发现
Container Network Interface
CNI(Container Network Interface)是 CNCF 下的一个项目,由一组用于配置 Linux 容器的网络接口的规范和库组成,同时还包含了一些插件。CNI 仅关心容器创建时的网络分配,和当容器被删除时释放网络资源。
对基于 docker 的 Kubernetes 集群网络,使用 CNI 将会使 docker 的网络被设置为 none 模式。因此,docker inspect
返回的 NetworkingSettings 字段值会为空:
目前最流行的CNI插件:Flannel、Calico、Canal
覆盖网络
覆盖网络(Overlay Network)简单说来覆盖网络就是应用层网络,它是面向应用层的,不考虑或很少考虑网络层,物理层的问题。Overlay Network 是建立在现有 Physical Network 之上的虚拟逻辑网络,通常用于在现有网络之上提供有用的抽象,并分离和保护不同的逻辑网络。。
OverlayNetwork 的实现技术有:VXLAN
参考资料
[1] Rancher Labs Online Meetup: Kubernetes Networking Master Class
[2] CNI - Container Network Interface(容器网络接口)
[3] Kubernetes CNI网络最强对比:Flannel、Calico、Canal和Weave
[4] Integrating Overlay Networking and the Physical Network