将 iptables 转发规则自动更新到 docker 群上对应的 docker 服务端口
Auto-update iptables forwarding rules to the correspondent docker service port on a docker swarm
目标:
有一个类似于脚本的脚本,它将调用 Docker API 自动为新的客户端主机创建一个新服务,然后根据新服务端口更新所有 swarm 节点上的 iptables 转发规则。
问题:
best/robust 跨多个 swarm 节点动态更新 iptables 规则的方法是什么,以便轻松地将新的客户端应用程序添加到新的客户端主机。
场景流程:
- 客户端主机直接连接到端口 80/tcp 上的网络负载平衡器。
- 网络平衡器从客户端主机接收流量并重定向到作为 docker 群节点的池主机。
- Docker swarm 节点只允许端口 80/tcp 上的连接。
- docker swarm 节点上的 IPTables 规则取决于客户端(源 IP)将流量重定向到正确的 docker swarm 服务(tcp 端口)。
场景图片:
场景(示例):
Docker 群主机
- master01 = ip 10.20.30.100
- node01 = ip 10.20.30.161
- node02 = ip 10.20.30.162
Docker Swarm 服务
- app01 = port 8081/tcp (属于client01)
- app02 = port 8082/tcp (属于client02)
客户端主机
- client01 = ip 192.168.10.100
- client02 = ip 192.168.10.200
网络负载均衡器
- 网络-lb = ip 10.10.10.10
- 池 = ip [10.20.30.161, 10.20.30.162]
Swarm 节点上的 IPTables 规则
- iptables -t nat -I PREROUTING -p tcp -s 192.168.10.100 --dport 80 -j REDIRECT --to-port 8081
- iptables -t nat -I PREROUTING -p tcp -s 192.168.10.200 --dport 80 -j REDIRECT --to-port 8082
确定一些可能有助于您决定解决方案的快速项目。这是截至 17.12 版本:
- 听起来你做对了这一部分,但提醒一下,Docker 服务的设计使得该服务的所有副本都是相同的,并且在配置方面不是唯一的。
- Docker 覆盖网络、路由网格和 VIP/DNSRR 功能无法根据客户端(发起)IP 路由流量。
- 鉴于 Swarm 管理大量 iptables 规则,我会担心添加我自己的外部 iptables 编辑解决方案。确保两者一起玩得很好可能会很棘手......但我从未尝试过。
- 最多"Docker way" client-IP-based 连接路由可能使用 Traefik 或 Docker Flow Proxy,它们都是 Swarm-aware 并使用 nginx/haproxy将传入连接的流量路由到 Swarm。他们通常根据请求的 DNS 名称或 URL 路径执行此操作,但他们应该能够根据客户端 IP 做出 Swarm 服务路由决策。
目标: 有一个类似于脚本的脚本,它将调用 Docker API 自动为新的客户端主机创建一个新服务,然后根据新服务端口更新所有 swarm 节点上的 iptables 转发规则。
问题: best/robust 跨多个 swarm 节点动态更新 iptables 规则的方法是什么,以便轻松地将新的客户端应用程序添加到新的客户端主机。
场景流程:
- 客户端主机直接连接到端口 80/tcp 上的网络负载平衡器。
- 网络平衡器从客户端主机接收流量并重定向到作为 docker 群节点的池主机。
- Docker swarm 节点只允许端口 80/tcp 上的连接。
- docker swarm 节点上的 IPTables 规则取决于客户端(源 IP)将流量重定向到正确的 docker swarm 服务(tcp 端口)。
场景图片:
场景(示例):
Docker 群主机
- master01 = ip 10.20.30.100
- node01 = ip 10.20.30.161
- node02 = ip 10.20.30.162
Docker Swarm 服务
- app01 = port 8081/tcp (属于client01)
- app02 = port 8082/tcp (属于client02)
客户端主机
- client01 = ip 192.168.10.100
- client02 = ip 192.168.10.200
网络负载均衡器
- 网络-lb = ip 10.10.10.10
- 池 = ip [10.20.30.161, 10.20.30.162]
Swarm 节点上的 IPTables 规则
- iptables -t nat -I PREROUTING -p tcp -s 192.168.10.100 --dport 80 -j REDIRECT --to-port 8081
- iptables -t nat -I PREROUTING -p tcp -s 192.168.10.200 --dport 80 -j REDIRECT --to-port 8082
确定一些可能有助于您决定解决方案的快速项目。这是截至 17.12 版本:
- 听起来你做对了这一部分,但提醒一下,Docker 服务的设计使得该服务的所有副本都是相同的,并且在配置方面不是唯一的。
- Docker 覆盖网络、路由网格和 VIP/DNSRR 功能无法根据客户端(发起)IP 路由流量。
- 鉴于 Swarm 管理大量 iptables 规则,我会担心添加我自己的外部 iptables 编辑解决方案。确保两者一起玩得很好可能会很棘手......但我从未尝试过。
- 最多"Docker way" client-IP-based 连接路由可能使用 Traefik 或 Docker Flow Proxy,它们都是 Swarm-aware 并使用 nginx/haproxy将传入连接的流量路由到 Swarm。他们通常根据请求的 DNS 名称或 URL 路径执行此操作,但他们应该能够根据客户端 IP 做出 Swarm 服务路由决策。