envoy实现_如何利用 Envoy 的 Postgres 过滤器实现网络可观察性
作者:Christoph Pakulski
自發(fā)布版本 1.15.0 起,Envoy 代理就開始支持 Postgres 信息解碼用于統(tǒng)計(jì)目的了。該功能為網(wǎng)絡(luò)中發(fā)生的 Postgres 事務(wù)提供聚合視圖。有了聚合視圖,Postgres 作業(yè)的種類、故障的數(shù)量和嚴(yán)重性瞬間一目了然。通過時(shí)間序列格式,請求組合出錯(cuò)率的變化也能清楚呈現(xiàn)出來。
值得留意的是,統(tǒng)計(jì)數(shù)據(jù)并不是存儲在 Postgres 的服務(wù)器中,也不是在客戶端,而是通過在網(wǎng)絡(luò)層面嗅探應(yīng)用與 Postgres 服務(wù)器的信息來往而獲得的。這篇文章會帶你摸清這個(gè)新功能的運(yùn)作原理,文末為你附上一個(gè)小練習(xí),向你演示如何運(yùn)作。如果你是一名系統(tǒng)工程師,又想知道 Envoy 在解構(gòu)網(wǎng)絡(luò)中的 Postgres 流量發(fā)揮了什么作用,那么本文就對你很有幫助了。
利用 Envoy 觀察 Postgres 網(wǎng)絡(luò)流量
將 Envoy 部署為 Postgres 服務(wù)器中的負(fù)載均衡器時(shí),所有數(shù)據(jù)庫事務(wù)都會自然通過 Envoy,所以收集數(shù)據(jù)并不困難。
此場景下,Envoy 作為負(fù)載均衡器對 Postgres 客戶端沒有什么架構(gòu)方面的要求,不管該客戶應(yīng)用使用宏大的單體架構(gòu),還是分布式的 Postgres 數(shù)據(jù)庫系統(tǒng),都可輕松部署 Envoy。就架構(gòu)而言,很重要的一點(diǎn)是, Envoy 是通往 Postgres 服務(wù)器集群的通道,故此每項(xiàng)事務(wù)都必須穿過 Envoy。如此一來,所需的 Envoy 數(shù)量相對有限,而且處于靜態(tài)。通常情況下,都會有多于一個(gè) Envoy 實(shí)例作為備用,以免單點(diǎn)故障的出現(xiàn)。引導(dǎo) Prometheus 爬取 Envoy 的指標(biāo)數(shù)據(jù)其實(shí)是很簡單的,可以通過靜態(tài)配置實(shí)現(xiàn)。
利用服務(wù)網(wǎng)格觀察 Postgres 網(wǎng)絡(luò)流量
一旦你的架構(gòu)模式開始應(yīng)用服務(wù)網(wǎng)格,每個(gè)應(yīng)用都會連上可以攔截的應(yīng)用網(wǎng)絡(luò)流量 Envoy Sidecar。與前端代理架構(gòu)相比,服務(wù)網(wǎng)格所需的 Envoy 數(shù)量更多,數(shù)據(jù)收集器必須向每個(gè) Envoy 實(shí)例逐一收集信息。此外,應(yīng)用(和相關(guān)的 Envoy Sidecar)只會短暫存在 —— 它們只會應(yīng)要求出現(xiàn),而且可以隨時(shí)關(guān)閉或移到另一個(gè)主機(jī)上運(yùn)作。追蹤 Envoy 實(shí)例和引導(dǎo)數(shù)據(jù)收集器到所有現(xiàn)行的 Envoy 實(shí)例變得愈來愈困難,不能像以前一樣通過靜態(tài)配置實(shí)現(xiàn)。服務(wù)網(wǎng)格架構(gòu)采用控制平面,能夠追蹤應(yīng)用、Sidecar 和它們的端點(diǎn),并把這些信息供給數(shù)據(jù)收集器。但效果也是一樣的。每條發(fā)生在網(wǎng)絡(luò)中的 Postgres 信息都會經(jīng)過分析,繼而產(chǎn)生統(tǒng)計(jì)數(shù)據(jù)。
Sidecar 架構(gòu)是分布式系統(tǒng)中約定俗成的標(biāo)準(zhǔn)。雖然我們現(xiàn)階段專注在它輕易收集數(shù)據(jù)這項(xiàng)優(yōu)點(diǎn)上 —— 因?yàn)檫@些 Envoy Sidecar「大隊(duì)」可將應(yīng)用和 Postgres 服務(wù)器間的流量來往通通攔截下來 —— 但實(shí)際上,它還有多不勝數(shù)的好處。比如說,Envoy 可以檢測每個(gè) Postgres 實(shí)例故障,然后將請求路由到運(yùn)作正常的服務(wù)器,并避開有問題的服務(wù)器。
運(yùn)作原理
下文將描述如何啟用簡易的前端代理方案、生成半隨機(jī)的 Postgres 流量,和用圖表表示多種網(wǎng)絡(luò)中可見的 Postgres 信息。配置代碼段突顯配置中最核心的部分。想獲得整組檔案,可以點(diǎn)此下載?[1]。設(shè)置中的個(gè)別組件,例如 Envoy、Postgres 服務(wù)器、Postgres 客戶端、Prometheus 和 Grafana,都是以容器形式創(chuàng)建,再以 Docker Compose 部署的。
Envoy 配置
第一步是啟動 Envoy 數(shù)據(jù)平面。Envoy 會在端口 1999 偵聽,然后將所有請求轉(zhuǎn)發(fā)到 Postgres 服務(wù)器。Postgres 的預(yù)設(shè)端口是 5432,當(dāng)然可以配置 Envoy 用來偵聽端口 5432,但為了強(qiáng)調(diào) Envoy 一直積極轉(zhuǎn)發(fā)數(shù)據(jù)包,所以把它調(diào)配到了不同的端口,而非預(yù)設(shè)的 Postgres 端口 5432。
通過下列代碼,在端口 1999 創(chuàng)建偵聽器,然后綁定到全部接口:
- name: postgres_listener address: socket_address: address: 0.0.0.0 port_value: 1999接下來,Filter Chain 必須附加在監(jiān)聽器上。Filter Chain 描述監(jiān)聽端口上接收到數(shù)據(jù)包后所發(fā)生的事件。這個(gè)場景的 Filter Chain 就包含了 PostgresProxy 和 TcpProxy。PostgresProxy 過濾器負(fù)責(zé)檢查 Postgres 服務(wù)器和客戶端之間來往的信息。而鏈上的最后一個(gè)過濾器 TcpProxy,亦即所謂的終端過濾器,則負(fù)責(zé)提供流量給上游主機(jī),也就是這個(gè)場景使用的 Postgres 服務(wù)器。
filter_chains:- filters: - name: envoy.filters.network.postgres_proxy typed_config: "@type": type.googleapis.com/envoy.extensions.filters.network.postgres_proxy.v3alpha.PostgresProxy stat_prefix: egress_postgres - name: envoy.filters.network.tcp_proxy typed_config: "@type": type.googleapis.com/envoy.extensions.filters.network.tcp_proxy.v3.TcpProxy stat_prefix: postgres_tcp cluster: postgres_cluster從 TcpProxy 過濾器的配置可以看出來,請求會被路由至 postgres_cluster,它的定義如下:
- name: postgres_cluster connect_timeout: 1s type: strict_dns load_assignment: cluster_name: postgres_cluster endpoints: - lb_endpoints: - endpoint: address: socket_address: address: postgres port_value: 5432集群包含了一系列標(biāo)識為 postgres 的端點(diǎn),而 Envoy 會用 DNS 來查找出該端點(diǎn)的 IP 地址。至于 DNS 的運(yùn)作,可以有多種方法。例如是單獨(dú)的 DNS 服務(wù)器,或是作為 Kubernetes 架構(gòu)的一部分。在這個(gè)場景中,Docker Compose 網(wǎng)絡(luò)提供了它的 DNS 解析。
收集數(shù)據(jù)
這個(gè)場景中, Prometheus 會負(fù)責(zé)收集統(tǒng)計(jì)數(shù)據(jù)。而 Envoy 能將統(tǒng)計(jì)數(shù)據(jù)直接以?Prometheus 格式?[2]?導(dǎo)出。所以你只需將 Prometheus 與 Envoy 對接。Prometheus 的 config 配置文件如下:
global: scrape_interval: 15sscrape_configs: - job_name: 'envoy_stats' scrape_interval: 5s metrics_path: /stats/prometheus static_configs: - targets: ['proxy:8001'] labels: group: 'services'…… proxy 是 Envoy 的 DNS 名稱,并由 Docker Compose 網(wǎng)絡(luò)解析。Envoy 的管理接口是可見于 /stats/prometheus 路徑下的端口 8001。
可觀察性
Grafana 通過圖表表示 Postgres 的種類。全部所需數(shù)據(jù)都會收集并存儲在 Prometheus 上,而 Grafana 會定期讀取該些數(shù)據(jù)。Grafana 需要兩組配置。第一組是數(shù)據(jù)源:
datasources: - name: prometheus type: prometheus access: proxy url: http://prometheus:9090讀者可以特別注意 type 和 url 兩行。type 定義了數(shù)據(jù)的格式。url 指出數(shù)據(jù)所在的端點(diǎn)。prometheus 是 DNS 名稱,必須被解析為 IP 地址。在這個(gè)場景中,Docker Compose 網(wǎng)絡(luò)會提供地址的解析。
Grafana 的第二組配置是儀表板規(guī)格(dashboard spec),基本上定義了哪些數(shù)據(jù)會顯示出來,以及如何顯示。經(jīng)過手工搭建了這個(gè)儀表板后,你會注意到這個(gè)由 Grafana 創(chuàng)建的文件將是一個(gè)特別長的 json 檔案。在這個(gè)場景中,我們會追蹤 3 組 Postgres 信息:所有前端信息(由客戶端產(chǎn)生并輸出到服務(wù)器的信息)、服務(wù)器回饋的故障,及客戶端發(fā)出的 SELECT 語句的數(shù)量。
"targets": [ { "expr": "rate(envoy_postgres_egress_postgres_messages_frontend[1m])", "interval": "", "legendFormat": "frontend msgs", "refId": "A" }, { "expr": "rate(envoy_postgres_egress_postgres_errors[1m])", "interval": "", "legendFormat": "errors", "refId": "B" }, { "expr": "rate(envoy_postgres_egress_postgres_statements_select[1m])", "interval": "", "legendFormat": "select statements", "refId": "C" }],生成流量
此次演示的最后一步就是生成 Postgres 流量。我們可以通過重復(fù)運(yùn)行幾組代碼,生成不同的 Postgres 事務(wù)。這些代碼位于代碼目錄(script directory)中。它們會循環(huán)地運(yùn)行,每一回它都會隨機(jī)生成一個(gè)數(shù)字,數(shù)值代表事務(wù)序列重復(fù)的次數(shù)。如此一來,便帶點(diǎn)半隨機(jī)性。
啟用系統(tǒng)
啟用系統(tǒng) 此次演示中的所有個(gè)別組件都是以容器形式啟用,再以 Docker Compose 將它們組合。點(diǎn)擊下列鏈接可以下載 docker-compose 文件:https://github.com/tetratelabs/envoy-postgres-stats-example。這個(gè)文件已基本列出了所有服務(wù),還有基本的網(wǎng)絡(luò)配置跟原始數(shù)據(jù)。
啟用整個(gè)系統(tǒng),只需在 envoy-postgres-stats-example 目錄中輸入
docker-compose up這個(gè)場景中所涉及的組件也會以容器形式啟用。它們通過環(huán)回接口通信,也如上所述,組件是按 docker-compose 文件所命名的。下列是以 docker-compose 建立的系統(tǒng)的概念圖表。
img練習(xí)
開始練習(xí)之前,先點(diǎn)擊以下鏈接下載全部文件:https://github.com/tetratelabs/envoy-postgres-stats-example。假設(shè) Docker 已經(jīng)在系統(tǒng)中安裝成功,啟用整個(gè)系統(tǒng)只需輸入:
docker-compose upGrafana 的用戶接口可見于端口 3000。將你的網(wǎng)頁瀏覽器對接到 docker-compose 調(diào)用的端口上。如果系統(tǒng)在本地運(yùn)行,請輸入?http://localhost:3000。如果在云端上運(yùn)行,請注明 IP 地址(確保防火墻規(guī)則允許流量通往 TCP 端口 3000)。Grafana 的預(yù)設(shè)賬號密碼是?admin/admin。
登錄 Grafana 后,選擇 PostgreSQL 儀表板(dashboard)。下列的儀表板例子包含 3 個(gè)查詢:
??前端信息的數(shù)量(由產(chǎn)生代碼的流量所產(chǎn)生的信息)?Postgres 服務(wù)器故障回復(fù)的次數(shù)?SELECT 語句的數(shù)量
引用鏈接
[1]?點(diǎn)此下載:?https://github.com/tetratelabs/envoy-postgres-stats-example[2]?Prometheus 格式:?https://songjiayang.gitbooks.io/prometheus/content/exporter/text.html
關(guān)于我們
Tetrate?是一家總部位于美國硅谷,全球化的企業(yè)級服務(wù)網(wǎng)格公司。旗艦產(chǎn)品 Tetrate Service Bridge,基于 Istio、Envoy 和 Apache SkyWalking 而構(gòu)建。我們正在招聘!點(diǎn)擊下方“閱讀原文”查看更多↓↓↓總結(jié)
以上是生活随笔為你收集整理的envoy实现_如何利用 Envoy 的 Postgres 过滤器实现网络可观察性的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: chrome浏览器解除pdf加密
- 下一篇: 前端书籍推荐之《精通JavaScript