如何阻止Docker Swarm节点参与Ingress网络?
所有节点都会参与Ingress路由网格。该路由网格允许Swarm中的每个节点接收Swarm内任意服务已发布端口的连接请求,即便该节点上没有运行任何任务。路由网格会将可用节点上已发布端口的所有传入请求路由至活动容器。
嘿,我太懂这种翻遍官方文档却找不到实操细节的憋屈了——上面这段基础说明确实没覆盖很多人实际用的时候会遇到的疑问,我来把那些“然而”背后可能想问的点捋清楚:
底层到底怎么转的流量?
路由网格是靠Linux的IPVS(IP Virtual Server)技术实现的,Swarm会在集群的每个节点上自动维护一套IPVS规则表。当外部请求打到节点的服务发布端口时,IPVS会按照默认的轮询策略(你也可以手动修改),把请求转发到真正运行该服务任务的节点上的容器端口,全程不需要手动配置反向代理。有没有路由网格不生效的坑?
必须提这个:如果你的服务用了host网络模式发布(也就是docker service create --network host),路由网格直接失效!因为host模式下容器直接用节点的网络栈,Swarm没法介入流量转发,只有运行了该服务任务的节点才能响应对应端口的请求。另外,如果多个服务尝试发布同一个主机端口,Swarm会直接报错,得确保每个发布的端口在集群里唯一,或者用published=0让Docker自动分配随机端口。怎么快速验证路由网格在工作?
找一个没有运行目标服务任务的节点,用curl或者telnet访问该节点的服务发布端口就行。比如你的服务发布了8080端口,节点IP是192.168.1.10(这个节点没跑该服务),执行curl http://192.168.1.10:8080,如果能拿到服务的正常响应,就说明路由网格在乖乖干活。集群内部的流量也走路由网格吗?
是的!Swarm内部的服务之间通过服务名访问时,同样会经过路由网格的负载均衡,哪怕两个服务不在同一个节点上。比如你有个web服务和db服务,web服务直接用db:5432访问,流量会自动被路由到运行db任务的节点上,不用手动写IP。
内容的提问来源于stack exchange,提问作者Brooke Holmes

