天天看點

k8s與監控--引入traefik做後端服務的反代

前言

對于監控這塊,我們基于prometheus實作,當然做了大量的優化,包括前面所講到的配置接口化。我們整個監控的UI部分,沒有采用社群流行的grafana,而是自己實作了一套。我們後端的服務按照功能拆分了幾大塊,例如拓撲,網 絡流量,配置,中繼資料等等。拆分的好處就是可以解耦,各個子產品功能的更新不影響其他子產品。但是對于前端來說,隻暴露一個入口,引入一個反代即可。

剛開始選用了nginx,後期由于要加入鑒權的功能,nginx就不能滿足我們的需求了。這個時候基本上需求就變為選擇一個可程式設計的反代。當然我在做電商的時候,我們經常采用openresty,結合nginx和lua,可以實作。而且社群基于openresty實作了kong和orange等api網關。

但是考慮我們的場景,整個項目并沒有特别高的并發和性能要求,而且我們團隊最熟悉的是golang和python。是以選擇了

traefik

。我們可以在後期,可以寫各種的插件來滿足我們的需求。

traefik簡介

Træfɪk 是一個為了讓部署微服務更加便捷而誕生的現代HTTP反向代理、負載均衡工具。 它支援多種背景 (Docker, Swarm, Kubernetes, Marathon, Mesos, Consul, Etcd, Zookeeper, BoltDB, Rest API, file…) 來自動化、動态的應用它的配置檔案設定。

k8s與監控--引入traefik做後端服務的反代

簡單總結一下我認為traefik的特點:

  1. 官方測試traefik有nginx 85%的性能。這個性能對于一般項目足夠了,換來的是強大的程式設計能力,來從容應對各種需求。而且golang編寫,無依賴。
  2. 配置熱更新,支援多種後端。
  3. 支援叢集模式
  4. 提供了一個web UI

結合項目寫demo

我們的項目目前基本兩個需求,鑒權和反代。

配置檔案

對于反代。主要講一些配置相關。我們采用的是file。traefik對這種靜态檔案支援watcher。依舊無需重新開機程序。

主配置檔案traefik.toml

################################################################
# Global configuration
################################################################ # Enable debug mode # # Optional # Default: false # # debug = true # Log level # # Optional # Default: "ERROR" # # logLevel = "ERROR" # Entrypoints to be used by frontends that do not specify any entrypoint. # Each frontend can specify its own entrypoints. # # Optional # Default: ["http"] # # defaultEntryPoints = ["http", "https"] # Entrypoints definition # # Optional # Default:
[entryPoints]
 [entryPoints.http]
 address = ":8000" # Traefik logs # Enabled by default and log to stdout # # Optional # # [traefikLog] # Sets the filepath for the traefik log. If not specified, stdout will be used. # Intermediate directories are created if necessary. # # Optional # Default: os.Stdout # # filePath = "log/traefik.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" ################################################################
# Web configuration backend
################################################################ # Enable web configuration backend
[web]

# Web administration port # # Required #
address = ":8080" ################################################################
# Docker configuration backend
################################################################ # Enable Docker configuration backend # [docker] # Docker server endpoint. Can be a tcp or a unix socket endpoint. # # Required # Default: "unix:///var/run/docker.sock" # # endpoint = "tcp://10.10.10.10:2375" # Default domain used. # Can be overridden by setting the "traefik.domain" label on a container. # # Optional # Default: "" # # domain = "docker.localhost" # Expose containers by default in traefik # # Optional # Default: true # # exposedbydefault = true ################################################################
# File configuration backend
################################################################
[file]
 filename = "rules.toml"
 watch = true           

注意filename = "rules.toml",這個時候我把所有的代理規則寫到一個rules.toml檔案中,也算一種解耦的思路。

當然traefik也支援多檔案。就是你可以指定一個路徑,然後會将該路徑下所有rule檔案加載

[file]
 directory = "/path/to/config/"           

下面是demo中的rules.toml

[backends]
 [backends.trend]
 [backends.trend.servers]
 [backends.trend.servers.server1]
 url = "http://api.domain.com:8812"
 weight = 1
 [backends.trend.healthcheck]
 path = "/"
 interval = "10s" # Frontends
[frontends]
 [frontends.trend]
 backend = "trend"
 [frontends.trend.routes.router1]
 rule = "PathPrefixStrip:/trend"            

啟動traefik

執行

./traefik --c traefik.toml           

實際效果

通路ui:

k8s與監控--引入traefik做後端服務的反代

對于鑒權:

traefik在中間件中支援了幾種auth

  1. basic auth
  2. forward

目前forward基本能滿足我們的需求。将請求轉發到統一認證服務。

當然oauth,jwt等之類是目前不支援的,但是實作起來很簡單,增加一個中間件而已。

總結

沒有最好的技術,隻有合适的場景。

本文轉自中文社群-

k8s與監控--引入traefik做後端服務的反代

繼續閱讀