原创 | 科普一个 Star 数为 28.5k 的云原生网关
點(diǎn)擊上方“朱小廝的博客”,選擇“設(shè)為星標(biāo)”
后臺(tái)回復(fù)"加群",加入新技術(shù)群
?
歡迎跳轉(zhuǎn)本文原文鏈接:https://honeypps.com/architect/introduction-of-traefik/
Traefik (發(fā)音和 traffic 相同,采用 Golang 編寫)是一個(gè)云原生的新型的 HTTP 反向代理、負(fù)載均衡軟件。它負(fù)責(zé)接收系統(tǒng)的請(qǐng)求,然后使用合適的組件來(lái)對(duì)這些請(qǐng)求進(jìn)行處理。Traefik 兼容所有主流的集群技術(shù),比如 Kubernetes,Docker,Docker Swarm,AWS,Mesos,Marathon,等等;并且可以同時(shí)處理多種方式。(甚至可以用于在裸機(jī)上運(yùn)行的比較舊的軟件。)
官網(wǎng)地址:https://docs.traefik.io/。代碼托管地址:https://github.com/containous/traefik,截止目前 Star 數(shù)為 28.5k。
使用 Traefik,不需要維護(hù)或者同步一個(gè)獨(dú)立的配置文件:因?yàn)橐磺卸紩?huì)自動(dòng)配置,實(shí)時(shí)操作的(無(wú)需重新啟動(dòng),不會(huì)中斷連接)。使用 Traefik,你可以花更多的時(shí)間在系統(tǒng)的開發(fā)和新功能上面,而不是在配置和維護(hù)工作狀態(tài)上面花費(fèi)大量時(shí)間。
Traefik 也被稱之為邊緣路由器(Edge Router),是你整個(gè)平臺(tái)的大門,攔截并路由每個(gè)傳入的請(qǐng)求:它知道所有的邏輯和規(guī)則,這些規(guī)則確定哪些服務(wù)處理哪些請(qǐng)求;傳統(tǒng)的反向代理需要一個(gè)配置文件,其中包含路由到你服務(wù)的所有可能路由,而 Traefik 會(huì)實(shí)時(shí)檢測(cè)服務(wù)并自動(dòng)更新路由規(guī)則,可以自動(dòng)服務(wù)發(fā)現(xiàn)。
當(dāng)啟動(dòng) Traefik 時(shí),需要定義 Entrypoints(入口點(diǎn)),然后根據(jù)連接到這些 Entrypoints 的路由(Routes)來(lái)分析傳入的請(qǐng)求,來(lái)查看他們是否與一組規(guī)則(Rules)相匹配,如果匹配,則路由可能會(huì)將請(qǐng)求通過一系列中間件(Middlewares,相當(dāng)于Java中的攔截器Interceptor/過濾器Filter的概念)轉(zhuǎn)換過后再轉(zhuǎn)發(fā)到你的服務(wù)上去。在了解 Traefik 之前有幾個(gè)核心概念我們必須要了解:
-
Providers:用來(lái)自動(dòng)發(fā)現(xiàn)平臺(tái)上的服務(wù),可以是編排工具、容器引擎或者 key-value 存儲(chǔ)等,比如 Docker、Kubernetes、File
-
Entrypoints:監(jiān)聽傳入的流量(端口等…),是網(wǎng)絡(luò)入口點(diǎn),它們定義了接收請(qǐng)求的端口(HTTP 或者 TCP)。
-
Routers:分析請(qǐng)求(host, path, headers, SSL, …),負(fù)責(zé)將傳入請(qǐng)求連接到可以處理這些請(qǐng)求的服務(wù)上去。
-
Services:將請(qǐng)求轉(zhuǎn)發(fā)給你的應(yīng)用(load balancing, …),負(fù)責(zé)配置如何獲取最終將處理傳入請(qǐng)求的實(shí)際服務(wù)。
-
Middlewares:中間件,用來(lái)修改請(qǐng)求或者根據(jù)請(qǐng)求來(lái)做出一些判斷(authentication, rate limiting, headers, …),中間件被附件到路由上,是一種在請(qǐng)求發(fā)送到你的服務(wù)之前(或者在服務(wù)的響應(yīng)發(fā)送到客戶端之前)調(diào)整請(qǐng)求的一種方法。
Traefik 主要特征如下:
-
支持動(dòng)態(tài)加載配置文件和優(yōu)雅重啟
-
自動(dòng)的服務(wù)發(fā)現(xiàn)與負(fù)載均衡
-
自動(dòng)配置ACME(Let's Encrypt)證書功能
-
支持熔斷、重試
-
內(nèi)置Web UI,管理相對(duì)方便
-
支持WebSocket、HTTP/2、gRPC
-
metrics 的支持(Rest、Prometheus、Datalog、Statsd、InfluxDB)
-
支持K8S、docker swarm等,和容器結(jié)合比較緊密
接下來(lái)講一下它的安裝、基本功能以及配置。Traefik 在 v1 與 v2 版本間差異過大,本文采用了 v2。Traefik v2.0 之后的版本在修改了很多bug之后也增加了新的特性,比如增加了TCP的支持,并且更換了新的WEB UI界面。
快速開始
我們使用 traefik:v2.2.0 作為鏡像啟動(dòng) traefik 服務(wù)。新建 traefik-v2.2.0.yaml 配置文件,內(nèi)容如下:
version: '3' services:reverse-proxy:image: traefik:2.2.0# Enables the web UI and tells Traefik to listen to docker# 啟用 webUI 并告訴 Traefik 去監(jiān)聽docker的容器實(shí)例command: --api.insecure=true --providers.dockerports:# Traefik暴露的http端口- "80:80"# webUI暴露的端口(必須指定--api.insecure=true才可以訪問)- "8080:8080"volumes:# 指定docker的sock文件來(lái)讓traefik獲取docker的事件,從而實(shí)現(xiàn)動(dòng)態(tài)負(fù)載均衡- /var/run/docker.sock:/var/run/docker.sock使用 docker-compose 命令開啟 Traefik 服務(wù):
$ docker-compose -f traefik-v2.2.0.yaml up -d reverse-proxy查看使用 docker-compose啟動(dòng)的應(yīng)用:
$ 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 一般需要一個(gè)配置文件來(lái)管理路由、服務(wù)、證書等。上面示例中,我們可以通過 docker 啟動(dòng) Traefik 時(shí)來(lái)掛載配置文件。在 Traefik 中的配置可以使用兩種不同的方式:
-
動(dòng)態(tài)配置:完全動(dòng)態(tài)的路由配置
-
靜態(tài)配置:啟動(dòng)配置
靜態(tài)配置中的元素(這些元素不會(huì)經(jīng)常更改)連接到 Providers 并定義 Treafik 將要監(jiān)聽的 Entrypoints。在 Traefik 中有三種方式定義靜態(tài)配置:在配置文件中、在命令行參數(shù)中、通過環(huán)境變量傳遞。動(dòng)態(tài)配置包含定義系統(tǒng)如何處理請(qǐng)求的所有配置內(nèi)容,這些配置是可以改變的,而且是無(wú)縫熱更新的,沒有任何請(qǐng)求中斷或連接損耗。
Traefik 的配置結(jié)構(gòu)圖如下:
使用 docker run traefik[:version] --help可查看 Traefik 的配置參數(shù)。
我們可以使用 http://localhost:8080/ 來(lái)訪問 Traefik 官方Dashboard,效果圖如下:
路由
接下來(lái)我們使用 docker-compose 啟動(dòng)一個(gè)簡(jiǎn)單的 http 服務(wù),配置文件(test-service.yaml)如下:
version: '3' services:whoami:image: containous/whoamilabels:- "traefik.http.routers.whoami.rule=Host(`whoami.docker.localhost`)"啟動(dòng)服務(wù):
$ 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 這個(gè) http 服務(wù)做了什么事情呢?1. 暴露了一個(gè) http 服務(wù),主要提供一些 header 以及 ip 信息;2. 配置了容器的 labels,設(shè)置該服務(wù)的 Host 為 whoami.docker.localhost,給 traefik 提供標(biāo)記。
此時(shí)我們可以通過 curl -H Host:whoami.docker.localhost http://localhost 來(lái)訪問 whoami 服務(wù),我們使用 curl 做測(cè)試:
$ 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服務(wù)正常訪問。此時(shí)如果把 Host 配置為自己的域名,則已經(jīng)可以使用自己的域名來(lái)提供服務(wù)。在Dashboard中可以看到對(duì)應(yīng)的 HTTP Routers:
如果不設(shè)置 Host,訪問是會(huì)失敗的。
$ 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細(xì)表羅列了 Traefik 可用的路由規(guī)則:
| Headers(key, value) | 檢查 headers 中是否有一個(gè)鍵為 key值為value`的鍵值對(duì) |
| HeadersRegexp(key, regexp) | 檢查 headers 中是否有一個(gè)鍵為 key,值匹配正則表達(dá)式 regexp的鍵值對(duì) |
| Host(example.com, ...) | 檢查請(qǐng)求的域名是否包含在給定的 domains 域名中 |
| HostRegexp(example.com, {subdomain:[a-z]+}.example.com, ...) | 檢查請(qǐng)求的域名是否匹配給定的 regexp正則表達(dá)式 |
| Method(GET, ...) | 檢查請(qǐng)求的方法是否包含在給定的 methods (GET, POST, PUT, DELETE, PATCH) 中 |
| Path(/path, /articles/{cat:[a-z]+}/{id:[0-9]+}, ...) | 匹配確定的請(qǐng)求路徑,它接受一系列文字和正則表達(dá)式路徑 |
| PathPrefix(/products/, /articles/{cat:[a-z]+}/{id:[0-9]+}) | 匹配請(qǐng)求前綴路徑,它接受一系列文字和正則表達(dá)式前綴路徑 |
| Query(foo=bar, bar=baz) | 匹配查詢字符串參數(shù),接受key=value的鍵值對(duì)序列 |
我們可以使用 docker-compose up --scale命令來(lái)對(duì)容器橫向擴(kuò)容,下面將單機(jī)擴(kuò)容成2臺(tái):
$ 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此時(shí)再訪問curl http://localhost -H Host:whoami.docker.localhost時(shí)就會(huì)自動(dòng)負(fù)載均衡到2個(gè)不同的實(shí)例上去了。
在 Dashboard 中也有相關(guān)記錄:
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
歡迎跳轉(zhuǎn)本文原文鏈接:https://honeypps.com/architect/introduction-of-traefik/
想知道更多?掃描下面的二維碼關(guān)注我
后臺(tái)回復(fù)”加群“獲取公眾號(hào)專屬群聊入口
【原創(chuàng)系列 | 精彩推薦】
-
Paxos、Raft不是一致性算法嘛?
-
越說(shuō)越迷糊的CAP
-
分布式事務(wù)科普——初識(shí)篇
-
分布式事務(wù)科普——終結(jié)篇
-
面試官居然問我Raft為什么會(huì)叫做Raft!
-
面試官給我挖坑:URI中的//有什么用
-
面試官給我挖坑:a[i][j]和a[j][i]有什么區(qū)別?
-
面試官給我挖坑:單機(jī)并發(fā)TCP連接數(shù)到底有多少?
-
網(wǎng)關(guān)Zuul科普
-
網(wǎng)關(guān)Spring Cloud?Gateway科普
-
Nginx架構(gòu)原理科普
-
OpenResty概要及原理科普
-
微服務(wù)網(wǎng)關(guān) Kong 科普
朕已閱?
總結(jié)
以上是生活随笔為你收集整理的原创 | 科普一个 Star 数为 28.5k 的云原生网关的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 原创 | 微服务网关 Kong 科普
- 下一篇: 介绍两款Docker可视化工具