Docker、Nomad、NetworkManager 和多接口路由

问题描述 投票:0回答:1

我正在尝试通过 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 接口上与它通信。但是,如果我运行 docker通过 Nomad 容器,我只能在 10.10.51.2 接口上与它通信。尽管我可以看到它绑定到其他接口并显示在 netstat 中,但我无法在 10.10.40.2 上与它对话。我认为这与我的 ip 规则设置方式和/或需要使用 iptables 对数据包进行某种标记有关?

这对我来说都是全新的,我感谢任何人可以分享的任何指导。我没有使用 CNI 或任何花哨的东西 - 只是 Nomad 的多接口支持。请让我知道我没有表达清楚的内容/您有什么问题。

docker iptables nomad networkmanager nmcli
1个回答
0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.