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