【问题标题】:Docker Swarm Routing MeshDocker Swarm 路由网格
【发布时间】:2021-10-17 02:28:07
【问题描述】:

假设我在swarm中有2个节点(节点1是manager,node2是worker),使用下面的compose来启动

version: "3.9"
services:
  app1:
    image: app1image
    ports:
      - 8080:8080
    deploy:
      mode: global
  app2:
    image: app2image
    ports:
      - 9080:9080
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints:
          - "node.role==manager"

我的问题是:

  1. 如果我尝试通过 node1 访问 app1,是否可以将我路由到 node2 中的 app1 容器?
  2. 由于 app2 只部署到 node1,如果我尝试通过 node2 的 9080 端口访问它,我可以吗?
  3. 除了 docker 文档引用的端口(用于集群管理通信的 TCP 端口 2377 节点间通信的 TCP 和 UDP 端口 7946 UDP 端口 4789 用于覆盖网络流量)是否还有其他需要打开的端口?就像 app1 想要调用 app2 一样

【问题讨论】:

    标签: docker docker-compose docker-swarm docker-swarm-mode


    【解决方案1】:

    所以,要了解实际发生的情况:

    version: "3.9"
    
    networks:
      default:
        driver: overlay
      ingress:
        external: true
    
    services:
      app1:
        image: app1image
        ports:
          - 8080:5000
        deploy:
          mode: global
        networks:
          - default
    
      app2:
        image: app2image
        ports:
          - 9080:5000
        networks:
          - default
        deploy:
          placement:
            constraints:
              - node.role==manager
    

    在此配置中,我的预期是应用正在侦听 0.0.0.0:5000

    所以,docker 所做的是创建了两个网络:一个入口网络,用于将每个主机上的端口桥接到每个容器:

    node1:8080 node2:8080 将被路由并负载均衡到 app1 容器。 和 node1:9080, nod2:9080 将被路由并负载均衡到 app2 容器。

    服务容器或任务也已附加到 compose 堆栈的隐式默认网络。它是一个覆盖网络或软件定义的网络,因此每个容器在该网络上都有一个与其所在节点无关的 ip。我已经决定两个服务的实际监听端口是端口:5000,所以附加到 {stack}_default 的任何服务都可以使用服务名称和实际端口地址:

    app1:5000 将通过 vip 路由到 app1 实例的负载均衡流量,app1.tasks 是一个 dnsrr 记录,它将返回每个容器的 ip。

    同样,app2:5000 将路由到管理器节点上的 app2 容器。

    app1 和 app2 dns 名称对于作为堆栈的一部分/附加到 {stack_default} 网络的服务是完全私有的,因此 app1:5000 名称对于 swarm 外部不可用,甚至对于其他堆栈或容器也不可用没有明确附加。

    所以:

    1. 是的。
    2. 是的。
    3. 不,但是:

    如果您ports: 发布端口,则这些端口在 docker 外部,不会通过覆盖网络。如果节点到节点通信需要,您需要添加发布到防火墙的每个端口。例如8080和9080需要开通。

    但是,由于overlay网络允许连接,在物理链路层使用4789,流量进入app1,overlay上的app2 ips(:5000流量)是隧道式的,不需要打开。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-29
      • 2019-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-09
      相关资源
      最近更新 更多