为容器启用net.ipv4.ip_forward

时间:2018-04-22 02:27:21

标签: kubernetes

是否可以在容器的网络命名空间上启用sudo nsenter -t \ $(docker inspect --format '{{.State.Pid}}' $CONTAINER_NAME) \ -n sysctl -w net.ipv4.ip_forward=1

手册

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

{{1}}

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

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

1 个答案:

答案 0 :(得分:6)

如果某些sysctl参数是; for (int i = 0; i < board.size(); i++) { //this is all one line: tiles.get(i).setIcon(resizeIcon(displayTile(board.get(i), tiles.get(i).getHeight(), tiles.get(i).getHeight())); } //this resizes the ImageIcon and returns the risized icon: public static ImageIcon resizeIcon(ImageIcon i, int x, int y) { Image image = i.getImage(); Image newimg = image.getScaledInstance(x, y, java.awt.Image.SCALE_SMOOTH); i = new ImageIcon(newimg); return i; } //this returns an ImageIcon based off of the number that is put in: public static ImageIcon displayTile(int num) { if (num != 0) { ImageIcon i = new ImageIcon("src/resources/" + num + ".png"); return i; } ImageIcon i = new ImageIcon("src/resources/0.png"); return i; } 是命名空间,因此每个Pod(每个容器)都可以启用net.*

按照Using Sysctls in a Kubernetes Cluster指南了解详细信息和问题。

更长的答案

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

如果您想要经验性地&#34;验证 sysctl (实际的内核工具,而不是工具)是否支持特定变量,你可以做这样的事情(以root身份):

net.ipv4

如您所见,在新命名空间中运行的 sysctl (工具)可以设置# 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 ;另外它不影响父命名空间。

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

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 。此变量存在于名称空间中,但vm.nr_hugepages子系统本身为not namespaced(设置此变量将影响所有进程):

vm