Traefik 架構與核心概念

在開始動手寫設定檔之前,理解 Traefik 的核心架構是非常重要的。Traefik 的設計非常模組化,它的運作流程可以被拆解為幾個關鍵的元件。

Traefik 的運作流程

當一個請求 (Request) 進入 Traefik,直到它被轉送到你的後端服務 (Service),中間會經過幾個步驟。你可以把這個過程想像成一個工廠的流水線:

  1. EntryPoints (入口):接收外部的網路請求 (例如監聽 Port 80 或 443)。
  2. Routers (路由器):分析請求 (例如檢查 Host 或 Path),決定這個請求該往哪裡去。
  3. Middlewares (中介軟體):在請求到達目的地之前,對其進行修改、過濾或驗證 (例如驗證密碼、刪除網址前綴)。
  4. Services (服務):決定如何將請求負載平衡 (Load Balancing) 到實際的後端容器。
  5. Providers (提供者):Traefik 從哪裡獲取上述的配置資訊 (例如 Docker, Kubernetes, 或設定檔)。

Traefik 的配置分為兩大類:

  1. Static Configuration (靜態配置):啟動時設定,啟動後很少變更 (例如 Log 級別、監聽的 Port、Provider 的啟用)。通常寫在 traefik.ymldocker-compose.yml 的 command 中。
  2. 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) 的設定。

總結

把這些概念串起來,一個典型的請求流程如下:

  1. 使用者請求 https://api.example.com/users
  2. 請求到達 Traefik 的 EntryPoint (Port 443)。
  3. Traefik 尋找是否有 Router 的 Rule 匹配 Host(`api.example.com`).
  4. 找到匹配的 Router 後,執行該 Router 設定的 Middlewares (例如驗證 API Key)。
  5. 通過 Middleware 後,Router 將請求交給對應的 Service
  6. Service 根據負載平衡演算法,從可用的容器列表中選擇一個,將請求轉送給該 Container

理解了這個流程後,你就會發現 Traefik 的設定其實非常有邏輯且直觀。