對於tcp 的路由是基於sni (需要tls)但是可以通過統配(*) 解決不試用tls的,當然也可以讓Traefik 自動生成tls 證書
以下是測試http 以及mysql 的tcp 路由配置(demo 很簡單,就是一個proxy)
環境准備
- docker-compose文件
version: '3'
services:
database:
image: mysql:5.7.16
labels:
- "traefik.tcp.routers.mysql.rule=HostSNI(`*`)"
- "traefik.tcp.routers.mysql.entrypoints=mysql-default"
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
environment:
MYSQL_ROOT_PASSWORD: dalongrong
MYSQL_DATABASE: gogs
MYSQL_USER: gogs
MYSQL_PASSWORD: dalongrong
TZ: Asia/Shanghai
database2:
image: mysql:5.7.16
labels:
- "traefik.tcp.routers.mysql2.rule=HostSNI(`*`)"
- "traefik.tcp.routers.mysql2.entrypoints=mysql-default2"
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
environment:
MYSQL_ROOT_PASSWORD: dalongrong
MYSQL_DATABASE: app
MYSQL_USER: app
MYSQL_PASSWORD: dalongrong
TZ: Asia/Shanghai
nginx:
image: nginx
labels:
- "traefik.http.routers.nginx.rule=Host(`dalong.web.localhost`)"
- "traefik.http.routers.nginx.entrypoints=web"
reverse-proxy:
image: traefik:v2.0
build: ./
entrypoint: traefik --configfile /traefik.toml
ports:
- "80:80"
- "8090:8080"
- "3306:3306"
- "3307:3307"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- traefik 配置
[global]
checkNewVersion = false
sendAnonymousUsage = false
[entryPoints]
[entryPoints.web]
address = ":80"
[entryPoints.mysql-default]
address = ":3306"
[entryPoints.mysql-default2]
address = ":3307"
[entryPoints.web-nginx]
address = ":443"
[entryPoints.traefik]
address = ":8080"
[log]
level = "DEBUG"
[api]
insecure = true
dashboard = true
[ping]
[providers.docker]
endpoint = "unix:///var/run/docker.sock"
exposedByDefault = true
[metrics]
[metrics.prometheus]
- dockerfile
FROM traefik:v2.0
COPY traefik.toml /traefik.toml
- 說明
tcp 路由配置需要sni,對於沒有tls 證書的我們可以使用* 配置,比如mysql的
labels:
- "traefik.tcp.routers.mysql2.rule=HostSNI(`*`)"
- "traefik.tcp.routers.mysql2.entrypoints=mysql-default2"
啟動 &&測試
- 啟動
docker-compose build
docker-compose up -d
- 效果
整體界面
http 路由
tcp 路由
- http 測試
配置hosts 文件
訪問效果
- tcp 路由測試
直接使用端口+ ip 方式
database1
mysql -uroot -pdalongrong -h127.0.0.1
效果:
database2
mysql -uroot -P3307 -pdalongrong -h127.0.0.1
- prometheus metrics
說明
以上是一個簡單的測試,主要是 需要sni 支持,但是sni 需要tls,實際我們的連接也需要少有改動,可能四層用haproxy 會更方便點,對於簡單,同時數量不多的
四層處理還是挺不錯的
參考資料
https://docs.traefik.io/routing/routers/#configuring-tcp-routers
https://blog.containo.us/back-to-traefik-2-0-2f9aa17be305