hello云胜

技术与生活

0%

network namespace

理论

我们都知道容器化技术的两大柱石是linux的namespace和cgroup两大基础能力。

namespace提供资源隔离能力,cgroup提供资源限制的能力。

linux提供6种不同的ns类型,对不同的资源进行隔离。分别是

  • Mount: 隔离文件系统挂载点
  • UTS: 隔离主机名和域名信息
  • IPC: 隔离进程间通信
  • PID: 隔离进程的ID
  • Network: 隔离网络资源
  • User: 隔离用户和用户组的ID

现在我们重点关注network namespace。这是整个k8s网络的基础的基础。

因为有了network的隔离,所以我们进到容器里,感觉就是每个容器好像都有自己的网络设备(虚拟的),每个容器都可以随意监听自己的端口而不用担心端口冲突。

实践

network namespace相关操作命令是在ip netns 命令下。

可以先看一下help

1
2
3
4
5
6
7
8
9
10
11
# ip netns help
Usage: ip netns list
ip netns add NAME
ip netns set NAME NETNSID
ip [-all] netns delete [NAME]
ip netns identify [PID]
ip netns pids NAME
ip [-all] netns exec [NAME] cmd ...
ip netns monitor
ip netns list-id

如果你不能执行ip netns。报这个粗

1
Object "netns" is unknown, try "ip help".

是因为你的linux内核版本不支持。我一开始用的centos6.5不行。然后换了个centos 7的就可以了。

CentOS6.5以前,内核不支持网络namespace,需要升级内核和iproute。升级到6.7以后的都可以。

创建一个network namespace

1
ip netns add mynet

查看一下

1
2
# ip netns list
mynet

在network ns创建后,会在/var/run/netns/目录下创建一个同名的挂载点

1
2
3
]# ls /var/run/netns/ -l
总用量 0
-r--r--r-- 1 root root 0 10月 8 09:56 mynet

使用ip netns exec进入network ns执行操作

查看网卡配置

1
2
3
# ip netns exec mynet ip link list
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

目前没有任何配置,只有一个lo 回环设备。

状态还是DOWN的。因此现在ping 本地也是不通的。

1
2
# ip netns exec mynet ping 127.0.0.1
connect: Network is unreachable

开启网络设备

进入ns,使用ip link set dev 命令将lo设备状态置为UP

1
ip netns exec mynet ip link set dev lo up

image-20231008102110586

现在就可以ping通了。

现在我们还是只能ping通本地,还无法和外界通信。

要实现两个ns间互通的目标,需要借助veth peer

关于veth peer我们下节再讲,因为内容会比较多。然后继续我们的实验。