swarm负载平衡应该在其节点上执行健康检查吗?

swarm文档中的负载均衡部分并不清楚内部负载均衡器是否也进行了健康检查,并且是否删除了不再运行该服务的节点(因为它被终止或节点重新启动)。

在下面的情况下,我已经获得了3个节点上运行的副本3,1个实例的服务。

经理:

[root@centosvm ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a593d485050a ddewaele/springboot.crud.sample:latest "sh -c 'java $JAVA_OP" 7 minutes ago Up 7 minutes springbootcrudsample.1.5syc6j4c8i3bnerdqq4e1yelm 

节点1:

 [root@node1 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d3b3fbc0f2c5 ddewaele/springboot.crud.sample:latest "sh -c 'java $JAVA_OP" 4 minutes ago Up 4 minutes springbootcrudsample.3.7y1oyjyrifgkmxlr20oai5ppl 

节点2:

 [root@node2 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ebca8f24ec3a ddewaele/springboot.crud.sample:latest "sh -c 'java $JAVA_OP" 7 minutes ago Up 7 minutes springbootcrudsample.2.4tqjad7od8ep047s55485na1t 

现在,在node1上,我们终止docker容器。 这个节点将没有服务(群集将在几秒钟后重新创build它,以保持复制= 3的服务)

 [root@node1 ~]# docker kill d3b3fbc0f2c5 d3b3fbc0f2c5 

容器消失了

 [root@node1 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 

新的容器了

 [root@node1 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b8c9a7a5cf97 ddewaele/springboot.crud.sample:latest "sh -c 'java $JAVA_OP" 11 seconds ago Up 9 seconds springbootcrudsample.3.9v4cnhi8dvq7n8afb2kvp28sk 

然而,在下面的输出中,当容器d3b3fbc0f2c5被杀死时,入口负载均衡器没有检测到这种情况,并且仍在向节点发送stream量(导致连接被拒绝)?

我们应该如何处理这种情况? 我们是否还需要一个外部的负载均衡器,我们应该如何configuration?

 [root@centosvm ~]# while :; do curl http://localhost:8080/env/hostname ; echo "" ; sleep 1; done {"hostname":"d3b3fbc0f2c5"} {"hostname":"a593d485050a"} {"hostname":"ebca8f24ec3a"} {"hostname":"d3b3fbc0f2c5"} {"hostname":"a593d485050a"} {"hostname":"ebca8f24ec3a"} {"hostname":"d3b3fbc0f2c5"} {"hostname":"a593d485050a"} {"hostname":"ebca8f24ec3a"} {"hostname":"a593d485050a"} {"hostname":"ebca8f24ec3a"} {"hostname":"a593d485050a"} curl: (7) Failed connect to localhost:8080; Connection refused {"hostname":"ebca8f24ec3a"} {"hostname":"a593d485050a"} curl: (7) Failed connect to localhost:8080; Connection refused {"hostname":"ebca8f24ec3a"} {"hostname":"a593d485050a"} curl: (7) Failed connect to localhost:8080; Connection refused {"hostname":"ebca8f24ec3a"} {"hostname":"a593d485050a"} curl: (7) Failed connect to localhost:8080; Connection refused {"hostname":"ebca8f24ec3a"} {"hostname":"a593d485050a"} curl: (7) Failed connect to localhost:8080; Connection refused {"hostname":"ebca8f24ec3a"} {"hostname":"a593d485050a"} curl: (7) Failed connect to localhost:8080; Connection refused {"hostname":"ebca8f24ec3a"} {"hostname":"a593d485050a"} {"hostname":"b8c9a7a5cf97"} {"hostname":"ebca8f24ec3a"} {"hostname":"a593d485050a"} {"hostname":"b8c9a7a5cf97"} 

正如FrançoisMaturel所指出的那样 ,Docker Swarm将会考虑到容器的健康状况,以决定是否将请求发送给容器。

对于已启用默认执行器的Spring Boot应用程序,将其添加到Dockerfile对于基本健康检查是足够的。 当Spring Boot应用程序初始化并且其健康执行程序已启用时,以下http请求将返回一个有效的http 200响应,健康检查将通过。

 HEALTHCHECK CMD wget -q http://localhost:8080/health -O /dev/null 

这将导致您的docker集装箱能够达到健康状态。 当你的docker容器启动时,其中运行的服务可能仍在初始化。 为了进行适当的负载均衡和检测服务健康状况,Swarm需要知道何时能够将请求路由到特定服务实例(节点上的容器)。

所以当Swarm启动一个服务副本时,它启动一个容器,它将一直等到服务的健康状态为“健康”。 当你的容器启动时,它将从“开始”转换:

 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5001e1c46953 ddewaele/springboot.crud.sample@sha256:4ce69c3f50c69640c8240f9df68c8816605c6214b74e6581be44ce153c0f3b7a "/docker-entrypoin..." 5 seconds ago Up Less than a second (health: starting) springbootcrudsample.2.yt6d38zhhq2wxt1d6qfjz5974 

到“健康”。 只有这样,Swarm负载均衡器才能将请求路由到此端点。

 [root@centos-a ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5001e1c46953 ddewaele/springboot.crud.sample@sha256:4ce69c3f50c69640c8240f9df68c8816605c6214b74e6581be44ce153c0f3b7a "/docker-entrypoin..." About a minute ago Up About a minute (healthy) springbootcrudsample.2.yt6d38zhhq2wxt1d6qfjz5974