隨著應(yīng)用組件的可觀測(cè)性逐漸受到重視,Apache APISIX 引入插件機(jī)制豐富了可觀測(cè)數(shù)據(jù)源。然而,這些數(shù)據(jù)分散在多個(gè)平臺(tái),形成了數(shù)據(jù)孤島。本文旨在闡述如何利用 DeepFlow 基于 eBPF 的零侵?jǐn)_特性構(gòu)建 APISIX 可觀測(cè)性解決方案,在此基礎(chǔ)上統(tǒng)一集成 APISIX 插件已有的豐富數(shù)據(jù)源,消除孤島、構(gòu)建統(tǒng)一的可觀測(cè)性平臺(tái),以全面監(jiān)控和分析 APISIX 網(wǎng)關(guān)。通過(guò) DeepFlow,APISIX 可以實(shí)現(xiàn)從流量監(jiān)控、追蹤分析、到性能優(yōu)化的全面可觀測(cè)性,消除數(shù)據(jù)分散并提供中心化的監(jiān)控視圖,加速故障排查和性能調(diào)優(yōu),讓 DevOps 和 SRE 團(tuán)隊(duì)的工作更加高效。本文將重點(diǎn)梳理 APISIX 的追蹤數(shù)據(jù)、指標(biāo)數(shù)據(jù)、訪日日志及性能剖析數(shù)據(jù)如何對(duì)接 DeepFlow。
基于 DeepFlow 構(gòu)建 APISIX 的統(tǒng)一可觀測(cè)性能力
01
安裝 APISIX 和 DeepFlow
基于 DeepFlow 建構(gòu) APISIX 的統(tǒng)一可觀測(cè)性能力,需要先將 DeepFlow 及 APISIX 都部署起來(lái)。本文為了方便,將 DeepFlow 和 APISIX 都以 K8s 服務(wù)的形式部署在一個(gè) All-in-One 的 K8s 集群中,整個(gè)部署過(guò)程大概 5 分鐘左右完成。詳細(xì)的部署過(guò)程,參考 DeepFlow 官方部署文檔[1]及 APISIX 官方部署文檔[2]。
注意:為了發(fā)揮 DeepFlow 基于 eBPF 的可觀測(cè)性能力,請(qǐng)確保服務(wù)器 Linux 操作系統(tǒng)內(nèi)核在 4.14 之上。
02
分布式追蹤
使用 DeepFlow 實(shí)現(xiàn) APISIX 及后端服務(wù)的分布式追蹤能力有兩種方案:利用 eBPF,DeepFlow 可以在不修改 APISIX 及后端服務(wù)配置及代碼的前提下實(shí)現(xiàn)開(kāi)箱即用的 RPC 粒度分布式追蹤;而當(dāng)后端服務(wù)已具備 APM(Application Performance Monitoring) 能力 —— 比如已經(jīng)使用了 OpenTelemetry 或者 SkyWalking 等工具時(shí),可結(jié)合 APISIX 的 Tracers 插件,將所有追蹤數(shù)據(jù)統(tǒng)一集成到 DeepFlow,實(shí)現(xiàn)全鏈路的應(yīng)用函數(shù)粒度的分布式追蹤。
DeepFlow 中 APISIX 及后端服務(wù)實(shí)現(xiàn)分布式追蹤的兩種方式
方式一:DeepFlow eBPF AutoTracing
DeepFlow 的分布式追蹤(AutoTracing)能力是開(kāi)箱即用的,無(wú)需 APISIX 開(kāi)啟任何插件,僅需要將 deepflow-agent 部署在 APSIX 所在的服務(wù)器即可。在 Grafana 中找到 DeepFlow 提供的 Distributed Tracing Dashboard,即可對(duì)某一個(gè)調(diào)用點(diǎn)擊發(fā)起追蹤,并看到這個(gè)調(diào)用在 APISIX 及其后端服務(wù)中的全鏈路追蹤過(guò)程。如下圖所示:
①:通過(guò) nodeport 的形式訪問(wèn)到 APISIX 網(wǎng)關(guān)服務(wù)所在 K8s Node 的端口
②:進(jìn)入到 APISIX 網(wǎng)關(guān)服務(wù)所對(duì)應(yīng)的 POD 的網(wǎng)卡
③:進(jìn)入到 APISIX 網(wǎng)關(guān)服務(wù)中的 OpenResty 進(jìn)程
④:完成業(yè)務(wù)處理,經(jīng)由 OpenResty 進(jìn)程將請(qǐng)求轉(zhuǎn)發(fā)給后端服務(wù)
⑤:經(jīng)由 APISIX 網(wǎng)關(guān)服務(wù)所對(duì)應(yīng)的 POD 網(wǎng)卡轉(zhuǎn)發(fā)
⑥/⑦:將請(qǐng)求轉(zhuǎn)發(fā)給后端服務(wù)
DeepFlow eBPF AutoTracing
方式二:DeepFlow eBPF + OpenTelemetry
此方式為 APISIX 利用 OpenTelemetry 插件生成 Trace 數(shù)據(jù),后端服務(wù)也具備 APM 能力并且可將生成的 Trace 數(shù)據(jù)轉(zhuǎn)化為 OpenTelemetry 格式。當(dāng) APISIX 與后端服務(wù)都將 Trace 數(shù)據(jù)發(fā)送給 DeepFlow 時(shí),DeepFlow 能夠生成包含APM 應(yīng)用 SPAN、eBPF 系統(tǒng) SPAN、cBPF 網(wǎng)絡(luò) SPAN 的無(wú)盲點(diǎn)全棧調(diào)用鏈追蹤火焰圖。
當(dāng)我們希望得到應(yīng)用進(jìn)程內(nèi)部函數(shù)粒度的分布式追蹤鏈路,或者后端服務(wù)在處理一個(gè)調(diào)用時(shí)使用了線程池(會(huì)導(dǎo)致 DeepFlow AutoTracing 斷鏈)時(shí),可以采用這種方式。
1. 部署具備 APM 能力的后端服務(wù)
為了展示完整的追蹤效果,我們首先在 APISIX 網(wǎng)關(guān)后面部署了一個(gè)支持 OpenTelemetry 能力的 Demo 應(yīng)用。Demo 應(yīng)用的部署可參考:DeepFlow Demo - 一鍵部署基于 Spring Boot 編寫(xiě)的五個(gè)微服務(wù)組成的 WebShop 應(yīng)用[3]。在 APISIX 上創(chuàng)建訪問(wèn)后端服務(wù)的路由,訪問(wèn)域名為 apisix.deepflow.demo。
apiVersion:apisix.apache.org/v2 kind:ApisixRoute metadata: name:deepflow-apisix-demo namespace:deepflow-otel-spring-demo spec: http: -name:deepflow-apisix-demo match: hosts: -apisix.deepflow.demo paths: -"/*" backends: -serviceName:web-shop servicePort:18090
2. 在 APSIX 中開(kāi)啟 OpenTelemetry 插件
在 APISIX 配置中添加 opentelemetry plugins:
##vim./apisix/.values.yaml plugins: -opentelemetry #... pluginAttrs: opentelemetry: resource: service.name:APISIX collector: ##將數(shù)據(jù)傳給deepflow-agent ##當(dāng)然,這里也可以發(fā)給otel-collector進(jìn)行處理后,再由otel-collectorf發(fā)送至deepflow-agent address:deepflow-agent.deepflow.svc.cluster.local/api/v1/otel/trace request_timeout:3 ##添加后更新helmupgrade--install-napisixapisix./apisix
針對(duì)指定路由開(kāi)啟 OpenTelemetry 功能:
##查看路由ID ##找到對(duì)應(yīng)域名的路由ID curl-shttp://10.109.77.186:9180/apisix/admin/routes-H'X-API-KEY:此處為apisix-admintoken'|jq
##針對(duì)具體路由開(kāi)啟otel功能 curlhttp://10.109.77.186:9180/apisix/admin/routes/此處為路由ID-H'X-API-KEY:此處為apisix-admintoken'-XPUT-d' { "name":"deepflow-apisix-demo",##給這個(gè)路由配置個(gè)名字 "methods":["GET"], "uris":["/*"], "plugins":{ "opentelemetry":{ "sampler":{ "name":"always_on" }, "additional_attributes":[##可通過(guò)additional_attributes自定義Span標(biāo)簽 "deepflow=demo" ] } }, "upstream":{ "type":"roundrobin",##RR輪詢 "nodes":{##上游地址 "10.1.23.200:18090":1##服務(wù)訪問(wèn)地址:上游編號(hào) } } }'
3. 使用 DeepFlow 集成 OpenTelemetry 追蹤數(shù)據(jù)
通過(guò) DeepFlow Agent 集成 OpenTelemetry 的 Span 數(shù)據(jù),功能默認(rèn)開(kāi)啟,無(wú)需額外配置。
##查看deepflow-agent默認(rèn)配置 ##deepflow-ctlagent-group-configexample ##這個(gè)參數(shù)控制是否啟接收外部數(shù)據(jù)源,包括 Prometheus Telegraf OpenTelemetry 和 SkyWalking ##DataIntegrationSocket ##Default:1.Options:0(disabled),1(enabled). ##Note:WhethertoenablereceivingexternaldatasourcessuchasPrometheus, ##Telegraf,OpenTelemetry,andSkyWalking. #external_agent_http_proxy_enabled:1
4. OpenTelemetry 集成效果展示
我們?cè)诳蛻舳税l(fā)起一條訪問(wèn) WebShop 服務(wù)的命令:
curl-H"Host:apisix.deepflow.demo"10.1.23.200:44640/shop/full-test ##此處IP為k8s集群節(jié)點(diǎn)IP,44640端口為APISIX9180暴露的NodePort
在 Grafana 中打開(kāi) DeepFlow 提供的 Distributed Tracing Dashboard,找到對(duì)應(yīng)的調(diào)用點(diǎn)擊發(fā)起追蹤,能看到 APISIX 與后端服務(wù)都能追蹤出來(lái),且 APM 生成的應(yīng)用 SPAN 與 DeepFlow 生成的網(wǎng)絡(luò) SPAN 及系統(tǒng) SPAN 都完整的關(guān)聯(lián)在一張火焰圖上:
注:火焰圖中的 A 表示 APM 生成的應(yīng)用 SPAN,N 和 S 表示 DeepFLow 生成的網(wǎng)絡(luò) SPAN 及系統(tǒng) SPAN。
DeepFlow eBPF + OTel
03
性能指標(biāo)
對(duì)于性能指標(biāo),在 DeepFlow 中同樣能開(kāi)箱即用查看 Endpoint 粒度的 RED(吞吐、時(shí)延、異常)性能指標(biāo),以及豐富的 TCP 網(wǎng)絡(luò)性能指標(biāo)(吞吐、重傳、零窗、建連異常等)。同樣,APISIX 的 Metrics 類的插件 —— 比如 Prometheus、node-status 等插件獲取到的實(shí)例、路由粒度的 HTTP 狀態(tài)碼、帶寬、連接數(shù)、時(shí)延等指標(biāo)數(shù)據(jù),可集成到 DeepFlow 中,并在 APISIX 提供的 Grafana Dashboard 中查看。
使用 DeepFlow 采集 APISIX 性能指標(biāo)
1. 開(kāi)箱即用的 eBPF 性能指標(biāo)
在 APISIX 所在的服務(wù)器上部署 deepflow-agent 后,可自動(dòng)采集應(yīng)用及網(wǎng)絡(luò)層面非常細(xì)粒度的指標(biāo)量,例如精細(xì)到某個(gè)客戶端、某個(gè) Endpoint 的請(qǐng)求速率、響應(yīng)時(shí)延、異常狀態(tài);某一次 TCP 建連時(shí)延,建連異常等等。詳細(xì)的指標(biāo)量可參考 DeepFlow 官網(wǎng)關(guān)于指標(biāo)量的介紹[4]。在 Grafana 中打開(kāi) DeepFlow 提供的 Applicaiton - xxx Ingress Dashboard,可查看 APISIX 相關(guān)的應(yīng)用層性能指標(biāo),在 Network xxx Dashboard 中可查看網(wǎng)絡(luò)相關(guān)的指標(biāo)。
DeepFlow eBPF 性能指標(biāo)(應(yīng)用)
DeepFlow eBPF 性能指標(biāo)(網(wǎng)絡(luò))
2. 在 APISIX 中開(kāi)啟 Prometheus 插件
在 APISIX 配置中添加 Prometheus 插件:
##vim./apisix/.values.yaml plugins: -prometheus #... pluginAttrs: prometheus: export_uri:/metrics##默認(rèn)uri為/apisix/prometheus/metrics export_addr: ip:0.0.0.0##抓取地址 port:9091##默認(rèn)端口9091 metrics: http_status:##具體作用在apisix_http_status指標(biāo)中 extra_labels:##添加額外內(nèi)容 -upstream_addr:$upstream_addr##例如此處添加一個(gè)上游服務(wù)器地址(此處的變量是NGINX變量) -upstream_status:$upstream_status##例如此處添加一個(gè)上游服務(wù)器狀態(tài)(此處的變量是NGINX變量) ## APISIX 自帶變量:https://apisix.apache.org/docs/apisix/3.2/apisix-variable/ ## NGINX 自帶變量:https://nginx.org/en/docs/varindex.html
啟用 Prometheus 插件:
##注:上面啟用了 otel 功能,所以此處要在啟用 otel 的基礎(chǔ)上開(kāi)啟 prometheus curlhttp://10.109.77.186:9180/apisix/admin/routes/此處為路由ID-H'X-API-KEY:此處為apisix-admintoken'-XPUT-d' { "name":"deepflow-apisix-demo",##給這個(gè)路由配置個(gè)名字 "methods":["GET"], "uris":["/*"], "plugins":{ "prometheus":{##啟用prometheus "prefer_name":true##為"true"時(shí),Prometheus指標(biāo)中,打印路由/服務(wù)名稱而不是ID } }, "upstream":{ "type":"roundrobin", "nodes":{ "10.1.23.200:18090":1 } } }'
3. 使用 Prometheus 拉取 APISIX 指標(biāo)數(shù)據(jù)
Prometheus 采集 APISIX metrics(此處以 Prometheus CRD 部署方式舉例):
##ServiceMonitor方式采集(Prometheus以CRD形式部署在k8s中) ##APISIXvalues.yaml文件中提供了對(duì)應(yīng)模塊 serviceMonitor: ##是否啟用 enabled:true ##創(chuàng)建在哪個(gè)命名空間 namespace:"apisix" ##servicemonitor名稱,默認(rèn)為fullname name:"" ##抓取間隔 interval:15s ##metrics暴露的uri path:/metrics ##給抓取到的指標(biāo)添加前綴 metricPrefix:apisix_ ##抓取端口 containerPort:9091 ##添加labels labels: ##此次使用項(xiàng)目為kube-prometheus,使用此標(biāo)簽使kube-prometheus識(shí)別servicemonitor app.kubernetes.io/part-of:kube-prometheus annotations:{}
此時(shí)需要一個(gè) Prometheus 后端服務(wù)用于采集 APISIX 插件生成的指標(biāo),所以需要先部署一個(gè) prometheus-server。但實(shí)際上由于不依賴 prometheus-server 存儲(chǔ)這些指標(biāo),因此可以部署一個(gè) Agent Mode 的 prometheus-server,或者使用更加輕量級(jí)的 grafana-agent 替代 prometheus-server。假設(shè)已經(jīng)部署了 prometheus-server,開(kāi)啟 RemoteWrite 可將指標(biāo)數(shù)據(jù)發(fā)送給 DeepFlow:
##https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_write ##https://deepflow.io/docs/zh/integration/input/metrics/prometheus/#配置-remote-write ##kube-prometheus方式發(fā)送至DeepFlow(yaml清單中添加遠(yuǎn)程寫(xiě)入) apiVersion:monitoring.coreos.com/v1 kind:Prometheus metadata: labels: ... name:k8s namespace:monitoring spec: enableRemoteWriteReceiver:true remoteWrite: ##注:此處為 deepflow-agent svc 地址,要按實(shí)際位置寫(xiě) -url:"http://deepflow-agent.deepflow.svc.cluster.local/api/v1/prometheus"
4. 使用 DeepFlow 集成 Prometheus 指標(biāo)數(shù)據(jù)
通過(guò) DeepFlow Agent 集成 Prometheus 指標(biāo)數(shù)據(jù),功能默認(rèn)開(kāi)啟,無(wú)需額外配置。
##查看deepflow-agent默認(rèn)配置 ##deepflow-ctlagent-group-configexample ##這個(gè)參數(shù)控制是否啟接收外部數(shù)據(jù)源,包括 Prometheus Telegraf OpenTelemetry 和 SkyWalking ##DataIntegrationSocket ##Default:1.Options:0(disabled),1(enabled). ##Note:WhethertoenablereceivingexternaldatasourcessuchasPrometheus, ##Telegraf,OpenTelemetry,andSkyWalking. #external_agent_http_proxy_enabled:1
5. Prometheus 集成效果展示
由于 DeepFlow 支持 PromQL,只需要將 Grafana 中 APISIX 提供的 Grafana Dashboard[5] 的數(shù)據(jù)源改為 DeepFlow,即可查看 APISIX 原生的豐富性能指標(biāo)了,指標(biāo)的使用說(shuō)明參考官方文檔中關(guān)于 Prometheus 插件的說(shuō)明[6]。
通過(guò) DeepFlow 數(shù)據(jù)源展示 APISIX Dashboard
04
訪問(wèn)日志和持續(xù)剖析
使用 DeepFlow 采集 APISIX 的訪問(wèn)日志和剖析數(shù)據(jù)
對(duì)于訪問(wèn)日志,此時(shí)無(wú)需 APISIX 做什么修改,僅需要將 deepflow-agent 部署在 APSIX 所在的服務(wù)器即可,在 Grafana 中打開(kāi) DeepFlow 提供的 Application - Request Log Dashboard 即可查看訪問(wèn)日志,包含了 Request 及 Response 中 header 信息,并可分析每一次請(qǐng)求的響應(yīng)時(shí)延和錯(cuò)誤碼。
DeepFlow 提供的訪問(wèn)日志 Dashboard
DeepFlow 還通過(guò) eBPF 獲取應(yīng)用程序的函數(shù)調(diào)用棧快照(企業(yè)版功能),可繪制 APISIX 進(jìn)程的 On-CPU Profile,函數(shù)調(diào)用棧中除了包含業(yè)務(wù)函數(shù)以外,還可展現(xiàn)動(dòng)態(tài)鏈接庫(kù)、內(nèi)核系統(tǒng)調(diào)用函數(shù)的耗時(shí)情況。
DeepFlow 企業(yè)版中的持續(xù)剖析功能
05
什么是 APISIX
Apache APISIX 是一個(gè)動(dòng)態(tài)、實(shí)時(shí)、高性能的開(kāi)源 API 網(wǎng)關(guān),提供負(fù)載均衡、動(dòng)態(tài)上游、灰度發(fā)布、服務(wù)熔斷、身份認(rèn)證、可觀測(cè)性等豐富的流量管理功能。Apache APISIX 基于 NGINX 和 LuaJIT 構(gòu)建,具有超高性能,單核 QPS 高達(dá) 23000,平均延遲僅為 0.2 毫秒。
Apache APISIX 的應(yīng)用場(chǎng)景非常廣泛,可應(yīng)用于 API 網(wǎng)關(guān)、Kubernetes Ingress 和服務(wù)網(wǎng)格等場(chǎng)景,幫助企業(yè)快速、安全地處理 API 和微服務(wù)流量。目前已獲得 Zoom、Airwallex、Lotus Cars、vivo、歐洲數(shù)字工廠等全球企業(yè)和組織的測(cè)試和高度認(rèn)可。
Apache APISIX 于 2019 年開(kāi)源并由 API7.ai 捐贈(zèng)給 Apache 軟件基金會(huì),目前是 GitHub 上最活躍的 API 網(wǎng)關(guān)項(xiàng)目,每天處理超萬(wàn)億次的 API 調(diào)用,并且這一數(shù)字仍在增長(zhǎng)。
06
什么是 DeepFlow
DeepFlow 是云杉網(wǎng)絡(luò)開(kāi)發(fā)的一款可觀測(cè)性產(chǎn)品,旨在為復(fù)雜的云基礎(chǔ)設(shè)施及云原生應(yīng)用提供深度可觀測(cè)性。DeepFlow 基于 eBPF 實(shí)現(xiàn)了應(yīng)用性能指標(biāo)、分布式追蹤、持續(xù)性能剖析等觀測(cè)信號(hào)的零侵?jǐn)_(Zero Code)采集,并結(jié)合智能標(biāo)簽(SmartEncoding)技術(shù)實(shí)現(xiàn)了所有觀測(cè)信號(hào)的全棧(Full Stack)關(guān)聯(lián)和高效存取。使用 DeepFlow,可以讓云原生應(yīng)用自動(dòng)具有深度可觀測(cè)性,從而消除開(kāi)發(fā)者不斷插樁的沉重負(fù)擔(dān),并為 DevOps/SRE 團(tuán)隊(duì)提供從代碼到基礎(chǔ)設(shè)施的監(jiān)控及診斷能力。
審核編輯:劉清
-
RPC
+關(guān)注
關(guān)注
0文章
111瀏覽量
11581 -
線程池
+關(guān)注
關(guān)注
0文章
57瀏覽量
6895 -
APM
+關(guān)注
關(guān)注
1文章
71瀏覽量
13047 -
LINUX內(nèi)核
+關(guān)注
關(guān)注
1文章
316瀏覽量
21748
原文標(biāo)題:基于 DeepFlow 構(gòu)建 APISIX 的統(tǒng)一可觀測(cè)性能力
文章出處:【微信號(hào):LinuxDev,微信公眾號(hào):Linux閱碼場(chǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論