前言
對于監控這塊,我們基于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…) 來自動化、動态的應用它的配置檔案設定。

簡單總結一下我認為traefik的特點:
- 官方測試traefik有nginx 85%的性能。這個性能對于一般項目足夠了,換來的是強大的程式設計能力,來從容應對各種需求。而且golang編寫,無依賴。
- 配置熱更新,支援多種後端。
- 支援叢集模式
- 提供了一個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:
對于鑒權:
traefik在中間件中支援了幾種auth
- basic auth
- forward
目前forward基本能滿足我們的需求。将請求轉發到統一認證服務。
當然oauth,jwt等之類是目前不支援的,但是實作起來很簡單,增加一個中間件而已。
總結
沒有最好的技術,隻有合适的場景。
本文轉自中文社群-
k8s與監控--引入traefik做後端服務的反代