簡體   English   中英

Docker Swarm:繞過負載均衡器並直接向特定容器發出請求

[英]Docker Swarm: bypass load balancer and make direct request to specific containers

我有兩個容器在一個集群中運行。 每個都暴露了我試圖抓取的/stats端點。

但是,使用 swarm 端口顯然會導致查詢被負載平衡,因此統計信息都是混合的:

+--------------------------------------------------+
|                       Server                     |
|    +-------------+             +-------------+   |
|    |             |             |             |   |
|    | Container A |             | Container B |   |
|    |             |             |             |   |
|    +-------------+             +-------------+   |
|                 \              /                 |
|                  \            /                  |
|                 +--------------+                 |
|                 |              |                 |
|                 | Swarm Router |                 |
|                 |              |                 |
|                 +--------------+                 |
|                         v                        |
+-------------------------|------------------------+
                          |                         
                       A Stats                      
                       B Stats                      
                       A Stats                      
                       B Stats                      
                          |                         
                          v                          

我想為應用程序請求保留負載均衡器,但還需要一種直接的方式來向每個容器發出請求以抓取統計信息。

+--------------------------------------------------+
|                       Server                     |
|    +-------------+             +-------------+   |
|    |             |             |             |   |
|    | Container A |             | Container B |   |
|    |             |             |             |   |
|    +-------------+             +-------------+   |
|        |        \              /         |       |
|        |         \            /          |       |
|        |        +--------------+         |       |
|        |        |              |         |       |
|        |        | Swarm Router |         |       |
|        v        |              |         v       |
|        |        +--------------+         |       |
|        |                |                |       |
+--------|----------------|----------------|-------+
         |                |                |
      A Stats             |             B Stats
      A Stats       Normal Traffic      B Stats
      A Stats             |             B Stats
         |                |                |
         |                |                |
         v                |                v

動態解決方案將是理想的,但由於我不打算對每個容器進行任何動態縮放,例如硬編碼端口之類的就可以了:

::8080  Both containers via load balancer
::8081  Direct access to container A
::8082  Direct access to container B

這可以用 swarm 完成嗎?

從覆蓋網絡內部,您可以獲取所有具有tasks.<service_name> DNS 查詢:

; <<>> DiG 9.11.5-P4-5.1+deb10u5-Debian <<>> -tA tasks.foo_test
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 19860
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;tasks.foo_test.            IN  A

;; ANSWER SECTION:
tasks.foo_test.     600 IN  A   10.0.1.3
tasks.foo_test.     600 IN  A   10.0.1.5
tasks.foo_test.     600 IN  A   10.0.1.6

這在文檔中有所提及。

此外,如果您使用Prometheus來抓取這些端點以獲取指標,您可以將上述內容與dns_sd_configs結合以將目標設置為抓取( 是一篇文章如何)。 這很容易運行,但功能有些受限(尤其是在大型環境中)。

實現相同目的的更高級方法是使用dockerswarm_sd_config文檔示例配置)。 這樣,端點列表將通過查詢 Docker 守護程序以及一些有用的標簽(即節點名稱、服務名稱、自定義標簽)來收集。

雖然不太理想,但您可以引入一個微服務,作為暴露/stats的其他容器的中介。 該微服務必須配置有單獨的端點,並在與所述端點相同的網絡中運行。

這不會繞過負載均衡器,而是讓它變得無關緊要。

中介可以匯總信息,或者您可以通過傳遞不透明標識符列表來使其更復雜,然后調用者可以使用這些標識符單獨查詢中介。

從某種意義上說,它有點“反模式”,因為您有一個高度耦合的“統計”代理,必須將其配置為能夠訪問每個端點。

也就是說,從某種意義上說,您不必在代理之外公開單個容器,這很好。 從安全角度來看,這可能會更好,因為您不會從集群中泄露額外的信息。

您可以嘗試在主機上發布特定的容器端口,添加到您的服務中:

    ports:
      - target: 8081
        published: 8081
        protocol: tcp
        mode: host

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM