【发布时间】:2020-11-17 19:59:26
【问题描述】:
我在一个机器集群中有一个 docker swarm,我的用例是部署几个需要连接的独立容器,这些容器具有静态 IP 配置,因此我创建了一个覆盖来连接 swarm 的所有节点。我不使用/不想使用任何与 docker SERVICES 相关的东西,也不想在我的 docker swarm 中使用它,这不是一个真实的场景,而是一个测试场景。
问题是当我将容器部署到某个主机时,集群负载均衡器是使用某个随机 IP 地址创建的,我需要它是静态的,因为我无法更改我想要的容器的配置部署。我已经搜索了如何删除此负载均衡器,因为就我而言,它仅用于进入 swarm 服务/容器的外部流量,它们对我的用例没有用处。
一种解决方案是部署一个虚拟容器并检查哪个 IP 分配给每个节点中的 swarm 负载均衡器,然后调整我要部署的容器的配置文件,但这种方法不能很好地扩展,这是一种解决方法的实际问题。当我的容器随机无法开始提供docker: Error response from daemon: attaching to network failed, make sure your network options are correct and check manager logs: context deadline exceeded. 时,我的问题就开始了,我无法确定它发生的原因,然后推断这是因为这些负载均衡器使用了我想在容器中使用的相同 IP 地址。
我的问题是如何静态定义这些负载均衡器的 IP 或为每个节点完全删除它们?感谢您的时间。
Docker Swarm Architecture这是docker inspect network <my-overlay-network>的输出
"Name": "my-network",
"Id": "mo8rcf8ozr05qrnuqh64wamhs",
"Created": "2020-11-16T01:59:20.100290182Z",
"Scope": "swarm",
"Driver": "overlay",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "10.0.1.0/24",
"Gateway": "10.0.1.1"
}
]
},
"Internal": false,
"Attachable": true,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"95b8e9c3ab5f9870987c4077ce264b96a810dad573a7fa2de485dd6f4b50f307": {
"Name": "unruffled_haslett",
"EndpointID": "422d83efd66ae36dd10ab0b1eb1a70763ccef6789352b06b8eb3ec8bca48410f",
"MacAddress": "02:42:0a:00:01:0c",
"IPv4Address": "10.0.1.12/24",
"IPv6Address": ""
},
"lb-my-network": {
"Name": "my-network-endpoint",
"EndpointID": "192ffaa13b7d7cfd36c4751f87c3d08dc65e66e97c0a134dfa302f55f77dcef3",
"MacAddress": "02:42:0a:00:01:08",
"IPv4Address": "10.0.1.8/24",
"IPv6Address": ""
}
`
【问题讨论】:
-
问题是当你有独立容器时为什么要使用swarm?当您说要为容器设置静态 IP 时,当复制 swarm SERVICE 并创建多个容器时该怎么办?我只是想说也许使用 docker swarm 是问题所在。最后,我想说主机需要将您拥有的每个静态 IP 地址转发到每个
service的nodeport,然后这变成了iptables问题而不是 docker swarm 问题。 -
感谢您的回复,我不想使用任何与服务相关的东西,也不想在 swarm 中复制它们。我的目标是我有一个机器集群,我需要设置一个测试来运行数百个容器,然后我有一个模块可以在 docker swarm 中注入延迟。它仅适用于 docker swarm。我没有任何已发布的端口或与外部通信相关的任何内容。这就是我使用它的原因,以及其他原因。
-
我了解您不想复制,但 swarm 创建的服务假设您可以工作。此外,当使用 swarm(并且取决于您的配置)将新映像部署到服务时,该服务可能有两个容器在短时间内在线。由于上述所有原因,设置静态 IP 不是一个好主意,我不确定是否可行。
-
为了给你指出不同的方向,你说你没有任何发布的端口,所以我假设 swarm 中的服务相互通信,在这种情况下你为什么不使用 service_name作为主机名而不是设置静态 IP
-
感谢您的帮助,在阅读有关 docker swarm 及其架构的所有文档时,我想出了一种方法来避免我的问题,即我有 100 多个容器在 16 台机器的 swarm 集群中运行.在这些机器中,静态配置意外地与内部负载平衡器 IP 发生碰撞。我的解决方案是使用更宽的子网掩码来避免冲突。尽管不是理想的解决方案,但效果很好。感谢您的宝贵时间!
标签: docker docker-swarm