Traefik 架構與核心概念
在開始動手寫設定檔之前,理解 Traefik 的核心架構是非常重要的。Traefik 的設計非常模組化,它的運作流程可以被拆解為幾個關鍵的元件。
Traefik 的運作流程
當一個請求 (Request) 進入 Traefik,直到它被轉送到你的後端服務 (Service),中間會經過幾個步驟。你可以把這個過程想像成一個工廠的流水線:
- EntryPoints (入口):接收外部的網路請求 (例如監聽 Port 80 或 443)。
- Routers (路由器):分析請求 (例如檢查 Host 或 Path),決定這個請求該往哪裡去。
- Middlewares (中介軟體):在請求到達目的地之前,對其進行修改、過濾或驗證 (例如驗證密碼、刪除網址前綴)。
- Services (服務):決定如何將請求負載平衡 (Load Balancing) 到實際的後端容器。
- Providers (提供者):Traefik 從哪裡獲取上述的配置資訊 (例如 Docker, Kubernetes, 或設定檔)。
Traefik 的配置分為兩大類:
- Static Configuration (靜態配置):啟動時設定,啟動後很少變更 (例如 Log 級別、監聽的 Port、Provider 的啟用)。通常寫在
traefik.yml或docker-compose.yml的 command 中。 - Dynamic Configuration (動態配置):包含了 Routers, Middlewares, Services 的定義。這些配置是由 Provider 動態提供的,可以隨時變更而無需重啟 Traefik。
我們來詳細看看每個元件的角色:
Providers (配置提供者)
Provider 是 Traefik 的「消息來源」。Traefik 本身是無狀態的,它需要 Provider 告訴它現在有哪些服務在運行。
常見的 Providers 包括:
- Docker: Traefik 監聽 Docker Daemon 的事件。當你啟動一個帶有特定 Label 的容器時,Traefik 會自動讀取這些 Label 並建立對應的路由。
- Kubernetes CRD / Ingress: 在 K8s 環境中,Traefik 讀取 Ingress 或 CRD 資源來設定路由。
- File: 從一個 YAML 或 TOML 檔案讀取動態配置。這在設定一些非容器服務或 TLS 憑證時很有用。
EntryPoints (入口點)
EntryPoints 定義了 Traefik 監聽的網路入口。最常見的設定是:
web: 監聽 TCP Port 80 (HTTP)websecure: 監聽 TCP Port 443 (HTTPS)
所有的流量都必須先通過某個 EntryPoint 才能進入 Traefik 的處理流程。你也應該在 EntryPoint 層級設定 HTTP 到 HTTPS 的全域轉址 (Redirection)。
Routers (路由器)
Router 是 Traefik 的大腦。它負責將傳入的請求與你設定的規則進行「匹配 (Match)」。
一個 Router 包含以下關鍵資訊:
- Rule (規則):定義哪樣的請求符合這個 Router。常見的規則有:
- Host(`example.com`): 匹配網域。
- PathPrefix(`/api`): 匹配路徑前綴。
- Headers(`Content-Type`, `application/json`): 匹配標頭。
- 規則可以使用邏輯運算子組合,例如 Host(`example.com`) && PathPrefix(`/api`).
- Middlewares (中介軟體):指定在請求轉送前要經過哪些處理。
- Service (服務):指定匹配成功後,流量要交給哪個 Service 處理。
- TLS (HTTPS):設定這個 Router 是否需要 TLS 加密,以及使用哪個 Resolver 來申請憑證。
Middlewares (中介軟體)
Middleware 位於 Router 和 Service 之間。它就像是一個個的過濾器或加工站。
Middlewares 可以修改請求 (Request) 或回應 (Response)。你可以將多個 Middleware 串聯起來 (Chain) 使用。
常見用途:
- BasicAuth: 阻擋沒有正確帳號密碼的請求。
- RedirectScheme: 強制將 HTTP 重導向到 HTTPS。
- StripPrefix: 將網址
/api/users在轉送到後端前改寫為/users。 - RateLimit: 限制每秒請求次數。
Services (服務)
Service 負責配置如何到達實際的後端 (Backends)。在 Docker 環境中,一個 Service 通常對應到一組提供相同功能的容器。
Service 的主要功能是 負載平衡 (Load Balancing)。當你透過 docker-compose 擴展 (Scale) 某個服務的容器數量時 (例如從 1 個變成 3 個),Traefik 的 Service 會自動偵測到這 3 個容器的 IP,並根據演算法 (預設是 Round Robin 輪詢) 將流量平均分配給它們。
Service 也負責健康檢查 (Health Check) 和 Session 黏著 (Sticky Sessions) 的設定。
總結
把這些概念串起來,一個典型的請求流程如下:
- 使用者請求
https://api.example.com/users。 - 請求到達 Traefik 的 EntryPoint (Port 443)。
- Traefik 尋找是否有 Router 的 Rule 匹配 Host(`api.example.com`).
- 找到匹配的 Router 後,執行該 Router 設定的 Middlewares (例如驗證 API Key)。
- 通過 Middleware 後,Router 將請求交給對應的 Service。
- Service 根據負載平衡演算法,從可用的容器列表中選擇一個,將請求轉送給該 Container。
理解了這個流程後,你就會發現 Traefik 的設定其實非常有邏輯且直觀。