如何从部署在集群中的容器内部访问主机网络命名空间?

如何从部署在集群中的容器内部访问主机网络命名空间?

我想在我的 Swarm 上全局部署一个容器,将一些 iptables 规则应用于主机的网络。具体来说,我想向一些覆盖网络添加规则,这些规则似乎位于每个覆盖网络的唯一命名空间中。

这是我的docker-compose:

version: '3.8'

services:
  test:
    image: docker
    volumes:
     - /var/run/docker.sock:/var/run/docker.sock
     - /var/run/docker/netns:/var/run/netns
    cap_add:
      - NET_ADMIN
      - SYS_ADMIN
    networks:
      host_netns:
    deploy:
      mode: global
    command: sleep infinity

networks:
  host_netns:
   external:
     name: "host"

如果我执行到容器中并安装 iproute2,我可以看到网络命名空间:

/ # ip netns ls
default
1-n57c2x71vc (id: 0)
ingress_sbox (id: 1)

但是,如果我尝试运行iptables,我会收到安装错误:

/ # ip netns exec 1-n57c2x71vc iptables -L
"mount --make-rslave /" failed: Permission denied

我被难住了。为什么有些东西试图将我的根重新挂载为从属?

值得一提的是,如果我做一个简单的iptables -L,我确实可以正确地看到我的主机的所有 iptables 规则。

答案1

似乎一种解决方法是使用nsenter -n /var/run/netns/<namespace> -- iptables而不是ip netns execnsenter只设置进程命名空间,它将在只有上述两个大写字母添加的容器中工作。 似乎在和ip netns exec中对内容进行了一些更花哨的重新安装,以便进程在常规位置找到网络命名空间链接。无论出于什么原因,如果没有,安装是不可能的。我确实尝试过卸载所有安装,但这没有帮助。/etc/sys--privilegedro

相关内容