我真的很喜欢 docker 堆栈部署的人体工程学原理,通过 update_config > order > start-first 获得零停机部署的简单性。但是,这种设置的行为是该服务会将请求转发到连接到入口网络的任何主机中的容器。从他们的文档来看,这就是机制:
我已经相当广泛地阅读了文档,但找不到任何线索来回答这个问题:是否可以仅将请求转发到与集群负载均衡器在同一主机上运行的容器?我想要这个,因为主机已经位于带有运行状况检查的网络服务器/负载平衡器(Caddy)后面,并且不需要再次负载平衡,因为它会增加额外的(不必要的)延迟。
Docker 群负载均衡在两个级别上完成:有一个入口负载均衡器,用于处理传入群的流量,以及一个虚拟 IP 负载均衡器,用于处理服务到服务流量。
两者都可以被绕过:
如果您有自己的入口负载均衡器,请将副本部署到接收外部流量的每个入口节点上,并在发布的端口上使用“主机”模式。
例如
service:
ingress:
image: nginx:latest
ports:
- publish: 80
target: 8080
mode: host
接下来,docker为所有服务创建一个基于虚拟ip的负载均衡器,服务名称为dns别名。如果您有一个名为“web”的服务,那么“web”就会解析为该 VIP。 Docker swarm 还会直接向每个服务容器注册一个 dns 别名
tasks.{service-name}
,它是带有 A 记录的 DNSRR。 Traefik 和 Caddy 应自动直接使用各个任务 IP,其他支持 DNSRR 作为服务发现的代理应配置为例如http://task.web:8080
并将绕过docker自己的负载均衡器。