2017-04-11 65 views
2

swarm文檔中的Load Balancing部分沒有說明內部負載均衡器是否也進行健康檢查,以及是否刪除了不再運行該服務的節點(因爲它已被殺死或節點重新啓動)。Swarm負載平衡應該在其節點上執行健康檢查嗎?

在下面的案例中,我已經獲得了3個節點上運行的副本3,1個實例的服務。

經理:

[[email protected] ~]# 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:

[[email protected] ~]# 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:

[[email protected] ~]# 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 

現在,在節點1,我們殺的泊塢窗容器。該節點將沒有一個服務(羣將幾秒鐘後,這裏重新創建它,以保持複製= 3的服務)

[[email protected] ~]# docker kill d3b3fbc0f2c5 
d3b3fbc0f2c5 

集裝箱不見了

[[email protected] ~]# docker ps 
CONTAINER ID  IMAGE         COMMAND     CREATED    STATUS    PORTS    NAMES 

新容器起來

[[email protected] ~]# 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被打死,入口負載均衡器沒有發現這一點,它仍然將流量發送到節點(resulti在連接拒絕)?

我們應該如何處理這種情況?我們是否還需要一個外部負載均衡器來處理這種情況,我們應該如何配置它?

[[email protected] ~]# 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"} 
+1

您是否使用[HEALTHCHECK](https://docs.docker.com/engine/reference/builder/#healthcheck)通過'Dockerfile'嘗試了這種情況? Swarm模式可以使用此健康檢查來平衡流量到服務副本。 –

+0

確實......在HEALTHCHECK中可以正常工作。 – ddewaele

回答

2

正如François Maturel表示,隨着地方適當的健康檢查,多克羣會考慮容器的衛生狀況,以決定是否將請求路由到它。

對於已啓用默認執行器的Spring Boot應用程序,將其添加到Dockerfile對於基本健康檢查是足夠的。當Spring Boot應用程序初始化並且它的health actuator已啓用時,下面的http請求將返回一個有效的http 200響應,健康檢查將通過。

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

這將導致您的碼頭集裝箱能夠達到健康狀態。當您的docker容器啓動時,其中運行的服務可能仍在初始化。爲了執行適當的負載均衡和檢測服務健康狀況,Swarm需要知道它何時能夠將請求路由到特定服務實例(節點上的容器)。

所以當Swarm啓動一個服務副本時,它啓動一個容器,它會一直等到服務的健康狀態爲「健康」。當您的容器啓動時,它將從「開始」轉換:

CONTAINER ID  IMAGE                          COMMAND     CREATED    STATUS          PORTS    NAMES 
5001e1c46953  ddewaele/[email protected]:4ce69c3f50c69640c8240f9df68c8816605c6214b74e6581be44ce153c0f3b7a "/docker-entrypoin..." 5 seconds ago  Up Less than a second (health: starting)      springbootcrudsample.2.yt6d38zhhq2wxt1d6qfjz5974 

「健康」。只有這樣,Swarm負載平衡器才能將請求路由到此端點。

[[email protected] ~]# docker ps 
CONTAINER ID  IMAGE                          COMMAND     CREATED    STATUS      PORTS    NAMES 
5001e1c46953  ddewaele/[email protected]:4ce69c3f50c69640c8240f9df68c8816605c6214b74e6581be44ce153c0f3b7a "/docker-entrypoin..." About a minute ago Up About a minute (healthy)      springbootcrudsample.2.yt6d38zhhq2wxt1d6qfjz5974 
0

@ddewaele是正確的,所以這裏的一些花絮:

  • 否LB不直接執行端口連接檢查,這就是泊塢窗引擎拉開健康檢查工作,這可能是簡單的捲曲或更多。
  • 健康檢查對零停機時間部署至關重要。特別是如果您的容器需要更多的時間才能啓動或關閉。沒有健康檢查,碼頭工人只知道「Linux是否說這個過程正在運行?」
  • 您可以使用docker events在每個容器中啓動exec命令,併爲其Swarm服務設置健康檢查。您還可以在那裏看到它將如何將任務/容器標記爲健康/不健康。
  • 在更新/關閉任務期間,入口負載均衡器發送數據包時一直存在問題/錯誤,但AFAIK從17.12(剛剛發佈)開始,大部分都是固定的。其中一個老問題是,在容器關閉開始之前,LB可能不會從路由表中刪除任務,但是人們報告了最近幾次發佈的更好結果。 https://github.com/moby/moby/issues/30321