Docker、Nomad、NetworkManager 和多接口路由

Docker, Nomad, NetworkManager, and multiple interface routing

提问人:Jeff Bilbro 提问时间:10/13/2023 更新时间:11/5/2023 访问量:49

问:

我正在尝试测试通过 Hashicorp Nomad 运行一个 Docker 容器,该容器可以在多个网络上打开端口。一个用例是具有“外部”和“内部”接口的 traefik 负载均衡器。我正在使用 RHEL 8 作为我的容器主机/Nomad 客户端。

重要的是,流量要回到它进入的接口 - 我不会在这个主机或容器之间进行任何转发。由于您只能有一个默认网关,因此我已经做了一些阅读/测试以使其正常工作。使用 NetworkManager,我(据我所知)正确地设置了两个接口,以便它们将响应数据包来自的接口。下面是 ip 规则的输出:

ip rule    
0:  from all lookup local
10: from all iif ens224 lookup 10 proto static
10: from 10.10.40.2 lookup 10 proto static
32766:  from all lookup main
32767:  from all lookup default

我将第二个(非默认)接口设置为查找传入流量的路由表 10。

ip route show table 10
default via 10.10.40.1 dev ens224 proto static metric 101
10.10.40.1 dev ens224 proto static scope link metric 101

ip route show table main
default via 10.10.51.1 dev ens192 proto static metric 100
10.10.40.0/24 dev ens224 proto kernel scope link src 10.10.40.2 metric 101
10.10.51.0/24 dev ens192 proto kernel scope link src 10.10.51.2 metric 100
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1

这很有效 - 例如,如果我直接在主机上运行 httpd(不在容器中),我可以在端口 80 上的 10.10.40.2 或 10.10.51.2 接口上与它通信。但是,如果我通过 Nomad 运行 docker 容器,我只能在 10.10.51.2 接口上与它通信。即使我可以看到它绑定到其他接口并显示在 netstat 中,我也无法在 10.10.40.2 上与它通信。我认为这与我的 ip 规则的设置方式和/或需要使用 iptables 对数据包进行某种标记有关?

这对我来说都是全新的,我感谢任何人可以分享的任何指导。我没有使用 CNI 或任何花哨的东西 - 只是 Nomad 的多界面支持。请让我知道我没有很好地表达什么/你有什么问题。

docker iptables nomad networkmanager nmcli

评论


答:

0赞 KamilCuk 11/5/2023 #1

您将在 nomad 客户端配置中为不同的接口定义两个网络块 - jnternal 和 external。我通常会添加 localhost。请参见 https://developer.hashicorp.com/nomad/docs/configuration/client#host_network-block

然后,在作业组规范中,您将从两个网络请求两个端口。请参见 https://developer.hashicorp.com/nomad/docs/job-specification/network#host-networks

不涉及 iptables 或 networkmanager,您可以删除所有更改,nomad 自行在接口上动态选择端口。需要 Networkmanager 来配置网络。唯一的路由是由 docker 完成的,就像使用 docker run -p 一样。您应该在外部接口上运行防火墙。