微信扫码
与创始人交个朋友
我要投稿
本文是基于 DeepFlow 构建 API 网关统一可观测性能力系列的第二篇,旨在阐述如何解决 API 网关可观测数据孤岛的问题。
本文将介绍如何使用 DeepFlow 基于 eBPF 的零侵扰特性构建 Kong 网关的可观测性解决方案,在此基础上统一集成 Kong 插件已有的丰富数据源,消除孤岛、构建统一的可观测性平台,以全面监控和分析 Kong 网关。通过 DeepFlow,Kong 网关可以实现从流量监控、追踪分析、到性能优化的全面可观测性,消除数据分散并提供中心化的监控视图,加速故障排查和性能调优,让 DevOps 和 SRE 团队的工作更加高效。
基于 DeepFlow 建构 Kong 的统一可观测性能力,需要先将 DeepFlow 及 Kong 网关都部署起来。本文为了方便,将 DeepFlow 和 Kong 都以 K8s 服务的形式部署在一个 All-in-One 的 K8s 集群中,其中部署了 Kong Ingress Controller[1](控制平面) 及 Kong Gateway[2](数据平面) 两个组件,整个部署过程大概 5 分钟左右完成。详细的部署过程,参考DeepFlow 官方部署文档[3]及 Kong 官方文档[4]。
注意:为了发挥 DeepFlow 基于 eBPF 的可观测性能力,请确保服务器 Linux 操作系统内核在 4.14 之上(当使用 CentOS 或 Red Hat 发行版时 3.10 内核也可)。
分布式追踪聚焦在讨论 Kong 的数据平面(Kong Gateway)的与其后端服务的分布式调用链。使用 DeepFlow 实现 Kong Gateway 及后端服务的分布式追踪能力有两种方案:1)利用 eBPF,DeepFlow 可以在不修改 Kong Gateway 及后端服务代码及配置的前提下实现开箱即用的 API 粒度分布式追踪;2)当后端服务已具备 APM(Application Performance Monitoring) 能力 —— 比如已经使用了 OpenTelemetry 或者 SkyWalking 等工具时,可结合 Kong Gateway 的 Tracers 插件,将所有追踪数据统一集成到 DeepFlow,实现全链路的应用函数粒度的分布式追踪。
DeepFlow 的分布式追踪(AutoTracing)能力是开箱即用的,无需 Kong Gateway 开启任何插件,仅需要将 deepflow-agent 部署在 Kong Gateway 所在的服务器即可。在 Grafana 中找到 DeepFlow 提供的 Distributed Tracing Dashboard,即可对某一个调用点击发起追踪,并看到这个调用在 Kong Gateway 及其后端服务中的全链路追踪过程。如下图所示:
此方式为 Kong Gateway 利用 OpenTelemetry 插件生成 Trace 数据,后端服务也具备 APM 能力并且可将生成的 Trace 数据转化为 OpenTelemetry 格式。当 Kong 网关与后端服务都将 Trace 数据发送给 DeepFlow 时,DeepFlow 能够生成包含APM 应用 SPAN、eBPF 系统 SPAN 、cBPF 网络 SPAN 的无盲点全栈调用链追踪火焰图。
当我们希望得到后端服务进程内部函数粒度的分布式追踪链路,或者后端服务在处理一个调用时使用了线程池(会导致 DeepFlow AutoTracing 断链)时,可以采用这种方式。
1.部署具备 APM 能力的后端服务
为了展示完整的追踪效果,我们首先在 Kong 网关后面部署了一个支持 OpenTelemetry 能力的 Demo 应用。Demo 应用的部署可参考:DeepFlow Demo - 一键部署基于 Spring Boot 编写的五个微服务组成的 WebShop 应用[5]。在 Kong Ingress Controller 上创建访问后端服务的路由。
## Create Ingress Resource for Service
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-shop-ingress
namespace: deepflow-otel-spring-demo
annotations:
konghq.com/strip-path: 'false'
spec:
ingressClassName: kong
rules:
- http:
paths:
- path: /shop/full-test
pathType: Prefix
backend:
service:
name: web-shop
port:
number: 8090
## Access Service
curl $CLUSTER-IP/shop/full-test
{
"count": 1,
"elapsed": 19,
"elapsedAvg": 19,
"startAt": "2024-06-03 15:27:37.218",
"stopAt": "2024-06-03 15:27:37.237",
"success": 0,
"failed": 1
}
2.Kong Gateway 中开启 OpenTelemetry 插件
在 Kong Gateway 配置中添加 OpenTelemetry 插件:
apiVersion: configuration.konghq.com/v1
kind: KongClusterPlugin
metadata:
name: opentelemetry
annotations:
kubernetes.io/ingress.class: kong
labels:
global: "true"
plugin: opentelemetry
config:
endpoint: http://$deepflow_agent_address/api/v1/otel/trace
3.使用 DeepFlow 集成 OpenTelemetry 追踪数据
通过 DeepFlow Agent 集成 OpenTelemetry 的 Span 数据,功能默认开启,无需额外配置。
## Display DeepFlow-Agent Default Configuration
## deepflow-ctl agent-group-config example
## Data Integration Socket
## Default: 1. Options: 0 (disabled), 1 (enabled).
## Note: Whether to enable receiving external data sources such as Prometheus,
## Telegraf, OpenTelemetry, and SkyWalking.
#external_agent_http_proxy_enabled: 1
我们在客户端发起一条访问 WebShop 服务的命令:curl -H "HOST: kong.deepflow.demo" $CLUSTER-IP/shop/full-test
。
在 Grafana 中打开 DeepFlow 提供的 Distributed Tracing Dashboard,找到对应的调用点击发起追踪,能看到 Kong Gateway 与后端服务都能追踪出来,且 APM 生成的应用 SPAN 与 DeepFlow 生成的网络 SPAN 及系统 SPAN 都完整的关联在一张火焰图上:
注:火焰图中的 A 表示 APM 生成的应用 SPAN,N 和 S 表示 DeepFLow 生成的网络 SPAN 及系统 SPAN。
对于性能指标,在 DeepFlow 中同样能开箱即用查看 Endpoint 粒度的 RED(吞吐、时延、异常)性能指标,以及丰富的 TCP 网络性能指标(吞吐、重传、零窗、建连异常等)。同样,Kong Gateway 的 Metrics 类的插件 —— 比如 Prometheus、StatsD 等插件获取到的实例、路由粒度的 HTTP 状态码、带宽、连接数、时延等指标数据,可集成到 DeepFlow 中,并在 Kong 提供的 Grafana Dashboard 中查看。
在 Kong 网关所在的服务器上部署 deepflow-agent 后,可自动采集应用及网络层面非常细粒度的指标量,例如精细到某个客户端、某个 Endpoint 的请求速率、响应时延、异常状态;某一次 TCP 建连时延,建连异常等等。详细的指标量可参考 DeepFlow 官网关于指标量的介绍[6]。在 Grafana 中打开 DeepFlow 提供的 Applicaiton - xxx Ingress Dashboard,可查看 Kong 网关相关的应用层性能指标,在 Network xxx Dashboard 中可查看网络相关的指标。
在 Kong Gateway 配置中添加 Prometheus 插件,具体插件配置可参考 Kong Prometheus Plugin[7]
apiVersion: configuration.konghq.com/v1
kind: KongClusterPlugin
metadata:
name: prometheus
annotations:
kubernetes.io/ingress.class: kong
labels:
global: "true"
plugin: prometheus
config:
status_code_metrics: true
bandwidth_metrics: true
upstream_health_metrics: true
latency_metrics: true
per_consumer: true
本次 Prometheus 通过 Kube-Prometheus[8] 项目部署,首先更新 Kong Helm Chart 包中 values.yaml:
gateway:
enabled: true
serviceMonitor:
enabled: true
labels:
release: promstack
为 Prometheus 创建用于抓取 kong 命名空间下资源的权限:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: prometheus-kong
namespace: kong
rules:
- apiGroups: [""]
resources: ["pods", "endpoints", "services"]
verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: prometheus-kong
namespace: kong
subjects:
- kind: ServiceAccount
name: prometheus-k8s
namespace: monitoring
roleRef:
kind: Role
name: prometheus-kong
apiGroup: rbac.authorization.k8s.io
此时需要一个 Prometheus 后端服务用于采集 Kong Gateway 插件生成的指标,所以需要先部署一个 prometheus-server。但实际上由于不依赖 prometheus-server 存储这些指标,因此可以部署一个 Agent Mode 的 prometheus-server,或者使用更加轻量级的 grafana-agent 替代 prometheus-server。假设已经部署了 prometheus-server,开启 RemoteWrite 可将指标数据发送给 DeepFlow[9]:
apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
labels:
...
name: prometheus-k8s
namespace: monitoring
spec:
remoteWrite:
- url: "http://$deepflow-agent-address/api/v1/prometheus"
通过 DeepFlow Agent 集成 Prometheus 指标数据,功能默认开启,无需额外配置。
## Display DeepFlow-Agent Default Configuration
## deepflow-ctl agent-group-config example
## Data Integration Socket
## Default: 1. Options: 0 (disabled), 1 (enabled).
## Note: Whether to enable receiving external data sources such as Prometheus,
## Telegraf, OpenTelemetry, and SkyWalking.
#external_agent_http_proxy_enabled: 1
由于 DeepFlow 支持 PromQL,只需要将 Grafana 中 Kong 提供的 Grafana Dashboard[10] 的数据源改为 DeepFlow,即可查看 Kong 网关原生的丰富性能指标了,指标的使用说明参考官方文档中关于 Prometheus 插件的说明[11]。
对于访问日志,Kong Gateway 记录的日志可以通过日志类插件,由 Vector 转发给 DeepFlow。在不使用插件的情况下,DeepFlow 无需对 Kong Gateway 进行任何修改,只需将 deepflow-agent 部署在 Kong Gateway 所在的服务器上即可。然后,在 Grafana 中打开 DeepFlow 提供的 Application - Request Log Dashboard,即可查看访问日志。该日志包含了请求和响应中的 header 信息,并且可以分析每一次请求的响应时延和错误码。
DeepFlow 还通过 eBPF 获取应用程序的函数调用栈快照(企业版功能),可绘制 Kong 网关进程的 On-CPU/Off-CPU Profile,函数调用栈中除了包含业务函数以外,还可展现动态链接库、内核系统调用函数的耗时情况。
DeepFlow 是云杉网络开发的一款可观测性产品,旨在为复杂的云原生及 AI 应用提供深度可观测性。DeepFlow 基于 eBPF
实现了应用性能指标、分布式追踪、持续性能剖析等观测信号的零侵扰(Zero Code
)采集,并结合智能标签(SmartEncoding
)技术实现了所有观测信号的全栈(Full Stack
)关联和高效存取。使用 DeepFlow,可以让云原生及 AI 应用自动具有深度可观测性,从而消除开发者不断插桩的沉重负担,并为 DevOps/SRE 团队提供从代码到基础设施的监控及诊断能力。
GitHub 地址:https://github.com/deepflowio/deepflow
访问 DeepFlow Demo[12],体验零插桩、全覆盖、全关联的可观测性。
53AI,企业落地应用大模型首选服务商
产品:大模型应用平台+智能体定制开发+落地咨询服务
承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2024-05-28
2024-04-26
2024-08-13
2024-08-21
2024-07-09
2024-08-04
2024-06-13
2024-04-11
2024-07-18
2024-07-01