
Kubernetes 网络基础知识
本文主要介绍一些Linux网络基础和概念:namespace、veth pair、bridge、overlay、隧道等技术,便于深入理解Kubernetes网络。
作者:王一之,中国移动云能力中心软件开发工程师,专注于云原生领域。
01Network namespace
在Linux系统中,namespace是一种用于隔离系统资源的机制。通过namespace,可以为每个进程创建一个隔离的环境,使得每个进程看到的系统资源都是独立的,不会受到其他进程的干扰。
Linux系统中有多种类型的namespace,它们分别用于隔离不同的系统资源。例如,pid namespace用于隔离进程树,使得每个namespace中的进程看到的PID都是从1开始的。mount namespace用于隔离文件系统挂载点,使得每个namespace中的进程看到的文件系统都是独立的。
分类 | 系统调用参数 | 内核版本 | 隔离内容 |
Mount namespaces | CLONE_NEWNS | Linux 2.4.19 | 文件系统(挂载点) |
UTS namespaces | CLONE_NEWUTS | Linux 2.6.19 | 主机名和域名 |
IPC namespaces | CLONE_NEWIPC | Linux 2.6.19 | 信号量、消息队列和共享内存 |
PID namespaces | CLONE_NEWPID | Linux 2.6.24 | 进程编号 |
Network namespaces | CLONE_NEWNET | Linux 2.6.29 | 网络设备、网络栈、端口等 |
User namespaces | CLONE_NEWUSER | Linux 3.8 | 用户、用户组 |
Network namespace,顾名思义,是用于隔离网络资源的一种namespace,它可以为每个进程或者线程创建一个隔离的网络环境,使得每个进程看到的网络设备和网络配置都是独立的。Docker正是利用了network namespace空间特性,实现了不同容器之间的网络隔离。
Network namespace的常用功能已经集成到Linux的Ip工具的netns子命令中,我们可以通过几个简单的命令感受下network namespace的作用:
创建一个名为ns1的network namespace:
以下命令表示进入ns1 命名空间执行ip a命令:
可以对比一下直接执行ip a命令 ,我们发现在新创建的ns中只有环回接口,且状态为DOWN。
顺带一提,创建进程时如何设置namespace?我们经常听到的clone()、unshare()系统调用是什么意思?请看代码:
以上代码通过clone()系统调用创建了一个进程,并且通过传递CLONE_NEWNET开启network namespace隔离。按照预期,新进程只能看到lo设备,验证如下:
除了clone(),常见的系统调用还有以下2个:
- unshare():使某进程脱离某个namespace
- setns():把某进程加入到某个namespace
02Veth pair
新创建的namespace默认不能和其它namespace通信,需要通过一对虚拟网卡,即veth pair(Virtual Ethernet Device)。构造veth pair的过程有点类似于“插网线”,一头插在ns1,另一头插在ns2上,两个ns之间就可以通信了,如下图:
接下来我们一起体验下打通ns1和ns2网络的过程:
创建一个veth pair,其一端名为veth1,对端为veth2:
可以看到,通过ip link list查询时多了两个网络接口。接下来把veth1绑定到ns1中,转移之后,就只能到ns1里面才能看到了:
同理,把veth2移到ns2中:
分配ip地址:
测试连通性:
这里无法ping通是因为veth设备状态为DOWN,表示还未启动。先启动它们:
再次测试:
补充,veth pair对端查找:
03Bridge
通过veth pair,我们可以让两个network namespace相互访问。但有个问题,假如存在10个network namespace,仅通过veth pair就会非常麻烦。是否有一种类似交换机的虚拟设备呢?这就是本节的主题:Bridge(网桥)。
Bridge是一种虚拟交换机,有着和物理交换机相同的功能,例如二层交换,MAC地址学习等。我们可以把veth pair、tun/tap等设备连接到网桥上,就像是把设备连接到物理交换机一样,ns之间就可以相互访问了。
我们在启动docker的时候,docker会创建一个docker0网桥。通过veth pair将各个容器(network namespace)接入docker0来打通容器网络。(ps:docker有多种网络模式,这里指默认的bridge模式)
接下来,我们通过命令行来实现一下上图的网络结构,首先创建bridge(因为docker0已被占用,用br0替代):
创建3个ns
创建veth pairs
将vethx移到ns中
启动lo、veth设备,分配ip
将veth的另一端挂载到网桥上,并启动
启动网桥
测试网络连通性
补充:docker会把vethX设备名改成eth0,就像是物理网卡一样
04Overlay
目前为止,我们通过veth pair + bridge的方式,解决了单节点容器网络问题,这也是docker网络的原理。但是,一台主机的docker0与其它主机上的docker0是完全没有关系的。如何解决跨主机通信呢?
我们需要一个能够把所有容器连通起来的网络,这张网络的名字大家应该比较熟悉,就是overlay network。
Overlay网络是建立在一个实际的物理网络(Underlay网络)之上的虚拟网络。这句话怎么理解?
比如说,两台主机之间可以通过协议栈走tcp/udp通信(underlay,这是前提)。tcp/udp之上是可以封装其它协议的,如果封装了ip协议,那么可以说这个overlay是虚拟三层网络;如果封装了数据链路协议,那么这个overlay网络就是虚拟二层网络。
参考一张vxlan抓包图:
另外,对于ns中的进程来说,它们其实不会感知到自己是走的是overlay还是underlay:
pod1直接通过10.0.0.2与pod2访问,并且数据包的转换是在发送之后、接收之前,所以pod是无感知的。
上图中提到的装置是什么?Linux有现成的吗?
有,就是我们经常听到的隧道。接下来对两种主流隧道技术linux tunnel和linux vxlan做简单介绍。
05Tunnel
Linux 原生支持多种三层隧道:ipip | gre | sit | isatap | vti
- ipip:即IPv4 in IPv4,在IPv4报文的基础上封装一个IPv4报文;
- GRE:即通用路由封装(Generic Routing Encapsulation),定义了在任意一种网络层协议上封装其他任意一种网络层协议的机制,适用于IPv4和IPv6;
- sit:和ipip类似,不同的是sit用IPv4报文封装IPv6报文,即IPv6 over IPv4;
- ISATAP:即站内自动隧道寻址协议(Intra-Site Automatic Tunnel Addressing Protocol),与sit类似,也用于IPv6的隧道封装;
- VTI:即虚拟隧道接口(Virtual Tunnel Interface),是思科提出的一种IPSec隧道技术。
接下来尝试一下节点之间通过ipip隧道通信:
ps:使用macox系统通过parallels的两个虚机进行ipip实验时,发现使用”共享网络模式“无法ping通,改为”默认适配器“后可以,原因未知。
ip tuntap和ip tunnel?
关于ip tunnel中的tun是不是ip tuntap中的tun,在多个资料中的解释有些冲突(可能是我理解不对)。仅从使用层面,我个人感觉tuntap和tunnel没有太大关联。
ip tuntap中的tun,我的理解是需要搭配一个用户开发的程序(进程)使用的。当数据包发往tun设备时,程序会接收到数据包,具体数据包怎么处理,由程序决定。即,通过编码决定发往谁、怎么发。flannel的UDP模式是基于tun的,tun的缺点在于多次用户态和内核态之间的数据拷贝,导致性能较差。
06VxLAN
VxLAN(Virtual eXtensible LAN,虚拟可扩展的局域网),是Linux内核自带的一种虚拟化隧道通信技术,它可以通过三层的网络搭建虚拟的二层网络。为了能够在二层网络上打通“隧道”,VXLAN 会在宿主机上设置一个特殊的网络设备作为“隧道”的两端,这个设备就叫作 VTEP(VXLAN Tunnel End Point,虚拟隧道端点),它的作用是对Ethernet frames进行封包和解包。VxLAN将 L2 的以太网帧(Ethernet frames)封装成 L4 的 UDP 数据包,然后在 L3 的网络中传输,效果就像 L2 的以太网帧在一个广播域中传输一样,实际上是跨越了 L3 网络,但却感知不到 L3 网络的存在。
点对点VxLAN实验:
VXLAN + Bridge实验:
参考资料
- 《Kubernetes权威指南》
- 《深入剖析Kubernetes》
- 《Kubernetes网络权威指南》
- https://coolshell.cn/articles/17029.html
- https://icloudnative.io/posts/vxlan-linux/
- https://zhuanlan.zhihu.com/p/293667316
- https://www.cnblogs.com/bakari/p/10564347.html
- https://typesafe.cn/categories/
-https://space.bilibili.com/646178510/channel/collectiondetail?sid=375141
- https://lwn.net/Articles/580893/
文章转载自公众号:k8s技术圈
