Traefik 2.0 正式發布!
- 2019 年 10 月 5 日
- 筆記

來源:k8s技術圈
翻譯:陽明
寄予厚望的 Traefik 2.0 經過了一年的等待,今天終於正式發布了,此次大版本的更新添加了許多新功能,特別是大家都期望的支援 TCP 的功能。接下來我們就來探索下 Traefik 2.0 中有哪些新增的功能呢?
01
SNI 路由和多協議埠的 TCP

在之前 2.0 alpha 聲明中就討論過這個最重要的功能,但實際上這個功能是第10個 feature request,所以花了很長時間來討論並實現這個新功能。
下面是一個簡單的示例配置 - 使用最新支援的 YAML 文件格式,將請求路由到一個資料庫上面去:
tcp: routers: to-database: entrypoints: - database-entrypoint rule: HostSNI(`*`) service: database-service services: database-service: loadBalancer: servers: - address: xx.xx.xx.xx:xx
上面這個配置示例表示每個以 database-entrypoint 結尾的請求都將被路由到 database-service 這個服務上去。
此外通過 TLS,Traefik 還可以根據 SNI 來路由 TCP 請求。在下面示例中,Traefik 就將根據 SNI 將請求路由到兩個資料庫:
tcp: routers: to-db-1: entrypoints: - web-secure rule: "HostSNI(`db1.domain`)" service: "db1" tls: {} to-db-2: entrypoints: - web-secure rule: "HostSNI(`db2.domain`)" service: "db2" tls: {}另外 Traefik 還是支援 HTTP 和 TCP 在同一個埠上,如果你希望獲得相同的入口的同時獲取 HTTP 和 TCP 請求,那麼 Traefik 可以很完美的來處理它。
tcp: routers: to-db-1: entrypoints: - web-secure rule: "HostSNI(`db1.domain`)" service: "db-1" tls: {} http: routers: to-db1-dashboard: entrypoints: - web-secure rule: "Host(`dashboard.db1.domain`)" service: "db1-dashboard" tls: {}比如上面這個示例中, dashboard.db1.domain 上的 HTTP 請求將路由到資料庫的 Dashboard 服務上,而上面的 db1.domain 上的 TCP 請求將路由到資料庫上面去,這個功能是不是非常贊??。
02
使用中間件自定義路由

在 Traefik 2.0 中還引入了中間件功能,可以用於將請求路由到目的地之前或之後來調整請求。
首先我們可以聲明一個中間件,在任意數量的路由上面都可以重用它們。下面我們來演示下如何配置中間件,聲明一個 BasicAuth 中間件來控制對我們服務的訪問(這次使用 TOML 來配置):
# 為兩個用戶聲明一個 basicauth 的中間件 [http.middlewares.test-auth.basicAuth] users = ["user1:hashed", "user2:hashed"] # 將上面的中間件應用到路由上面去 [http.routers.my-router.to-service] rule = "host(`my-protected.domain`)" middlewares = ["test-auth"] service = "service1"
此外可以聲明一個鏈來組合綁定這些中間件,並反覆使用它們,對於 Kubernetes 用戶來說,還可以使用 Traefik 的新 CRD 來進行更加清晰明了的配置,而不需要複雜的註解。(可以在文檔中找到有關 IngressRoute 對象的更多資訊。)如下所示:
apiVersion: traefik.containo.us/v1alpha1 kind: IngressRoute metadata: name: test namespace: default spec: entryPoints: - web routes: - match: Host(`mydomain`) kind: Rule services: - name: whoami port: 80 middlewares: - name: secured --- apiVersion: traefik.containo.us/v1alpha1 kind: Middleware metadata: name: secured spec: chain: middlewares: - name: https-only - name: known-ips - name: auth-users --- apiVersion: traefik.containo.us/v1alpha1 kind: Middleware metadata: name: auth-users spec: basicAuth: secret: secretUsers # 兼容 K8S secrets 對象 --- apiVersion: traefik.containo.us/v1alpha1 kind: Middleware metadata: name: https-only spec: redirectScheme: scheme: https --- apiVersion: traefik.containo.us/v1alpha1 kind: Middleware metadata: name: known-ips spec: ipWhiteList: sourceRange: - 192.168.1.7 - 127.0.0.1/32
上面示例中 secured 這個中間件就是有 https-only、know-ips、auth-users 這3個中間件組成的一個鏈式中間件。
而且在 Traefik 中內置了許多中間件:路徑操作、多種身份驗證機制、緩衝、斷路器、重試、壓縮、錯誤處理、headers、IP 白名單、限速、重定向等。此外官方還重新設計了程式碼架構,可以讓開發者更加容易提供第三方的中間件。
03
全新的 Dashboard
設計了全新的 WebUI,目標是向用戶一目了然地展示集群上資訊,還希望顯示可以啟用的哪些功能特性。

由於和之前版本的使用流程發生了很大變化,所以希望能夠在 WebUI 上面可以顯示服務的詳細配置資訊。

04
金絲雀發布

另外一個期待已久的功能特性 - 金絲雀發布、A/B 測試,現在在 Traefik 2.0 中以服務負載均衡的形式進行了支援。可以將服務負載均衡器看成負責將請求轉發到實際服務的虛擬服務,下面讓我們來看一個經典的場景,現在有一個路由到一個 API:
http: routers: my-route: rule: "Host(`my.domain`)" service: my-api-v1 services: my-api-v1: loadBalancer: servers: - url: "http://private-ip-server-1/"
現在我們要部署該服務的一個新版本,但是希望可以逐步部署,比如先部署大約1/3的請求。我們這裡就需要使用一個新的 ID(這裡可以用 my-api-v2)來部署一個新的服務:
http: services: my-api-v2: loadBalancer: servers: - url: "http://private-ip-server-2/"
然後我們需要定義一個服務負載均衡器(我們這裡叫 cannary-api),並定義每個版本的比例,而不是直接指向新版本:
http: services: canary-api: weighted: services: - name: my-api-v1 weight: 3 - name: my-api-v2 weight: 1
最後,記得把路由指向這個 canary-api 服務:
http: routers: my-route: rule: "Host(`my.domain`)" service: canary-api
之後,我們不需要重新部署真正的服務就可以更新權重,當然還可以對它們進行擴容,這都不會對金絲雀部署本身產生任何的影響。
05
流量複製

金絲雀部署並不是服務系列功能中唯一的一種可以使用的功能,Traefik 2.0 還引入了鏡像服務,一種可以將流入流量複製並同時將其發送給其他服務的方法,鏡像服務可以獲得給定百分比的請求同時也會忽略這部分請求的響應:
[http.services.mirrored-api] [http.services.mirrored-api.mirroring] service = "api" [[http.services.mirrored-api.mirroring.mirrors]] name = "api-v2" percent = 10 [http.services.api] [http.services.api.loadBalancer] [[http.services.api.loadBalancer.servers]] url = "http://private-ip-server-1/" [http.services.api-v2] [http.services.api-v2.loadBalancer] [[http.services.api-v2.loadBalancer.servers]] url = "http://private-ip-server-2/"
上面這個示例中,我們就可以複製10%的請求發送給鏡像。
當然除了上面提到的這些新特性之外,Traefik 2.0 還有很多新的特性和增強功能,我們這裡就不一一列舉了,更多的資訊我們可以查看官方文檔了解更多:https://docs.traefik.io/v2.0/。
06
遷移
Traefik 2.0 有了這麼多的新功能和增強功能,為了幫助用戶可以從 1.x 版本過渡到新版本,官方提供了一個遷移指南,地址:https://docs.traefik.io/v2.0/migration/v1-to-v2/。
對於 Kubernetes 用戶,還提供了一個遷移工具來幫助你將 Ingress 對象轉換成新的 IngressRoute 格式,工具地址:https://github.com/containous/traefik-migration-tool。