Network Namespace
隔离的网络资源包括:
- 网络设备,如eth0, lo 这种网络设备;
- ipv4和ipv6协议栈,IP层及上面的TCP/UDP协议栈也是每个Namespace独立工作的。
- IP路由表,可通过
ip route
查看。 - 防火墙规则,每个Namespace可以独立配置iptables规则。
- 网络状态信息。可从 /proc/net 和 /sys/class/net 里得到。
lsns -t net
这个命令来查看系统里已有的 Network Namespace。当然,lsns也可以用来查看其它 Namespace。
容器里 Network Namespace 的网络参数并不是完全从宿主机 Host Namespace 里继承的,也不是完全在新的 Network Namespace 建立的时候重新初始化的。容器中”/proc/sys/“是只读 mount 的,那么在容器里是不能修改”/proc/sys/net/“下面的任何参数了。
为什么“/proc/sys/” 在容器里是只读 mount 呢? 这是因为 runC 当初出于安全的考虑,把容器中所有 /proc 和 /sys 相关的目录缺省都做了 read-only mount 的处理。
网络参数修改的“正确时机”:修改 Network Namespace 里的网络参数,要选择容器刚刚启动,而容器中的应用程序还没启动之前进行。
runC 也在对 /proc/sys 目录做 read-only mount 之前,预留出了修改接口,就是用来修改容器里 “/proc/sys”下参数的,同样也是 sysctl 的参数。Docker 的–sysctl或者 Kubernetes 里的allowed-unsafe-sysctls特性也都利用了 runC 的 sysctl 参数修改接口,允许容器在启动时修改容器 Namespace 里的参数。
1 | # docker run -d --name net_para --sysctl net.ipv4.tcp_keepalive_time=600 centos:8.1.1911 sleep 3600 |