Kubernetes网络原理剖析

如果说Kubernetes这座房子是由一个个Pod堆积而成,那Kubernetes的网络就是给这座房子注入了灵魂,通过它可以驱动这座房子里的所有Pod,让其保持强大的灵活性,从而保证Kubernetes这座房子不会倒下,为了方便描述,下面统一叫k8s。

我们知道Pod是k8s的最小调度单位,而容器就是k8s里一个一个的进程,而这些进程之间又免不了要进行通信,这就是k8s网络要解决的问题。

多数情况下,我们讲到k8s的网络都不自觉会把容器考虑进来,这是因为到目前为止k8s主要还是以Docker为主的容器来管理进程。但今天我们先忘掉容器,从Linux本身提供的能力开始来一点一点搭建一个虚拟的网络世界,通过这个过程可以更深刻的理解k8s的网络底层逻辑。

下面的操作对环境没有特别的要求,但有一个前提是必须使用Linux系统,ubuntu或者CentOS都可以。主要使用两个工具集,一个是ip工具集,另一个是brctl,ip工具集一般都默认安装了,brctl可以通过apt install -y bridge-utils来安装。

首先,我们要在同一台机器上创建两个虚拟的空间,这两个空间的网络是相互隔离的,有自己的网络协议栈、网卡以及iptables,大概像下面这样:

图1-1 Network Namespace

我们思考一下,linux有什么工具可以实现这样的功能呢?答案是Network Namespace,使用ip netns就可以对Network Namespace进行管理,这里我们使用下面的命令创建两个Network Namespace。

ip netns add nts0ip netns add nts1

通过上面的两条命令我们就创建好了两个网络空间nts0和nts1,nts0、nts1和宿主机之间是相互隔离的,为了说明这个问题,我们接着往下。

上面我们创建的两个Network Namespace想象成两台电脑,电脑与电脑之间怎么实现通信呢?没错,路由器就是这样的设备,可以收发二、三层数据包实现两台电脑之间的通信,在Linux中也有一个这样的虚拟设备,叫tun/tap设备,接下来我们创建两个tun设备tap0和tap1,命令如下:

ip tuntap add dev tap0 mode tapip tuntap add dev tap1 mode tap

接下来就可以将它们安装到Network Namespace里了,命令如下:

ip link tap0 netns nts0ip link tap1 netns nts1

上面将tap0安装到了nts0,将tap1安装到了nts1中,我们可以看一下tun设备的状态,如下:

可以看到,tap0还没有分配IP地址,和lo一样,状态都是DOWN。所以我们要给tun设备分配IP地址,并将状态设置成UP,命令如下:

ip netns exec nts0 ip link set lo upip netns exec nts0 ip link set tap0 upip netns exec nts0 ip addr add 10.0.0.1/24 dev tap0
ip netns exec nts1 ip link set lo upip netns exec nts1 ip link set tap1 upip netns exec nts1 ip addr add 10.0.0.2/24 dev tap1

上面我们给tap0分配的ip地址是10.0.0.1/24,tap1分配的ip地址是10.0.0.2/24,这样,就成功创建了两个虚拟的网络空间,每个空间里都有一个tun网络设备。然后我们来测试一下隔离性,首先在宿主机上ping一下看是不是通的。命令如下:

root@ubuntu# ping 10.0.0.2ping: connect: Network is unreachable

然后在nts0中去ping nts1中的tap1设备

root@ubuntu# ip netns exec nts0 ping 10.0.0.2ping: connect: Network is unreachable

 可以看到,相互之间是不通的。这说明宿主机、nts0、nts1之间是相互隔离的。

为了避免因为我们配置错误导致的不连通,我们可以在Network Namespace里ping一下自己看网络设备是否正常在工作,如下:

可以看到,网络设备是在正常工作的,说明我们的配置没有问题。

现在,我们要将这两个网络空间给连起来,让他们之间可以正常通信,Linux中有一个虚拟的网络设备叫做Veth Pair,它们总是成对出现,一端连接到网络协议栈,另一端彼此相连,数据发送到一端可以直接出现在另一端,你可以把它想象成一条网线。下面我们来创建一对Veth Pair, 如下:

ip link add veth0 type veth peer name veth1

veth0和veth1就是我们创建的一对Veth Pair,前面我们说Veth Pair可以成对出现,发到一端的数据可以直接出现在另一端,那是不是只要将veth0和veth1分别插到两个Network Namespace里就可以将两个网络空间给连接起来呢?我们来试一下,将Veth Pair的一端veth0插到nts0,veth1插到nts1上,命令如下:

ip link set veth0 netns nts0ip link set veth1 netns nts1ip netns exec nts0 ip link set veth0 upip netns exec nts1 ip link set veth0 up

这个时候网络结构大概是下面这样的,如下图:

图1-2 Veth Pair

然后我们在nts0里去ping nts1,如下:

root@ubuntu# ip netns exec nts0 ping 10.0.0.2ping: connect: Network is unreachable

咦,不好使啊,怎么还是ping不通呢?别着急,我们来看一下nts0的路由信息:

可以看到,这是由于我们前面做隔离试验的时候所有请求都会发送到tap0设备,没有走veth0。所以,我们只需要将路由指向Veth Pair应该就可以了,如下:

ip netns exec nts0 ip route change 10.0.0.0/24 via 0.0.0.0 dev veth0ip netns exec nts1 ip rou
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值