是否可以启用 net.ipv4.ip_forward
在容器的网络命名空间上?
手册
从主机,我可以手动启用它
sudo nsenter -t \
$(docker inspect --format '{{.State.Pid}}' $CONTAINER_NAME) \
-n sysctl -w net.ipv4.ip_forward=1
并确认转发在容器内开始工作。
有没有办法在避免特权容器的同时自动执行此操作?
最佳答案
在某些 sysctl 参数的情况下是; net.*
是命名空间 ,所以 net.ipv4.ip_forward
可以为每个 Pod(每个容器)启用。
关注 Using Sysctls in a Kubernetes Cluster有关详细信息和陷阱的指南。
更长的答案
虽然 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
如您所见,在新命名空间中运行的 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
一个没有命名空间的变量的例子是
vm.nr_hugepages
.该变量存在于命名空间中,但 vm
子系统本身是 not namespaced (设置此变量将影响所有进程):# 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
关于kubernetes - 为容器启用 net.ipv4.ip_forward,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49961956/