[英]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.