Container容器借助底层Linux操作系统的Namespace与Cgroup内核技术,实现在单一主机资源的轻量级虚拟化资源隔离,包含进程ID、主机名、用户ID、文件名、网络和进程间通信等。同时每个网络空间Network Namesapce都有独立的网络栈,包括网络接口(Network Interface)、回环设备(Lookback Device)、路由表(Routing Table)和iptables规则等,是容器网络隔离与通信的基础。
Kubernetes是以Container容器技术为核心的调度引擎,将传统云计算对应的基础资源,包含计算、存储,网络进行了彻底池化统一管理,同时将运行在技术架构之上的应用和服务也进行了抽象标准化,再通过调度快速实现应用与资源的匹配,即以应用为中心构建云原生操作系统能力。
在Kubernetes集群内,既要解决相同宿主机多个命名空间网络栈共享底层硬件资源,同时还要解决集群内部跨宿主机网络通信的问题,面向应用提供完成的网络能力,所以容器网络是Kubernetes最复杂部分,同时也是设计精华所在:对于相同宿主机共享底层硬件设备问题,通常是借助虚拟化技术来实现,通过虚拟设备来实现灵活的管理,再将虚拟化设备连接到真实的物理设备上实现网络通信;对于跨宿主机网络通信问题,采用SDN软件定义网络的思路,灵活使用底层网络通信协议,同时结合各种虚拟化隧道通信技术,实现容器集群内外部通信。
所以要搞清楚复杂的容器网络及各种各样的网络插件,首先需要了解网络通信基础,网络设备虚拟化以及网络隧道技术。
网络通信基础
01 网络模型
OSI网络模型将网络数据发送和接收数据的过程分为7层,分别是物理层(Physical Layer),数据链路层(Data Link Layer),网络层(Network Layer),传输层(Transport Layer),会话层(Session Layer),表示层(Presentation Layer),应用层(Application Layer)。