Linux Namespace 并不神秘,它本质就是“让一组进程看到不同的世界”。而你真正需要掌握的,不是概念,而是这 5 个命令:unshare / nsenter / lsns / ip netns / /proc
掌握它们,你就能:
手动“造一个容器”
进入任意 Pod 内部世界
Debug 90% 的容器网络问题
Linux Namespace 做的事情很简单:
👉 让不同进程看到不同的系统视图
比如:
👉 核心一句话:
Namespace = 不同进程看到的“世界版本”不同
unshare -m -u -i -n -p -f --mount-proc bash你进入之后可以试:
ps auxhostnameip addr
你会发现:
PID 从 1 开始
网络是隔离的
hostname 可以独立修改
👉 这就是容器的本质雏形
用 strace 看:
strace -f -e clone unshare -p bash你会看到:
clone(CLONE_NEWPID | CLONE_NEWNS | ...)👉 关键点:
Namespace 本质就是 clone() 时加 flag
nsenter -t <pid> -m -u -i -n -p bash👉 参数含义:
-t:目标进程
-n:网络
-m:挂载
-p:PID
crictl pscrictl inspect <container-id> | grep pidnsenter -t <pid> -n bash👉 你现在已经“进入 Pod 内部网络世界”
ls -l /proc/<pid>/ns输出:
net -> net:[4026531993]mnt -> mnt:[4026531840]
👉 关键认知:
namespace = 内核对象
[4026531993] = namespace ID
readlink /proc/123/ns/netreadlink /proc/456/ns/net
👉 一样 = 在同一个网络空间
lsns输出:NS TYPE NPROCS PID COMMAND4026531836 pid 1 1 /sbin/init
👉 你可以看到:
所有 namespace
关联进程
类型
ip netns add ns1ip netns exec ns1 baship netns delete ns1ip link add veth0 type veth peer name veth1👉 这就是:
Docker 网络
Kubernetes CNI
的基础构建块
一个 Kubernetes Pod 的进程树:
pstree -p典型结构:
├─containerd-shim(1175)─┬─etcd(2269)│ ││ ├─pause(1282)
👉 关键点:pause 容器 = namespace 持有者
业务容器 = 共享 namespace
crictl pscrictl inspect <id> | grep pidnsenter -t <pid> -n bash
readlink /proc/<pid1>/ns/netreadlink /proc/<pid2>/ns/net
unshare -p -m -n -f --mount-proc bash👉 你已经实现了:
PID 隔离
网络隔离
mount 隔离
unshare # 创建 namespacensenter # 进入 namespacelsns # 查看 namespaceip netns # 管理网络/proc # 真相来源
容器技术的本质,从来不是 Docker、containerd 或 Kubernetes。而是 Linux 内核提供的 Namespace + Cgroup + RootFS。