【注意】最后更新于 December 1, 2021,文中内容可能已过时,请谨慎使用。
极客时间《云原生训练营》学习笔记。
Namespace
- Linux Namespace 是一种 Linux Kernel 提供的资源隔离方案:
- 系统可以为进程分配不同的 Namespace;
- 并保证不同的 Namespace 资源独立分配、进程彼此隔离,即不同的 Namespace 下的进程互不干扰 。
Linux 内核代码中 Namespace 的实现
1
2
3
4
5
| struct task_struct {
...
/* namespaces */
struct nsproxy *nsproxy;
...
|
1
2
3
4
5
6
7
8
9
| struct nsproxy
{ atomic_t count;
struct uts_namespace *uts_ns;
struct ipc_namespace *ipc_ns;
struct mnt_namespace *mnt_ns;
struct pid_namespace
*pid_ns_for_children;
struct net *net_ns;
}
|
## 隔离性 – Linux Namespace
| Namespace 类型 | 隔离资源 | Kernel 版本 |
| ————– | ——————————– | ———– |
| IPC | System V IPC 和 POSIX 消息队列 | 2.6.19 |
| Network | 网络设备、网络协议栈、网络端口等 | 2.6.29 |
| PID | 进程 | 2.6.14 |
| Mount | 挂载点 | 2.4.19 |
| UTS | 主机名和域名 | 2.6.19 |
| USR | 用户和用户组 | 3.8 |

Pid namespace
- 不同用户的进程就是通过 Pid namespace 隔离开的,且不同 namespace 中可以有相同 Pid。
- 有了 Pid namespace, 每个 namespace 中的 Pid 能够相互隔离。
net namespace
1
2
3
| - 网络隔离是通过 net namespace 实现的, 每个 net namespace 有独立的 network devices, IP addresses, IP routing tables, /proc/net 目录。
- Docker 默认采用 veth 的方式将 container 中的虚拟网卡同 host 上的一个 docker bridge: docker0 连接
在一起。
|
ipc namespace
1
2
3
| - Container 中进程交互还是采用 linux 常见的进程间交互方法 (interprocess communication – IPC), 包括常见的信号量、消息队列和共享内存。
- container 的进程间交互实际上还是 host上 具有相同 Pid namespace 中的进程间交互,因此需要在 IPC
资源申请时加入 namespace 信息 - 每个 IPC 资源有一个唯一的 32 位 ID。
|
mnt namespace
1
2
| mnt namespace 允许不同 namespace 的进程看到的文件结构不同,这样每个 namespace 中的进程所看
到的文件目录就被隔离开了。
|
uts namespace
1
| UTS(“UNIX Time-sharing System”) namespace允许每个 container 拥有独立的 hostname 和 domain name, 使其在网络上可以被视作一个独立的节点而非 Host 上的一个进程。
|
user namespace
1
| 每个 container 可以有不同的 user 和 group id, 也就是说可以在 container 内部用 container 内部的用户执行程序而非 Host 上的用户。
|
关于 namespace 的常用操作
1
2
3
4
5
6
| #查看当前系统的 namespace:
lsns –t <type>
#查看某进程的 namespace:
ls -la /proc/<pid>/ns/
#进入某 namespace 运行命令:
nsenter -t <pid> -n ip addr
|
Namespace 练习
在新 network namespace 执行 sleep 指令:
查看进程信息
1
2
3
| ps -ef|grep sleep
root 32882 4935 0 10:00 pts/0 00:00:00 unshare -fn sleep 60
root 32883 32882 0 10:00 pts/0 00:00:00 sleep 60
|
查看网络 Namespace
1
2
3
| lsns -t net
4026532508 net 2 32882 root unassigned unshare
|
进入改进程所在 Namespace 查看网络配置,与主机不一致
1
2
3
4
| nsenter -t 32882 -n ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
|