traefik

標籤:traefik

Swarm mode 上線 7 - load balancer | 反向代理 (2)

潮流特區
MacauYeah ・2025-07-18

前幾天,我們就使用traefik做了個最簡單的http反向代理。 做完上述的使用驗證後,我們可以正式開始看官方的例子,該例子加入了SSL,這就更充份地體現反向代理的用途。 官方教學連結 官方的yaml也很長,筆者實測了一個簡化版本。 services traefik image traefikv3.4 ports target 443 published 443 protocol tcp networks traefik_proxy volumes varrundocker.sockvarrundocker.sockro configs source dynamictls.yaml target dynamictls.yaml secrets source certslocal.key target certslocal.key source certslocal.crt target certslocal.crt command api.dashboard=true log.level=INFO accesslog=true quot;providers.file.filename=dynamictls.yamlquot; providers.swarm.exposedByDefault=false providers.swarm.network=traefik_proxy entrypoints.websecure.address=443 entrypoints.websecure.http.tls=true deploy replicas 1 placement constraints node.role==manager whoami image traefikwhoami networks traefik_proxy deploy labels quot;traefik.enable=truequot; quot;traefik.http.routers.whoami.rule=Host`whoami.swarm.localhost`quot; quot;traefik.http.routers.whoami.tls=truequot; traefik.http.services.whoami.loadbalancer.server.port=80 networks traefik_proxy name traefik_proxy driver overlay attachable true configs dynamictls.yaml file .dynamictls.yaml secrets certslocal.key file .certslocal.key certslocal.crt file .certslocal.crt 餘下的就照跟官方設定 生成cert file。(或大家有正式的證書,就可以免去這一步。) mkdir p certs openssl req x509 nodes days 365 newkey rsa2048 keyout certslocal.key out certslocal.crt subj quot;CN=.swarm.localhostquot; 指向cert的動態設定檔。 tls certificates certFile certslocal.crt keyFile certslocal.key 然後我們就可以這樣測試 curl v k H 'hostwhoami.swarm.localhost' 筆者在一開始時,始終無法設定 dyanmictls.yaml ,其實是筆者誤會了 traefik 的讀取方式。本個例子中,traefik 其實會動態讀取 swarm 及 file provider 的設置,而dyanmictls.yaml是經過file provider的方式生效。也就是 traefikssl.yaml 中的quot;providers.file.filename=dynamictls.yamlquot;。 本個例子與官方例子最大的不同,是官方的cert, tls, 是直接使用bind mount的方式存取,如果你有多過一個manager,這個方式不太有效。本文就用了swarm config及swarm secret,方便多個manager自動配置。不過swarm config及swarm secret都有個缺點,若要更新它們的內容,就必需要重命名(例如dynamictls.yaml=gt; dynamictls.yaml2) ,否則swarm不允許發佈。 完整 yaml 請見 github

Swarm mode 上線 7 - load balancer | 反向代理

潮流特區
MacauYeah ・2025-06-30

前述我們介紹了負載平衡器的概念,也使用了nginx作為反向代理,管理網絡訪問,分流到對應的服務上 docker service 。 nginx是穩定的,大家初次使用 reverse proxy (反向代理),請選擇它,因為相對簡單,也易於在單機上做對比測試。 而nginx有個麻煩的地方,就是每次加 docker service,都需要更改 nginx 的設定。我們service 越多,config檔就越長。一個不少心,某些設定有衝突,就會讓 nginx 無法重起。 所以,我們在一定規模後,就需要改用自動化的反向代理。 traefik 就是其中之一。所恨的是,官方沒有提供 swarm 的範例,需要自行摸索。幸好筆者找到一個Github網路資源,bluepuma77 traefikbestpractice,內有一個traefik在docker swarm上的基本設定,足以解開筆者的某些謎思,至少可以讓筆者進行使用驗證。 bluepuma77 提供的範例可能還有些複雜,筆者就再簡化一下,讓大家可以從最基本的環境中開始。 下述 docker service 中 traefik 自動偵測 swarm 中,有那些其他 service 需要經過traefik 代理。 whoami 一個官方提供的簡單版http 回應,它正常可以回應 http 80的請求。 有一些重要的地方需要特別說明: 需要設定 providers.swarm.exposedByDefault=false,不然traefik自己也需要定義反向代理的port。設定了這個,也可以讓 swarm 中某些 service 得以被忽略。有需要經 traefik 對外的,就在 label 下設定 traefik.enable=true 需要設定providers.swarm.network=proxy,swarm中也需要有該網絡的存在。不然traefik 沒有預設的網絡可以走。 現時 docker service 使用是的 ingress mode,方便 traefik service 可以在不同的 manager 上遊走。測試時需要注意使用 ipv4 ,例如 curl 需要指定 ipv4 的 ip 即curl v H 'hostwhoami.localhost' http127.0.0.1 ,若直接使用 whoami.localhost ,有機會會指向 ivp6 , ingress mode 就接不到。 Reference httpsgithub.combluepuma77traefikbestpracticeblobmaindockerswarmtraefikdockercompose.yml httpsdoc.traefik.iotraefikroutingrouters#pathpathprefixandpathregexp