kubernetes - 为容器启用 net.ipv4.ip_forward

标签 kubernetes

是否可以启用 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/

相关文章:

docker - 如何通过特定名称过滤器收集Pod的所有IP

nginx - Kubernetes Nginx Ingress Controller 应该在什么命名空间?

kubernetes - 重启后我的 kubernetes 集群关闭了

kubernetes - Kubernetes从端点REST API获取信息

azure - 如何从 azure kubernetes 集群获取审核日志?稍后我想用它来定义使用audit2rbac工具

kubernetes - 在Windows 7 Enterprise上安装minikube时出错

mysql - 如何使用 Google Container Engine 与 Google Cloud SQL 连接?

kubernetes - 识别Istio内部网格源流量的最优雅方法是哪种?

kubernetes - 无法装入容器,rpc错误:代码= 5 desc…shim-log.json:没有这样的文件或目录

windows - 如何配置Docker CLI从Git-Bash上的minikube访问docker服务器?