为容器启用net.ipv4.ip_forward

Cal*_*der 2 kubernetes

是否可以net.ipv4.ip_forward在容器的网络命名空间上启用?


手册

从主机,我可以手动启用它

sudo nsenter -t \
    $(docker inspect --format '{{.State.Pid}}' $CONTAINER_NAME) \
    -n sysctl -w net.ipv4.ip_forward=1
Run Code Online (Sandbox Code Playgroud)

并确认转发开始在容器内工作.

有没有办法在避免特权容器的同时自动执行此操作?

Jan*_*art 7

如果有一些sysctl参数是; net.* 是命名空间,因此net.ipv4.ip_forward可以按Pod(每个容器)启用.

按照Kubernetes群集指南中的使用Sysctls了解详细信息和陷阱.

更长的答案

虽然net 是命名空间,但并非所有sysctl变量都可以在命名空间中设置.有些人只是等待"namespacify"补丁,但其他补丁可能永远不会得到实施.在具体示例中,net.ipv4可以浏览include/net/netns/ipv4.h以查看当前支持的内容.这种支持当然取决于实际的内核版本.

如果你想"凭经验"验证sysctl(实际的内核工具,而不是工具)是否支持特定的变量,你可以做这样的事情(以root身份):

# cat /proc/sys/net/ipv4/ip_forward
1
# unshare --net sysctl -w net.ipv4.ip_forward=0
net.ipv4.ip_forward = 0
# cat /proc/sys/net/ipv4/ip_forward
1
Run Code Online (Sandbox Code Playgroud)

如您所见,可以设置在新命名空间中运行的sysctl(工具)net.ipv4.ip_forward=0; 另外它不会影响父命名空间.

无法在命名空间中设置的变量示例(目前不支持它):

# cat /proc/sys/net/ipv4/icmp_msgs_burst
50
# unshare --net sysctl -w net.ipv4.icmp_msgs_burst=42
sysctl: cannot stat /proc/sys/net/ipv4/icmp_msgs_burst: No such file or directory
Run Code Online (Sandbox Code Playgroud)

未命名空间的变量的示例是vm.nr_hugepages.此变量存在于名称空间中,但vm子系统本身不是名称空间(设置此变量将影响所有进程):

# sysctl vm.nr_hugepages
vm.nr_hugepages = 0
# unshare sysctl vm.nr_hugepages=1
vm.nr_hugepages = 1
# sysctl vm.nr_hugepages
vm.nr_hugepages = 1
Run Code Online (Sandbox Code Playgroud)