科技新知
Swarm mode 上線 7 - load balancer | 反向代理 (2)
前幾天,我們就使用traefik做了個最簡單的http反向代理。 做完上述的使用驗證後,我們可以正式開始看官方的例子,該例子加入了SSL,這就更充份地體現反向代理的用途。
官方的yaml也很長,筆者實測了一個簡化版本。
services:
traefik:
image: traefik:v3.4
ports:
- target: 443
published: 443
protocol: tcp
networks:
- traefik_proxy
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
configs:
- source: dynamic-tls.yaml
target: /dynamic/tls.yaml
secrets:
- source: certs-local.key
target: /certs/local.key
- source: certs-local.crt
target: /certs/local.crt
command:
- --api.dashboard=true
- --log.level=INFO
- --accesslog=true
- "--providers.file.filename=/dynamic/tls.yaml"
- --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: traefik/whoami
networks:
- traefik_proxy
deploy:
labels:
- "traefik.enable=true"
- "traefik.http.routers.whoami.rule=Host(`whoami.swarm.localhost`)"
- "traefik.http.routers.whoami.tls=true"
- traefik.http.services.whoami.loadbalancer.server.port=80
networks:
traefik_proxy:
name: traefik_proxy
driver: overlay
attachable: true
configs:
dynamic-tls.yaml:
file: ./dynamic/tls.yaml
secrets:
certs-local.key:
file: ./certs/local.key
certs-local.crt:
file: ./certs/local.crt
餘下的就照跟官方設定
生成cert file。(或大家有正式的證書,就可以免去這一步。)
mkdir -p certs
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \\
-keyout certs/local.key -out certs/local.crt \\
-subj "/CN=*.swarm.localhost"
指向cert的動態設定檔。
tls:
certificates:
- certFile: /certs/local.crt
keyFile: /certs/local.key
然後我們就可以這樣測試
curl -v -k -H 'host:whoami.swarm.localhost'
筆者在一開始時,始終無法設定 dyanmic/tls.yaml
,其實是筆者誤會了 traefik 的讀取方式。本個例子中,traefik 其實會動態讀取 swarm 及 file provider 的設置,而dyanmic/tls.yaml
是經過file provider的方式生效。也就是 traefik-ssl.yaml
中的"--providers.file.filename=/dynamic/tls.yaml"
。
本個例子與官方例子最大的不同,是官方的cert, tls, 是直接使用bind mount的方式存取,如果你有多過一個manager,這個方式不太有效。本文就用了swarm config及swarm secret,方便多個manager自動配置。不過swarm config及swarm secret都有個缺點,若要更新它們的內容,就必需要重命名(例如dynamic-tls.yaml=> dynamic-tls.yaml2) ,否則swarm不允許發佈。
完整 yaml 請見 github