使用 Traefik 的一些補充細節
本站使用「署名 4.0 國際 (CC BY 4.0)」許可協議,歡迎轉載、或重新修改使用,但需要註明來源。 ofollow,noindex">署名 4.0 國際 (CC BY 4.0)
本文作者: 蘇洋
建立時間: 2018年09月07日 統計字數: 7212字 閱讀時間: 15分鐘閱讀 本文連結: soulteary.com/2018/09/07/…
使用 Traefik 的一些補充細節
之前我寫了不少配合 Traefik 進行服務註冊並提供彈性伸縮後自動進行負載均衡的例子,也貼過它的配置,但是似乎一直沒有詳細的解釋過關於 Traefik 配置和使用的文章,考慮了一下,應該寫一篇聊聊。
Traefik 是什麼又能做什麼

如果看過我之前的文章,那麼你會 Traefik 這個軟體應該有一些簡單的理解,提供類似 Nginx 的負載能力,不同的是可以自動化配置 “ upstream
”,或者說是免配置即開即食的 consul
。官方的定義如下:
A reverse proxy / load balancer that's easy, dynamic, automatic, fast, full-featured, open source, production proven, provides metrics, and integrates with every major cluster technologies... No wonder it's so popular!
簡單來說就是,不論你用它來做負載均衡還是反向代理,都是符合它的設計理念的,也提供了大量的功能支撐,讓你能夠在不同的業務場景下,簡單的配置就能實現一定規模的高效能應用。
實際使用的話,不論是配合 K8S
、 compose
、 Etcd
、 rancher
、 tradition docker
都是可以的。
我個人使用在 compose
的場景下,以下配置皆以此為例,其他環境配置大體一致,細節稍有不同,等回頭買幾臺微塔伺服器,再折騰個人的 K8S
吧(畢竟單節點沒什麼意思)。
適合的場景
- 如果你的機器或者 IP 資源有限,但是你卻需要部署多個站點,又期望能夠讓站點應用保持高度隔離。
- 你已經厭煩傳統方案中使用
haproxy
或者nginx
對於多個應用的前後端擴容修改要來回修改的麻煩事兒。 - 你不想在服務端掛載
SSL
,配置加密演算法,新增gzip
等本該Gateway
提供的能力,希望讓每一層的功能保持簡單純粹。 - 1分鐘內擁有有一個輕量高效的本地開發環境。
如何配置
下面以最新的穩定版本 1.6.x
為例,演示如何快速搭建你的應用閘道器, docker-compose.yml
配置檔案比較簡短,我們可以先看一下:
version: '3' services: reverse-proxy: image: traefik:1.6.6-alpine restart: always container_name: traefik ports: - 80:80 - 443:443 - 127.0.0.1:4399:4399 - 127.0.0.1:4398:4398 networks: - traefik command: traefik -c /etc/traefik.toml volumes: # 僅限標準的 Linux 環境 #- /etc/localtime:/etc/localtime #- /etc/timezone:/etc/timezone - /var/run/docker.sock:/var/run/docker.sock - ./traefik.toml:/etc/traefik.toml - ./ssl/lab.com.key:/data/ssl/lab.com.key - ./ssl/lab.com.crt:/data/ssl/lab.com.crt - ./logs:/data/logs networks: traefik: external: true 複製程式碼
檢視配置可以發現我將外部的一些檔案和配置對映到了容器內部,並對外公開了 80
、和 443
埠,預設的兩個埠被我對映到了容器的 127.0.0.1
,應用的日誌則被儲存了出來。
這裡如果使用的是標準的 Linux
發行版,可以考慮將時區和宿主機的時間對映到容器內部,保障時間一致,如果是 OSX
系統的話,可以忽略這點。
你可能會問,如果將管理埠和健康檢查的埠進行了非公開暴露,那麼怎麼才能能夠進行常規的管理檢視和健康檢查呢,答案很簡單,配合 traefik.toml
配置檔案中的 file
功能,在其中定義反向代理的規則即可,稍後會詳細描述。
Traefik 支援配置的功能很多,需要注意的是,如果你在入口點配置了 HTTP
協議自動跳轉 HTTPS
,那麼所有的入口點都會進行跳轉,你將無法提供 HTTP
服務,所以下面這段註釋掉的內容,視你的情況選擇是否使用。
[entryPoints.http] address = ":80" compress = true # 根據自己情況選擇是否進行自動跳轉 #[entryPoints.http.redirect] #entryPoint = "https" 複製程式碼
如果你使用它作為前端,裝載多個不同域名的證書,實現 SNI
功能,那麼只需要多新增一個欄位即可同時支援 lab.com
和 lab2.com
的加密訪問:
[entryPoints.https.tls] [[entryPoints.https.tls.certificates]] certFile = "/data/ssl/lab.com.crt" keyFile = "/data/ssl/lab.com.key" [[entryPoints.https.tls.certificates]] certFile = "/data/ssl/lab2.com.crt" keyFile = "/data/ssl/lab2.com.key" 複製程式碼

關於健康檢查和管理介面,預設的路徑比較醜陋,必須使用指定埠訪問,但是使用 [file]
欄位,先將預設的埠定義為你的“後端”服務地址,然後再新增兩個不同的前端路由,即可使用瀏覽器預設的埠進行訪問。
[file] [backends] [backends.dashboard] [backends.dashboard.servers.server1] url = "http://127.0.0.1:4399" [backends.ping] [backends.ping.servers.server1] url = "http://127.0.0.1:4398" [frontends] [frontends.dashboard] entrypoints = ["https"] backend = "dashboard" [frontends.dashboard.routes.route01] rule = "Host:dashboard.lab.com" [frontends.ping] entrypoints = ["https"] backend = "ping" [frontends.ping.routes.route01] rule = "Host:ping.lab.com" [frontends.ping.routes.route02] rule = "ReplacePathRegex: ^/ /ping" 複製程式碼
參考上面的例子,當你直接訪問 dashboard.lab.com
,首先會跳轉到 https
協議,然後再展示管理介面。
而原來需要訪問 xxx.xxx.xxx.xxx:4398/ping
去實現健康監控,只需要訪問 ping.lab.com
即可(這裡涉及到路由重寫)。

下面是 traefik.toml
的完整配置。
################################################################ # 全域性設定 ################################################################ # 啟用除錯模式 (預設關閉) debug = false # 日誌等級 (預設 ERROR) logLevel = "INFO" # 全域性入口點型別 (預設 http) defaultEntryPoints = ["http", "https"] # 不上報統計資訊 sendAnonymousUsage = false ################################################################ # 入口點設定 ################################################################ [entryPoints] # 預設前端 [entryPoints.http] address = ":80" compress = true # 根據自己情況選擇是否進行自動跳轉 #[entryPoints.http.redirect] #entryPoint = "https" [entryPoints.https] address = ":443" compress = true [entryPoints.https.tls] [[entryPoints.https.tls.certificates]] certFile = "/data/ssl/lab.com.crt" keyFile = "/data/ssl/lab.com.key" # 控制檯埠 [entryPoints.traefik-api] address = ":4399" # 如果不想公開控制檯,可以參考下面的配置生成你自己的 BA 賬號密碼 #[entryPoints.traefik-api.auth] #[entryPoints.traefik-api.auth.basic] #htpasswd -nb soulteary soulteary users = ["soulteary:$apr1$hVv8KPU8$IiTLEE5QYKgd4mZuCXpOD."] [entryPoints.traefik-api.redirect] entryPoint = "https" # Ping埠 [entryPoints.traefik-ping] address = ":4398" [entryPoints.traefik-ping.redirect] entryPoint = "https" ################################################################ # Traefik File configuration ################################################################ [file] [backends] [backends.dashboard] [backends.dashboard.servers.server1] url = "http://127.0.0.1:4399" [backends.ping] [backends.ping.servers.server1] url = "http://127.0.0.1:4398" [frontends] [frontends.dashboard] entrypoints = ["https"] backend = "dashboard" [frontends.dashboard.routes.route01] rule = "Host:dashboard.lab.com" [frontends.ping] entrypoints = ["https"] backend = "ping" [frontends.ping.routes.route01] rule = "Host:ping.lab.com" [frontends.ping.routes.route02] rule = "ReplacePathRegex: ^/ /ping" ################################################################ # Traefik logs configuration ################################################################ # Traefik logs # Enabled by default and log to stdout # # Optional # # Default: os.Stdout [traefikLog] filePath = "/data/logs/traefik.log" [accessLog] filePath = "/data/logs/access.log" # Format is either "json" or "common". # # Optional # Default: "common" # # format = "common" ################################################################ # 訪問日誌 配置 ################################################################ # Enable access logs # By default it will write to stdout and produce logs in the textual # Common Log Format (CLF), extended with additional fields. # # Optional # # [accessLog] # Sets the file path for the access log. If not specified, stdout will be used. # Intermediate directories are created if necessary. # # Optional # Default: os.Stdout # # filePath = "/path/to/log/log.txt" # Format is either "json" or "common". # # Optional # Default: "common" # # format = "common" ################################################################ # API 及 控制檯 配置 ################################################################ # 啟用API以及控制檯 [api] # 入口點名稱 entryPoint = "traefik-api" # 開啟控制檯(預設開啟) dashboard = true # 預設協議 defaultEntryPoints = ["http"] ################################################################ # Ping 配置 ################################################################ # 啟用 ping [ping] # 入口點名稱 entryPoint = "traefik-ping" ################################################################ # Docker 後端配置 ################################################################ # 啟用Docker後端 [docker] # Docker服務後端 endpoint = "unix:///var/run/docker.sock" # 預設域名 domain = "traefix.lab.com" # 監控docker變化 watch = true # 使用自定義模板(可選) # filename = "docker.tmpl" # 對容器預設進行暴露(預設開啟) #如果關閉選項,則容器不包含 `traefik.enable=true` 標籤,就不會被暴露 exposedbydefault = false # 使用繫結埠的IP地址取代內部私有網路(預設關閉) usebindportip = false # 使用 Swarm Mode (預設關閉) swarmmode = false # Enable docker TLS connection. # # Optional # #[docker.tls] #ca = "/etc/ssl/ca.crt" #cert = "/etc/ssl/docker.crt" #key = "/etc/ssl/docker.key" #insecureskipverify = true 複製程式碼
相關資源
如果你有更多對 Header 的定製需求,或者轉發需求,可以瞭解一下下面的文件。
當然如果你想要配合 UFW
(iptable) 使用,那麼可以參考這篇文章,直接裸跑 Traefik
。