原创 | 科普一个 Star 数为 28.5k 的云原生网关
點擊上方“朱小廝的博客”,選擇“設為星標”
后臺回復"加群",加入新技術群
?
歡迎跳轉本文原文鏈接:https://honeypps.com/architect/introduction-of-traefik/
Traefik (發音和 traffic 相同,采用 Golang 編寫)是一個云原生的新型的 HTTP 反向代理、負載均衡軟件。它負責接收系統的請求,然后使用合適的組件來對這些請求進行處理。Traefik 兼容所有主流的集群技術,比如 Kubernetes,Docker,Docker Swarm,AWS,Mesos,Marathon,等等;并且可以同時處理多種方式。(甚至可以用于在裸機上運行的比較舊的軟件。)
官網地址:https://docs.traefik.io/。代碼托管地址:https://github.com/containous/traefik,截止目前 Star 數為 28.5k。
使用 Traefik,不需要維護或者同步一個獨立的配置文件:因為一切都會自動配置,實時操作的(無需重新啟動,不會中斷連接)。使用 Traefik,你可以花更多的時間在系統的開發和新功能上面,而不是在配置和維護工作狀態上面花費大量時間。
Traefik 也被稱之為邊緣路由器(Edge Router),是你整個平臺的大門,攔截并路由每個傳入的請求:它知道所有的邏輯和規則,這些規則確定哪些服務處理哪些請求;傳統的反向代理需要一個配置文件,其中包含路由到你服務的所有可能路由,而 Traefik 會實時檢測服務并自動更新路由規則,可以自動服務發現。
當啟動 Traefik 時,需要定義 Entrypoints(入口點),然后根據連接到這些 Entrypoints 的路由(Routes)來分析傳入的請求,來查看他們是否與一組規則(Rules)相匹配,如果匹配,則路由可能會將請求通過一系列中間件(Middlewares,相當于Java中的攔截器Interceptor/過濾器Filter的概念)轉換過后再轉發到你的服務上去。在了解 Traefik 之前有幾個核心概念我們必須要了解:
-
Providers:用來自動發現平臺上的服務,可以是編排工具、容器引擎或者 key-value 存儲等,比如 Docker、Kubernetes、File
-
Entrypoints:監聽傳入的流量(端口等…),是網絡入口點,它們定義了接收請求的端口(HTTP 或者 TCP)。
-
Routers:分析請求(host, path, headers, SSL, …),負責將傳入請求連接到可以處理這些請求的服務上去。
-
Services:將請求轉發給你的應用(load balancing, …),負責配置如何獲取最終將處理傳入請求的實際服務。
-
Middlewares:中間件,用來修改請求或者根據請求來做出一些判斷(authentication, rate limiting, headers, …),中間件被附件到路由上,是一種在請求發送到你的服務之前(或者在服務的響應發送到客戶端之前)調整請求的一種方法。
Traefik 主要特征如下:
-
支持動態加載配置文件和優雅重啟
-
自動的服務發現與負載均衡
-
自動配置ACME(Let's Encrypt)證書功能
-
支持熔斷、重試
-
內置Web UI,管理相對方便
-
支持WebSocket、HTTP/2、gRPC
-
metrics 的支持(Rest、Prometheus、Datalog、Statsd、InfluxDB)
-
支持K8S、docker swarm等,和容器結合比較緊密
接下來講一下它的安裝、基本功能以及配置。Traefik 在 v1 與 v2 版本間差異過大,本文采用了 v2。Traefik v2.0 之后的版本在修改了很多bug之后也增加了新的特性,比如增加了TCP的支持,并且更換了新的WEB UI界面。
快速開始
我們使用 traefik:v2.2.0 作為鏡像啟動 traefik 服務。新建 traefik-v2.2.0.yaml 配置文件,內容如下:
version: '3' services:reverse-proxy:image: traefik:2.2.0# Enables the web UI and tells Traefik to listen to docker# 啟用 webUI 并告訴 Traefik 去監聽docker的容器實例command: --api.insecure=true --providers.dockerports:# Traefik暴露的http端口- "80:80"# webUI暴露的端口(必須指定--api.insecure=true才可以訪問)- "8080:8080"volumes:# 指定docker的sock文件來讓traefik獲取docker的事件,從而實現動態負載均衡- /var/run/docker.sock:/var/run/docker.sock使用 docker-compose 命令開啟 Traefik 服務:
$ docker-compose -f traefik-v2.2.0.yaml up -d reverse-proxy查看使用 docker-compose啟動的應用:
$ docker-compose -f traefik-v2.2.0.yaml psName Command State Ports ------------------------------------------------------------------------------------------------------------- traefik_reverse-proxy_1 /entrypoint.sh --api.insec ... Up 0.0.0.0:80->80/tcp, 0.0.0.0:8080->8080/tcpTraefik 一般需要一個配置文件來管理路由、服務、證書等。上面示例中,我們可以通過 docker 啟動 Traefik 時來掛載配置文件。在 Traefik 中的配置可以使用兩種不同的方式:
-
動態配置:完全動態的路由配置
-
靜態配置:啟動配置
靜態配置中的元素(這些元素不會經常更改)連接到 Providers 并定義 Treafik 將要監聽的 Entrypoints。在 Traefik 中有三種方式定義靜態配置:在配置文件中、在命令行參數中、通過環境變量傳遞。動態配置包含定義系統如何處理請求的所有配置內容,這些配置是可以改變的,而且是無縫熱更新的,沒有任何請求中斷或連接損耗。
Traefik 的配置結構圖如下:
使用 docker run traefik[:version] --help可查看 Traefik 的配置參數。
我們可以使用 http://localhost:8080/ 來訪問 Traefik 官方Dashboard,效果圖如下:
路由
接下來我們使用 docker-compose 啟動一個簡單的 http 服務,配置文件(test-service.yaml)如下:
version: '3' services:whoami:image: containous/whoamilabels:- "traefik.http.routers.whoami.rule=Host(`whoami.docker.localhost`)"啟動服務:
$ docker-compose -f test-service.yaml up -d whoami $ docker-compose -f test-service.yaml psName Command State Ports ------------------------------------------- traefik_whoami_1 /whoami Up 80/tcpwhoami 這個 http 服務做了什么事情呢?1. 暴露了一個 http 服務,主要提供一些 header 以及 ip 信息;2. 配置了容器的 labels,設置該服務的 Host 為 whoami.docker.localhost,給 traefik 提供標記。
此時我們可以通過 curl -H Host:whoami.docker.localhost http://localhost 來訪問 whoami 服務,我們使用 curl 做測試:
$ curl -H Host:whoami.docker.localhost http://localhost Hostname: e9a4bd2e0a7a IP: 127.0.0.1 IP: 172.19.0.3 RemoteAddr: 172.19.0.2:33358 GET / HTTP/1.1 Host: whoami.docker.localhost User-Agent: curl/7.54.0 Accept: */* Accept-Encoding: gzip X-Forwarded-For: 172.19.0.1 X-Forwarded-Host: whoami.docker.localhost X-Forwarded-Port: 80 X-Forwarded-Proto: http X-Forwarded-Server: f660478db1e4 X-Real-Ip: 172.19.0.1服務正常訪問。此時如果把 Host 配置為自己的域名,則已經可以使用自己的域名來提供服務。在Dashboard中可以看到對應的 HTTP Routers:
如果不設置 Host,訪問是會失敗的。
$ curl -i http://localhost HTTP/1.1 404 Not Found Content-Type: text/plain; charset=utf-8 X-Content-Type-Options: nosniff Date: Wed, 29 Apr 2020 09:44:56 GMT Content-Length: 19404 page not found細表羅列了 Traefik 可用的路由規則:
| Headers(key, value) | 檢查 headers 中是否有一個鍵為 key值為value`的鍵值對 |
| HeadersRegexp(key, regexp) | 檢查 headers 中是否有一個鍵為 key,值匹配正則表達式 regexp的鍵值對 |
| Host(example.com, ...) | 檢查請求的域名是否包含在給定的 domains 域名中 |
| HostRegexp(example.com, {subdomain:[a-z]+}.example.com, ...) | 檢查請求的域名是否匹配給定的 regexp正則表達式 |
| Method(GET, ...) | 檢查請求的方法是否包含在給定的 methods (GET, POST, PUT, DELETE, PATCH) 中 |
| Path(/path, /articles/{cat:[a-z]+}/{id:[0-9]+}, ...) | 匹配確定的請求路徑,它接受一系列文字和正則表達式路徑 |
| PathPrefix(/products/, /articles/{cat:[a-z]+}/{id:[0-9]+}) | 匹配請求前綴路徑,它接受一系列文字和正則表達式前綴路徑 |
| Query(foo=bar, bar=baz) | 匹配查詢字符串參數,接受key=value的鍵值對序列 |
我們可以使用 docker-compose up --scale命令來對容器橫向擴容,下面將單機擴容成2臺:
$ docker-compose -f test-service.yaml up -d --scale whoami=2 WARNING: Found orphan containers (traefik_reverse-proxy_1) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up. Starting traefik_whoami_1 ... done Creating traefik_whoami_2 ... done此時再訪問curl http://localhost -H Host:whoami.docker.localhost時就會自動負載均衡到2個不同的實例上去了。
在 Dashboard 中也有相關記錄:
References
https://docs.traefik.io/
https://www.cnblogs.com/xiao987334176/p/12447783.html
https://www.qikqiak.com/post/traefik-2.1-101/
https://github.com/shfshanyue/op-note/blob/master/traefik.md
歡迎跳轉本文原文鏈接:https://honeypps.com/architect/introduction-of-traefik/
想知道更多?掃描下面的二維碼關注我
后臺回復”加群“獲取公眾號專屬群聊入口
【原創系列 | 精彩推薦】
-
Paxos、Raft不是一致性算法嘛?
-
越說越迷糊的CAP
-
分布式事務科普——初識篇
-
分布式事務科普——終結篇
-
面試官居然問我Raft為什么會叫做Raft!
-
面試官給我挖坑:URI中的//有什么用
-
面試官給我挖坑:a[i][j]和a[j][i]有什么區別?
-
面試官給我挖坑:單機并發TCP連接數到底有多少?
-
網關Zuul科普
-
網關Spring Cloud?Gateway科普
-
Nginx架構原理科普
-
OpenResty概要及原理科普
-
微服務網關 Kong 科普
朕已閱?
總結
以上是生活随笔為你收集整理的原创 | 科普一个 Star 数为 28.5k 的云原生网关的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 原创 | 微服务网关 Kong 科普
- 下一篇: Java 代码精简之道 | 长文