Docker swarm 阻止节点参与入口网络

Docker swarm prevent node from participating in ingress network

这可能是一个非常微不足道的问题,但我在文档中找不到任何关于此类功能的信息。我们从 routing mesh documentation:

中得知

All nodes participate in an ingress routing mesh. The routing mesh enables each node in the swarm to accept connections on published ports for any service running in the swarm, even if there’s no task running on the node. The routing mesh routes all incoming requests to published ports on available nodes to an active container.

但是,我不希望某些节点参与路由网格,但我仍然希望它们参与托管服务。


我试图实现的配置看起来有点像这样:

我有一个服务,hello-world,有三个实例,每个节点一个。

在这个例子中,我希望只有 node-1node-2 参与外部化 ingress 网络。但是,当我访问 10.0.0.3 时,它仍然暴露端口 80443,因为它仍然必须有 ingress 网络才能 运行容器 hello-world,我希望情况并非如此。

本质上,我希望能够 运行 为在 10.0.0.3 上托管端口 80443 的服务提供容器,而无需访问它通过在网络浏览器中访问 10.0.0.3。有没有办法配置这个?即使节点上没有容器 运行ning,它仍会将流量转发到 运行ning.

的容器

谢谢!

对您的具体问题的简短回答是否定的,没有支持的方法来选择性地 enable/disable 特定节点上特定覆盖网络的入口网络。

但是根据您的要求,仅将特定节点用于传入流量的预期模型是控制哪些节点接收流量,而不是关闭特定节点上的端口...

在一个典型的 6 节点集群中,您将管理器分离出来,以在与 DMZ 不同的子网中受到保护(例如,工作人员后面的子网)。您将使用放置约束来确保您的应用程序工作负载仅分配给工作节点,并且这些节点是 VLAN/Security Group/etc 中唯一的节点。可从 user/client 流量访问。

Swarm 的大多数产品设计建议保护您的管理器(管理容器的编排和调度、存储机密等)免受外部流量的影响。

为什么不把你的代理放在 client-accessible 网络中的工作节点上,让这些节点成为 DMZ/external LB 中唯一的节点。

请注意,如果您只允许 firewall/LB 访问某些节点(例如只有 3 个工作人员),那么其他不接收外部传入流量的节点实际上不会使用它们的入口网络,从而实现您想要的结果。接收外部连接的节点使用其 VIP 将流量直接路由到运行已发布容器端口的节点。