基于 DeepFlow 构建 Kong 的统一可观测性能力 原创
本文是基于 DeepFlow 构建 API 网关统一可观测性能力系列的第二篇,旨在阐述如何解决 API 网关可观测数据孤岛的问题。
本文将介绍如何使用 DeepFlow 基于 eBPF 的零侵扰特性构建 Kong 网关的可观测性解决方案,在此基础上统一集成 Kong 插件已有的丰富数据源,消除孤岛、构建统一的可观测性平台,以全面监控和分析 Kong 网关。通过 DeepFlow,Kong 网关可以实现从流量监控、追踪分析、到性能优化的全面可观测性,消除数据分散并提供中心化的监控视图,加速故障排查和性能调优,让 DevOps 和 SRE 团队的工作更加高效。
01: 安装 Kong 和 DeepFlow
基于 DeepFlow 建构 Kong 的统一可观测性能力,需要先将 DeepFlow 及 Kong 网关都部署起来。本文为了方便,将 DeepFlow 和 Kong 都以 K8s 服务的形式部署在一个 All-in-One 的 K8s 集群中,其中部署了 Kong Ingress Controller(控制平面) 及 Kong Gateway(数据平面) 两个组件,整个部署过程大概 5 分钟左右完成。详细的部署过程,参考DeepFlow 官方部署文档及 Kong 官方文档。
注意:为了发挥 DeepFlow 基于 eBPF 的可观测性能力,请确保服务器 Linux 操作系统内核在 4.14 之上(当使用 CentOS 或 Red Hat 发行版时 3.10 内核也可)。
02: 分布式追踪
分布式追踪聚焦在讨论 Kong 的数据平面(Kong Gateway)的与其后端服务的分布式调用链。使用 DeepFlow 实现 Kong Gateway 及后端服务的分布式追踪能力有两种方案:1)利用 eBPF,DeepFlow 可以在不修改 Kong Gateway 及后端服务代码及配置的前提下实现开箱即用的 API 粒度分布式追踪;2)当后端服务已具备 APM(Application Performance Monitoring) 能力 —— 比如已经使用了 OpenTelemetry 或者 SkyWalking 等工具时,可结合 Kong Gateway 的 Tracers 插件,将所有追踪数据统一集成到 DeepFlow,实现全链路的应用函数粒度的分布式追踪。
方式一:DeepFlow eBPF AutoTracing
DeepFlow 的分布式追踪(AutoTracing)能力是开箱即用的,无需 Kong Gateway 开启任何插件,仅需要将 deepflow-agent 部署在 Kong Gateway 所在的服务器即可。在 Grafana 中找到 DeepFlow 提供的 Distributed Tracing Dashboard,即可对某一个调用点击发起追踪,并看到这个调用在 Kong Gateway 及其后端服务中的全链路追踪过程。如下图所示:
- ①:通过云 LB 的形式访问到 Kong Gateway 服务所在 K8s Node 的端口
- ②:进入到 Kong Gateway 服务所对应的 POD 的网卡
- ③:进入到 Kong Gateway 服务中的 nginx 进程
- ④:完成业务处理,经由 nginx 进程将请求转发给后端服务
- ⑤:经由 Kong Gateway 服务所对应的 POD 网卡转发
- ⑥/⑦:将请求转发给后端服务
方式二:DeepFlow eBPF + OpenTelemetry
此方式为 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 应用。在 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
4.OpenTelemetry 集成效果展示
我们在客户端发起一条访问 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。
03: 性能指标
对于性能指标,在 DeepFlow 中同样能开箱即用查看 Endpoint 粒度的 RED(吞吐、时延、异常)性能指标,以及丰富的 TCP 网络性能指标(吞吐、重传、零窗、建连异常等)。同样,Kong Gateway 的 Metrics 类的插件 —— 比如 Prometheus、StatsD 等插件获取到的实例、路由粒度的 HTTP 状态码、带宽、连接数、时延等指标数据,可集成到 DeepFlow 中,并在 Kong 提供的 Grafana Dashboard 中查看。
开箱即用的 eBPF 性能指标
在 Kong 网关所在的服务器上部署 deepflow-agent 后,可自动采集应用及网络层面非常细粒度的指标量,例如精细到某个客户端、某个 Endpoint 的请求速率、响应时延、异常状态;某一次 TCP 建连时延,建连异常等等。详细的指标量可参考 DeepFlow 官网关于指标量的介绍。在 Grafana 中打开 DeepFlow 提供的 Applicaiton - xxx Ingress Dashboard,可查看 Kong 网关相关的应用层性能指标,在 Network xxx Dashboard 中可查看网络相关的指标。
在 Kong Gateway 中开启 Prometheus 插件
在 Kong Gateway 配置中添加 Prometheus 插件,具体插件配置可参考 Kong Prometheus Plugin
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 拉取 Kong Gateway 指标数据
本次 Prometheus 通过 Kube-Prometheus 项目部署,首先更新 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:
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 集成 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
Prometheus 集成效果展示
由于 DeepFlow 支持 PromQL,只需要将 Grafana 中 Kong 提供的 Grafana Dashboard 的数据源改为 DeepFlow,即可查看 Kong 网关原生的丰富性能指标了,指标的使用说明参考官方文档中关于 Prometheus 插件的说明。
04: 访问日志和持续剖析
对于访问日志,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,函数调用栈中除了包含业务函数以外,还可展现动态链接库、内核系统调用函数的耗时情况。
05: 什么是 DeepFlow
DeepFlow 是云杉网络开发的一款可观测性产品,旨在为复杂的云原生及 AI 应用提供深度可观测性。DeepFlow 基于 eBPF
实现了应用性能指标、分布式追踪、持续性能剖析等观测信号的零侵扰(Zero Code
)采集,并结合智能标签(SmartEncoding
)技术实现了所有观测信号的全栈(Full Stack
)关联和高效存取。使用 DeepFlow,可以让云原生及 AI 应用自动具有深度可观测性,从而消除开发者不断插桩的沉重负担,并为 DevOps/SRE 团队提供从代码到基础设施的监控及诊断能力。
GitHub 地址:https://github.com/deepflowio/deepflow
访问 DeepFlow Demo,体验零插桩、全覆盖、全关联的可观测性。