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