JohnShen's Blog.

容器实战 - 网络相关

字数统计: 416阅读时长: 1 min
2021/09/13 Share

Network Namespace

隔离的网络资源包括:

  1. 网络设备,如eth0, lo 这种网络设备;
  2. ipv4和ipv6协议栈,IP层及上面的TCP/UDP协议栈也是每个Namespace独立工作的。
  3. IP路由表,可通过ip route查看。
  4. 防火墙规则,每个Namespace可以独立配置iptables规则。
  5. 网络状态信息。可从 /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
2
3
4
# docker run -d --name net_para --sysctl net.ipv4.tcp_keepalive_time=600 centos:8.1.1911 sleep 3600
7efed88a44d64400ff5a6d38fdcc73f2a74a7bdc3dbc7161060f2f7d0be170d1
# docker exec net_para cat /proc/sys/net/ipv4/tcp_keepalive_time
600
CATALOG
  1. 1. Network Namespace