当前位置: 首页 > 知识库问答 >
问题:

Docker Swarm与春靴客户的领事

翟弘
2023-03-14

我目前只有一个manager和一个worker节点。

我使用以下命令创建了一个覆盖网络:

docker network create -d overlay smartdeploy_evo

在manager上,我使用以下名为“docker-compose.Consul.master.yml”的组合文件部署Consul:

version: '3'
services:

  consul:
    image: consul:0.9.3
    hostname: "consul"
    volumes:
      - consul_data:/consul/data
    ports:
      - "8300-8302:8300-8302"
      - "8301-8302:8301-8302/udp"
      - "8400:8400"
      - "8500:8500"
      - "53:8600/udp"
    entrypoint:
      - consul
      - agent
      - -ui
      - -server
      - -bootstrap-expect=1
      - -bind={{ GetInterfaceIP "eth0" }}
      - -advertise={{ GetInterfaceIP "eth0" }}
      - -client=0.0.0.0
      - -data-dir=/consul/data
      - -disable-host-node-id
    healthcheck:
      test: ["CMD-SHELL", "consul info | awk '/health_score/{if ($$3 >=1) exit 1; else exit 0}'"]
    labels:
      - "evo-type=discovery"
    networks:
      - smartdeploy_evo
    deploy:
      placement:
        constraints:
          - node.role == manager

networks:
  smartdeploy_evo:
    external: true

volumes:
  consul_data:
docker stack deploy -c docker-compose.consul.master.yml consul
==> WARNING: BootstrapExpect Mode is specified as 1; this is the same as Bootstrap mode.
==> WARNING: Bootstrap mode enabled! Do not enable unless necessary
==> Starting Consul agent...
==> Consul agent running!
           Version: 'v0.9.3'
           Node ID: 'cb651a04-9aff-17f6-c5ab-2765fa7b0595'
         Node name: 'consul'
        Datacenter: 'dc1' (Segment: '<all>')
            Server: true (Bootstrap: true)
       Client Addr: 0.0.0.0 (HTTP: 8500, HTTPS: -1, DNS: 8600)
      Cluster Addr: 10.255.0.243 (LAN: 8301, WAN: 8302)
           Encrypt: Gossip: false, TLS-Outgoing: false, TLS-Incoming: false

==> Log data will now stream in as it occurs:

    2019/01/16 15:49:29 [INFO] raft: Initial configuration (index=1): [{Suffrage:Voter ID:10.255.0.243:8300 Address:10.255.0.243:8300}]
    2019/01/16 15:49:29 [INFO] raft: Node at 10.255.0.243:8300 [Follower] entering Follower state (Leader: "")
    2019/01/16 15:49:29 [INFO] serf: EventMemberJoin: consul.dc1 10.255.0.243
    2019/01/16 15:49:29 [INFO] serf: EventMemberJoin: consul 10.255.0.243
    2019/01/16 15:49:29 [INFO] consul: Adding LAN server consul (Addr: tcp/10.255.0.243:8300) (DC: dc1)
    2019/01/16 15:49:29 [INFO] consul: Handled member-join event for server "consul.dc1" in area "wan"
    2019/01/16 15:49:29 [INFO] agent: Started DNS server 0.0.0.0:8600 (udp)
    2019/01/16 15:49:29 [INFO] agent: Started DNS server 0.0.0.0:8600 (tcp)
    2019/01/16 15:49:29 [INFO] agent: Started HTTP server on [::]:8500
    2019/01/16 15:49:37 [ERR] agent: failed to sync remote state: No cluster leader
    2019/01/16 15:49:39 [WARN] raft: Heartbeat timeout from "" reached, starting election
    2019/01/16 15:49:39 [INFO] raft: Node at 10.255.0.243:8300 [Candidate] entering Candidate state in term 2
    2019/01/16 15:49:39 [INFO] raft: Election won. Tally: 1
    2019/01/16 15:49:39 [INFO] raft: Node at 10.255.0.243:8300 [Leader] entering Leader state
    2019/01/16 15:49:39 [INFO] consul: cluster leadership acquired
    2019/01/16 15:49:39 [INFO] consul: New leader elected: consul
    2019/01/16 15:49:39 [INFO] consul: member 'consul' joined, marking health alive
    2019/01/16 15:49:41 [INFO] agent: Synced node info
version: '3'
services:

  user-mgmt:
    image: smartdeployevo_usermgmt:latest
    ports:
      - "10500:10500"
    environment:
      - spring.cloud.consul.hostHealth=user-mgmt
      - spring.profiles.active=production
    labels:
      - "evo-type=service"
    networks:
      - smartdeploy_evo
    deploy:
      placement:
        constraints:
          - node.role == worker

networks:
  smartdeploy_evo:
    external: true

我使用以下命令将此服务部署到堆栈:

docker stack deploy -c docker-compose.services.2.yml springboot

Spring Boot应用程序在启动时失败,出现以下错误:

2019-01-16 15:51:38.753 ERROR [user-mgmt,,,] 1 --- [           main] o.s.c.c.c.ConsulPropertySourceLocator    : Fail fast is set and there was an error reading configuration from consul.
2019-01-16 15:51:38.766 ERROR [user-mgmt,,,] 1 --- [           main] o.s.boot.SpringApplication               : Application run failed

com.ecwid.consul.transport.TransportException: org.apache.http.conn.HttpHostConnectException: Connect to consul:8500 [consul/10.0.2.110] failed: Connection refused (Connection refused)

注意,工作人员认为Consul正在运行的IP地址是10.0.2.110

docker exec -it 714805722ace sh
ifconfig 

eth0      Link encap:Ethernet  HWaddr 02:42:0A:FF:00:F3
          inet addr:10.255.0.243  Bcast:10.255.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1450  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

eth1      Link encap:Ethernet  HWaddr 02:42:0A:00:02:6F
          inet addr:10.0.2.111  Bcast:10.0.2.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1450  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

eth2      Link encap:Ethernet  HWaddr 02:42:AC:12:00:03
          inet addr:172.18.0.3  Bcast:172.18.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:9 errors:0 dropped:0 overruns:0 frame:0
          TX packets:9 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:698 (698.0 B)  TX bytes:810 (810.0 B)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:80 errors:0 dropped:0 overruns:0 frame:0
          TX packets:80 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:38312 (37.4 KiB)  TX bytes:38312 (37.4 KiB)
10.0.2.111

作为附加信息,如果我在工作节点上运行另一个容器,如Apache HTTPD容器,然后shell到其中并运行

ping consul

PING consul (10.0.2.110): 56 data bytes
64 bytes from 10.0.2.110: seq=0 ttl=64 time=0.189 ms
64 bytes from 10.0.2.110: seq=1 ttl=64 time=0.167 ms

它还可以看到10.0.2.110的IP地址,而不是执政官正在监听的10.0.2.111的IP地址。

任何帮助都将不胜感激!

docker network inspect smartdeploy_evo

[
    {
        "Name": "smartdeploy_evo",
        "Id": "7qyimelt9rjcaukfgd22tenxr",
        "Created": "2019-01-16T15:49:28.627116387Z",
        "Scope": "swarm",
        "Driver": "overlay",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "10.0.2.0/24",
                    "Gateway": "10.0.2.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "3e4ca1fd66b8d8012e7f4aca14b3a0d853761a92e83a95870dceef315de0f8dc": {
                "Name": "consul_consul.1.s0pbo1iuntiry2eh310wdsdqp",
                "EndpointID": "ee3bed0936fd2a9a4aa79e1efc23b60f1d45402a3b63a474743af5c2f8f5a479",
                "MacAddress": "02:42:0a:00:02:6f",
                "IPv4Address": "10.0.2.111/24",
                "IPv6Address": ""
            },
            "lb-smartdeploy_evo": {
                "Name": "smartdeploy_evo-endpoint",
                "EndpointID": "2492956b7df72f4c3f3c03e12b7f18d16601a1948b2d7fe202543d91bca75ec6",
                "MacAddress": "02:42:0a:00:02:70",
                "IPv4Address": "10.0.2.112/24",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.driver.overlay.vxlanid_list": "4100"
        },
        "Labels": {},
        "Peers": [
            {
                "Name": "cdfe9dfef133",
                "IP": "192.221.173.234"
            },
            {
                "Name": "2a07b72b316f",
                "IP": "192.221.173.235"
            }
        ]
    }
]
docker network inspect smartdeploy_evo

[
    {
        "Name": "smartdeploy_evo",
        "Id": "7qyimelt9rjcaukfgd22tenxr",
        "Created": "2019-01-16T15:53:39.639835468Z",
        "Scope": "swarm",
        "Driver": "overlay",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "10.0.2.0/24",
                    "Gateway": "10.0.2.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "4943e458d4e08020ba2e49e375fd9371b75f8adb3835d249a453ab3cfbac4bc1": {
                "Name": "springboot_user-mgmt.1.p91mu1nmybt6k8zfezpe24a2f",
                "EndpointID": "2e04bfc51b50fedd2a766897832047800e55f555f91521767bd0a2647b2f3662",
                "MacAddress": "02:42:0a:00:02:90",
                "IPv4Address": "10.0.2.144/24",
                "IPv6Address": ""
            },
            "b50a7205440d0e7937348fe43d0d7bb0a8e66b7371c2c46dd3c7831248bdceb9": {
                "Name": "h_httpd.1.wymlfscwus5rk8ajf62qscb4r",
                "EndpointID": "d46331e82c16c4a4597470a7aa72685721fe063a06e11bc739623178031b24ea",
                "MacAddress": "02:42:0a:00:02:88",
                "IPv4Address": "10.0.2.136/24",
                "IPv6Address": ""
            },
            "lb-smartdeploy_evo": {
                "Name": "smartdeploy_evo-endpoint",
                "EndpointID": "9e3a507c4f3a58e0b74479c4a3878f858a816b5fd6905aa2fbfa89c2d1a8276a",
                "MacAddress": "02:42:0a:00:02:81",
                "IPv4Address": "10.0.2.129/24",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.driver.overlay.vxlanid_list": "4100"
        },
        "Labels": {},
        "Peers": [
            {
                "Name": "cdfe9dfef133",
                "IP": "192.221.173.234"
            },
            {
                "Name": "2a07b72b316f",
                "IP": "192.221.173.235"
            }
        ]
    }
]

共有1个答案

魏彦
2023-03-14

我一直在做一些研究,并在Consult github网站上遇到了类似的问题,用户soakes建议使用GliderLabs/Registrator作为Consult经理和代理之间的桥梁。

我下面的版本与他的版本略有不同(主要是容器的名称,以匹配我在Spring Boot代码中的默认值,并且没有SSL等),但如果没有他的大多数输入,将会被难倒!

我创建了我的Swarm覆盖网络,如下所示:

docker network create -d overlay --opt com.docker.network.swarm.name=smartdeploy_evo smartdeploy_evo
docker stack deploy -c consul.yml consul
version: "3.4"

networks:
  smartdeploy_evo:
    external: true

volumes:
  consul:

services:

  consul:
    image: consul:0.9.3
    volumes:
      - consul:/consul
    ports:
      - target: 8500
        published: 8500
        mode: host
    networks:
      smartdeploy_evo:
        aliases:
          - consul.cluster
    environment:
      - 'CONSUL_LOCAL_CONFIG={ "skip_leave_on_interrupt": true,
      "data_dir":"/consul/data",
      "server":true }'
      - CONSUL_BIND_INTERFACE=eth0
    command: agent -ui -data-dir /consul/data -server -client 0.0.0.0 -bootstrap-expect=1 -retry-join consul.cluster
    deploy:
      endpoint_mode: dnsrr
      mode: global
      placement:
        constraints: [node.role ==  manager]

  consul_client:
    image: consul:0.9.3
    volumes:
      - consul:/consul
    networks:
      smartdeploy_evo:
        aliases:
          - consul.client.cluster
    environment:
      - 'CONSUL_LOCAL_CONFIG={ "skip_leave_on_interrupt": true,
      "data_dir":"/consul/data" }'
      - CONSUL_BIND_INTERFACE=eth0
    command: agent -ui -data-dir /consul/data -client 0.0.0.0 -retry-join consul.cluster
    deploy:
      endpoint_mode: dnsrr
      mode: global
      placement:
        constraints: [node.role !=  manager]

  consul_registrator:
    image: gliderlabs/registrator:master
    command: -internal consul://consul.cluster:8500
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock
    networks:
      - smartdeploy_evo
    deploy:
      mode: global
 类似资料:
  • 如果Kafka服务器(暂时)关闭,我的Spring Boot应用程序将继续尝试连接,但失败,从而导致不必要的通信量并扰乱日志文件: 我知道参数,这就是我如何创建bean: 消费者仍然试图每3秒连接一次。

  • 我想在我的Junit5单元测试中将值注入到带有@Value注释的私有字段。 我引用了这个,并使用了ReflectionTestUtils。setField通过注入值解决了我的问题,但在验证方法被调用的次数时失败。 MyClass(我的类别): 测试类: 运行上述测试时出错 我想kafkaTemplate.sendMessage();被调用一次,但被调用两次后添加反射TestUtils。 需要关于如

  • 我想在我的spring boot项目中使用Kafka Streams实时处理。所以我需要Kafka Streams配置,或者我想使用KStreams或KTable,但我在互联网上找不到示例。 我做了制作人和消费者现在我想流实时。

  • 如spring boot博客所述 我尝试自定义我的对象序列化。 在我的配置中添加了一个新的配置bean之后 当我尝试输出类用户的实例时,json结果不在CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES中 也许我需要在我的Jersey配置中注册一些东西来激活我的自定义obejctMapper配置 谢谢

  • 我有一个Spring Boot2.25.1应用程序,它使用Camel 2.25.1与camel-kafka,一切都正常工作…在我的Kafka消费者中,我需要添加该功能以按需暂停消费,因此我升级到camel 3.18.1,以便我可以使用可暂停功能。升级到3.18.1后,我收到错误FileNotes与类文件TimeoutAwareAggregationStategy.class. 当我打开camel-

  • 我使用Spring的引导2.6.3和我试图使用thymeleaf最近得到一个与html的确认消息后,我通过邮件确认我的帐户(我只是使用确认邮件来验证新帐户),所以我看了一些关于thymeleaf的视频,我标记所有的视频都有一个名为模板的文件夹和静态在src/main/ressource和我没有他们,所以我创建了一个名为模板的文件夹,在文件夹中我创建了一个html文件只是为了尝试它,如果它(html