极客时间《云原生训练营》学习笔记。

Namespace

  • Linux Namespace 是一种 Linux Kernel 提供的资源隔离方案:
  • 系统可以为进程分配不同的 Namespace;
  • 并保证不同的 Namespace 资源独立分配、进程彼此隔离,即不同的 Namespace 下的进程互不干扰 。

Linux 内核代码中 Namespace 的实现

  • 进程数据结构
1
2
3
4
5
struct task_struct {
...
/* namespaces */
struct nsproxy *nsproxy;
...
  • Namespace 数据结构
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 |

image-20211206224354295

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
unshare -fn sleep 60
查看进程信息
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