sim*_*bro 4 docker netflix-eureka docker-swarm
我正在关注这个非常出色的教程:https://github.com/binblee/springcloud-swarm
当我将堆栈部署到包含单个节点(仅是管理器节点)的Docker群时,它可以完美运行。
docker stack deploy -c all-in-one.yml springcloud-demo
Run Code Online (Sandbox Code Playgroud)
我有四个Docker容器,其中一个是Eureka服务发现,其他三个容器都已成功注册。
问题是,当我将一个工作程序节点添加到群集时,然后将两个容器部署到工作程序,将两个容器部署到管理程序,并且部署到工作程序节点的服务找不到Eureka服务器。
java.net.UnknownHostException: eureka: Name does not resolve
Run Code Online (Sandbox Code Playgroud)
这是我的撰写文件:
version: '3'
services:
eureka:
image: demo-eurekaserver
ports:
- "8761:8761"
web:
image: demo-web
environment:
- EUREKA_SERVER_ADDRESS=http://eureka:8761/eureka
zuul:
image: demo-zuul
environment:
- EUREKA_SERVER_ADDRESS=http://eureka:8761/eureka
ports:
- "8762:8762"
bookservice:
image: demo-bookservice
environment:
- EUREKA_SERVER_ADDRESS=http://eureka:8761/eureka
Run Code Online (Sandbox Code Playgroud)
另外,我只能在其部署到的主机上访问Eureka Service Discovery服务器。
我认为使用“ docker stack deploy”会自动创建一个覆盖网络,在该网络中,所有公开的端口都将路由到运行相应服务的主机:
从https://docs.docker.com/engine/swarm/ingress/:
所有节点都参与入口路由网格。路由网格使群集中的每个节点都可以接受群集中运行的任何服务的已发布端口上的连接,即使节点上没有任何任务在运行。
这是docker service ls的输出:
manager:~/springcloud-swarm/compose$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
rirdysi0j4vk springcloud-demo_bookservice replicated 1/1 demo-bookservice:latest
936ewzxwg82l springcloud-demo_eureka replicated 1/1 demo-eurekaserver:latest *:8761->8761/tcp
lb1p8nwshnvz springcloud-demo_web replicated 1/1 demo-web:latest
0s52zecjk05q springcloud-demo_zuul replicated 1/1 demo-zuul:latest *:8762->8762/tcp
Run Code Online (Sandbox Code Playgroud)
和docker stack ps springcloud-demo:
manager:$ docker stack ps springcloud-demo
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE
o8aed04qcysy springcloud-demo_web.1 demo-web:latest workernode Running Running 2 minutes ago
yzwmx3l01b94 springcloud-demo_eureka.1 demo-eurekaserver:latest managernode Running Running 2 minutes ago
rwe9y6uj3c73 springcloud-demo_bookservice.1 demo-bookservice:latest workernode Running Running 2 minutes ago
iy5e237ca29o springcloud-demo_zuul.1 demo-zuul:latest managernode Running Running 2 minutes ago
Run Code Online (Sandbox Code Playgroud)
更新:
我成功添加了另一台主机,但是现在无法添加第三台。我按照相同的步骤尝试了几次(安装docker,打开必需的端口,加入群集)-但该节点找不到具有容器主机名的Eureka服务器)。
更新2:
在测试端口是否打开时,我检查了防火墙配置:
workernode:~$ sudo ufw status
Status: active
To Action From
-- ------ ----
8080 ALLOW Anywhere
4789 ALLOW Anywhere
7946 ALLOW Anywhere
2377 ALLOW Anywhere
8762 ALLOW Anywhere
8761 ALLOW Anywhere
22 ALLOW Anywhere
Run Code Online (Sandbox Code Playgroud)
但是-当我尝试从管理器节点访问工作程序节点上的端口2377时,我无法:
managernode:~$ telnet xx.xx.xx.xx 2377
Trying xx.xx.xx.xx...
telnet: Unable to connect to remote host: Connection refused
Run Code Online (Sandbox Code Playgroud)
让我们将解决方案分成几部分。每个部分都试图为您提供有关解决方案的想法,并且相互联系。
每当我们创建不指定网络的容器时,docker会将其附加到默认桥网络。据此,。服务发现在默认网络中不可用。为了使服务发现程序正常工作,我们应该创建一个用户定义的网络,因为它提供了隔离,DNS解析和许多其他功能。所有这些东西在我们使用docker run命令时都是适用的。
当使用docker-compose运行容器并且未指定网络时,它将创建自己的桥网络。具有用户定义网络的所有属性。
这些网桥网络默认情况下是不可连接的,但是它们允许本地计算机中的docker容器连接到它们。
在Docker群和群模式路由网格中,无论何时我们在不指定外部网络的情况下向其部署服务时,该服务都会连接到入口网络。
当您指定外部覆盖网络时,您会注意到,创建的覆盖网络仅对管理者可用,而对工作节点不可用,除非创建了服务并将其复制到该服务。这些默认情况下也不是可附加的,并且不允许群集服务之外的其他容器连接到它们。因此,您无需在群集外部将容器连接到网络之前就将网络声明为可连接网络。
由于对worker / manager节点的数量没有预先定义的/正式的限制,因此您应该能够从第三个节点进行连接。一种可能性是该节点可能作为工作节点连接,但是如果覆盖网络不可连接,则您可能尝试在该节点中部署受工作节点限制的容器。
而且,您不能直接在工作节点中部署服务。所有服务都部署在管理器节点中,它负责根据提供的配置和模式复制和扩展服务。
如群模式入门中所述
- 用于群集管理通信的TCP端口2377
- TCP和UDP端口7946,用于节点之间的通信
- UDP端口4789,用于覆盖网络流量
- ip协议50(ESP),用于加密覆盖网络
这些端口应列入白名单,以进行节点之间的通信。进行更改后,大多数防火墙都需要重新加载。可以通过将重载选项传递给防火墙来完成,并且在Linux发行版之间有所不同。ufw不需要重新加载,但是如果在file中添加了规则,则需要提交。
除了将上述端口列入白名单。您可能需要将网络掩码为16的docker0,docker_gw_bridge,br-123456 IP地址列入白名单。否则,其他服务发现将无法在同一主机上运行。也就是说,如果你正在试图连接到eureka在192.168.0.12,其中eureka服务是相同192.168.0.12它不会解决防火墙会阻碍交通。引用此内容(从容器到从其他容器发布的host-ip:port的NO ROUTE TO HOST网络请求)
有时,Java的运行方式很怪异,因此会引发java.net.MalformedURLException类似异常。我有我自己的经验,这种情况与解决方案,以及。在这里ping可以正确解决,但是Java rmi抛出错误。因此,当您连接到用户定义的网络时,可以定义自己的自定义别名。
默认情况下,您可以使用容器名称解析为服务。除此之外,您还可以将服务解析为<container_name>.<network_name>。当然,您也可以定义别名。甚至您也可以将其解析为<alias_name>.<network_name>。
因此,您应该在加入集群后创建一个用户定义的覆盖网络,然后部署服务。在服务中,您应该提及此处定义的外部网络以及在防火墙中进行更改。
如果要允许外部容器连接到网络,则应使网络可连接。
由于您尚未提供有关第三台服务器正在发生的事情的足够详细信息。我假设您正在尝试在该容器中部署一个容器,该容器被docker overlay网络拒绝,因为该网络不可连接。
| 归档时间: |
|
| 查看次数: |
2216 次 |
| 最近记录: |