☰
Kubeless 监控指南:基于 Prometheus 与 Grafana 的函数指标采集与可视化
2026/10/7 9:25:35 网站建设 项目流程
  • 后端
  • 云原生
  • 微服务

【免费下载链接】kubeless

Kubernetes Native Serverless Framework

项目地址:https://gitcode.com/gh_mirrors/ku/kubeless
点击查看免费下载

本文面向 Kubeless(Kubernetes Native Serverless Framework)的使用者与运维人员,讲解如何利用 Prometheus 采集各语言运行时自动暴露的函数级指标,并借助 Grafana 将函数调用率、失败率与执行时长等核心指标可视化。读完本文,你将掌握 Kubeless 函数指标的产生原理、Prometheus 抓取配置、kubeless function top命令行查询,以及官方 Grafana 仪表盘的导入与使用方式。

一、监控架构总览:函数指标从产生到展示的完整链路

Kubeless 的监控体系建立在 Prometheus 生态之上。整条链路可以概括为:

  1. 埋点(Instrumentation):每个函数的语言运行时(language runtime)内置 Prometheus 客户端库,在函数代理(function proxy)处理请求时自动记录指标;
  2. 暴露(Expose):每个函数 Pod 通过/metrics端点以 Prometheus 文本格式暴露指标;
  3. 抓取(Scrape):Prometheus 根据服务发现配置定期抓取这些指标;
  4. 可视化(Visualize):指标在 Prometheus 默认面板中展示,也可以导入官方 Grafana 仪表盘进行更友好的可视化。

其中第 1、2 步由 Kubeless 运行时自动完成,用户无需在函数代码中做任何改动,这正是官方文档 docs/monitoring.md 中"语言运行时已被插桩、可自动为每个函数收集指标"这一描述的具体体现。

二、指标埋点原理:函数代理如何自动生成三类核心指标

Kubeless 为每个函数 Pod 内运行一个 function proxy 进程(Go 编写),它承担请求转发、超时控制与指标埋点三重职责。核心实现在 pkg/function-proxy/proxy.go 与 pkg/function-proxy/utils/proxy-utils.go。

在 proxy-utils.go 中定义了三个 Prometheus 指标:

指标名类型含义标签
function_duration_secondsHistogram(直方图)用户函数的执行耗时(秒)method
function_calls_totalCounter(计数器)用户函数的调用次数method
function_failures_totalCounter(计数器)用户函数执行过程中的异常次数method

三个指标均带有method标签,记录发起请求的 HTTP 方法(GET、POST 等),因此一个函数的不同调用方式可以被分别统计。

在 Handler 中可以看到指标的实际记录逻辑:

  • 每次请求进入,首先执行funcCalls.With(prometheus.Labels{"method": r.Method}).Inc()递增调用计数;
  • 用time.Since(start).Seconds()记录执行耗时并写入直方图funcHistogram;
  • 当函数执行返回错误(respPack.err != nil)或请求超时(ctx.Done()触发)时,执行funcErrors.With(...).Inc()递增失败计数。

指标端点则由 proxy.go 中的mux.Handle("/metrics", promhttp.Handler())注册——promhttp 是 Prometheus Go 客户端提供的标准 HTTP 处理器,无需任何自定义逻辑即可输出指标。这正是文档中"语言运行时自动收集每个函数的指标"的实现基础。

函数代理的环境变量默认值

代理进程的行为可通过环境变量调节,proxy-utils.go 中给出了默认值:

  • FUNC_TIMEOUT:函数执行超时时间,默认180秒;
  • FUNC_PORT:代理监听端口,默认8080;
  • SHUTDOWN_TIMEOUT:优雅停机等待时间,默认10秒。

三、部署 Prometheus:官方抓取配置与关键参数解读

仓库在 manifests/monitoring/prometheus.yaml 中提供了开箱即用的 Prometheus 部署清单,包含 Namespace、ConfigMap、Service 与 Deployment 四类资源,直接kubectl apply即可:

kubectl apply -f manifests/monitoring/prometheus.yaml

该清单的关键配置点如下:

  1. 抓取周期:global.scrape_interval: 30s与scrape_timeout: 30s(抓取超时与周期一致,需保证集群负载下能在超时内完成抓取);
  2. 服务发现:使用 Kubernetes 原生服务发现(kubernetes_sd_configs),通过in_cluster: true在集群内部访问 API Server,无需外部连接信息;
  3. 抓取任务(job)划分:
    • kubernetes-cluster、kubernetes-nodes:分别抓取 API Server 与节点自身的指标;
    • kubernetes-service-endpoints与kubernetes-services:仅保留带有prometheus.io/scrape: "true"注解的 Service/Endpoint;
    • kubernetes-pods:这是抓取函数指标的关键 job,通过 relabel 规则保留带prometheus.io/scrape注解的 Pod,并支持prometheus.io/path与prometheus.io/port注解覆盖默认抓取路径与端口。

其中kubernetes-podsjob 的 relabel 规则(prometheus.yaml)还做了三件重要的事:把 Pod 的__meta_kubernetes_pod_namespace、__meta_kubernetes_pod_name等元数据映射为kubernetes_namespace、kubernetes_pod_name等标签,便于按 Pod 维度聚合查询;同时通过labelmap把 Pod 的自定义标签也带入时序数据。这意味着你可以在函数上打自定义标签,随后在 PromQL 中直接按该标签过滤。

  1. 资源与存储:Deployment 使用quay.io/prometheus/prometheus:v1.1.3镜像,指标数据以emptyDir存储,-storage.local.retention=24h表示本地保留 24 小时;Service 以 NodePort 暴露 9090 端口,方便从集群外访问 Prometheus 界面。

说明:上述配置基于本仓库 manifest 内嵌的 Prometheus 1.x 时代语法(如-storage.local.path),部署的是仓库内置示例而非当前主流 Prometheus 版本;生产环境可参考同一份 relabel 思路迁移到新版本语法。

四、命令行查询指标:kubeless function top

除 Grafana 外,Kubeless CLI 还提供kubeless function top(别名stats)命令,可在终端直接查看函数指标,实现实现在 cmd/kubeless/function/top.go。

# 查看指定命名空间下所有函数的指标 kubeless function top -n default # 查看指定函数的指标 kubeless function top -f my-function -n default # 以 JSON 格式输出 kubeless function top -o json # 以 YAML 格式输出 kubeless function top -o yaml

命令参数如下:

参数简写说明
--namespace-n指定函数所在命名空间,缺省使用默认命名空间
--function-f指定函数名;不指定则列出所有函数
--out-o输出格式,可选json、yaml;缺省输出终端表格

表格模式下的列为NAME / NAMESPACE / METHOD / TOTAL_CALLS / TOTAL_FAILURES / TOTAL_DURATION_SECONDS / AVG_DURATION_SECONDS / MESSAGE,其中AVG_DURATION_SECONDS即"总执行时长 ÷ 总调用次数"的平均耗时。

top命令背后的实现链路展示了它与监控体系的深度集成:

  • CLI 通过PrometheusMetricsHandler.GetRawMetrics(pkg/utils/metrics.go)调用 Kubernetes API 的 Service proxy 接口,即GET /api/v1/namespaces/{ns}/services/{function}:{port}/proxy/metrics,直接从函数 Service 的/metrics端点拉取原始指标;
  • parseMetrics(metrics.go)使用 Prometheus 官方expfmt.TextParser解析文本格式,只关心function_duration_seconds、function_calls_total、function_failures_total三个指标,并按method标签聚合;
  • 若函数从未被调用(无任何指标),代码会补一条空记录,保证函数名仍出现在输出中(见 metrics.go 注释);
  • 并发查询所有函数,并设置 5 秒超时兜底,避免某个函数无响应时命令挂起(top.go)。

doTop同时对结果按函数名排序,方便配合watch kubeless function top持续观察(top.go 注释明确提及此用途)。

五、Grafana 可视化:官方仪表盘与部署清单

1. 官方仪表盘预览

文档展示的 Grafana 仪表盘示例(docs/img/kubeless-grafana-dashboard.png)包含三个与函数直接相关的面板:

  • Function call rate(函数调用率):sum(rate(function_calls_total[5m])) by (function),展示各函数近 5 分钟内的调用速率;
  • Function failure rate(函数失败率):sum(rate(function_failures_total[5m])) by (function),展示失败速率;
  • Execution duration(函数执行时长):sum(rate(function_duration_seconds_sum[1m])) by (function),展示执行耗时的变化趋势。

上图中的function=get-python即为被监控的具体函数标签,直观印证了按函数维度聚合查询的效果。三个面板的完整 PromQL 定义可在官方仪表盘 JSON 文件 docs/misc/kubeless-grafana-dashboard.json 中查看(数据源名称为prometheus,schemaVersion 12,Grafana 3.x 格式)。

2. 官方仪表盘 JSON 文件

文档提到的示例仪表盘 JSON 位于 docs/misc/kubeless-grafana-dashboard.json,包含:

  • 两个图表面板:Function call rate与Function failure rate(各占一半宽度,span 6);
  • 一个通栏图表面板:Execution duration(span 12);
  • 刷新间隔预设(5s 至 1d)与常用时间范围选项。

该文件可直接导入 Grafana(Create → Import → 上传 JSON),导入后需确保存在名为prometheus的数据源,或将面板的datasource字段改为你的数据源名称。

3. Grafana 部署清单

仓库在 manifests/monitoring/ 目录提供了一整套 Grafana 部署资源:

  • grafana-deployment.yaml:Grafana 3.1.1 Deployment,单副本,启用基础认证(GF_AUTH_BASIC_ENABLED=true),默认管理员账号密码为admin/admin,使用emptyDir存储;
  • grafana-service.yaml:以 NodePort 暴露 3000 端口;
  • grafana-configmap.yaml:内置两个官方仪表盘模板——Prometheus Stats(Grafana 官方预构建面板)与Kubernetes Pod Resources(展示 Pod 的 CPU、内存与文件系统使用率);
  • grafana-job.yaml:一个初始化 Job,轮询等待 Grafana API 就绪后,自动创建 Prometheus 数据源(名称为prometheus)并导入 ConfigMap 中的仪表盘模板,实现全自动初始化。
# 部署 Prometheus(如尚未部署) kubectl apply -f manifests/monitoring/prometheus.yaml # 部署 Grafana 及相关资源 kubectl apply -f manifests/monitoring/grafana-deployment.yaml kubectl apply -f manifests/monitoring/grafana-service.yaml kubectl apply -f manifests/monitoring/grafana-configmap.yaml kubectl apply -f manifests/monitoring/grafana-job.yaml

注意:仓库内的 Grafana 资源基于 Grafana 3.x 与extensions/v1beta1API(新版 Kubernetes 已移除该 API 版本),使用时需结合当前集群版本调整。Dashboard JSON 的 schemaVersion 12 与旧版面板结构同样属于 3.x 时代产物。

4. 导入仪表盘后的 PromQL 查询实践

无论使用官方示例还是自行创建面板,最常用的函数级查询语句如下:

# 某函数近 5 分钟的调用速率 sum(rate(function_calls_total[5m])) by (function) # 某函数的失败速率 sum(rate(function_failures_total[5m])) by (function) # 平均执行时长(总耗时 / 总调用数) sum(rate(function_duration_seconds_sum[1m])) by (function) / sum(rate(function_calls_total[1m])) by (function)

由于指标带有method标签,还可以进一步按 HTTP 方法拆分统计,例如sum(rate(function_calls_total{method="GET"}[5m])) by (function)。

六、监控数据消费的另一种方式:Metric 数据结构

除了 PromQL 查询,仓库还在 pkg/utils/metrics.go 中定义了结构化的Metric数据类型,字段包括:FunctionName、Namespace、Method、Message、TotalCalls、TotalFailures、TotalDurationSeconds、AvgDurationSeconds。kubeless function top的 JSON/YAML 输出即源于此结构(见 top.go),这意味着你可以用-o json把指标导出后接入自己的告警、报表或自动化脚本流程。

七、故障排查与注意事项

  1. 函数面板不显示数据:先确认函数是否被调用过。从未被调用的函数不会产生任何指标,kubeless function top会显示空记录(MESSAGE列为空),Prometheus 中也不会有对应序列;
  2. "Function does not expose metrics":该提示出现在 metrics.go,表示通过 Service proxy 拉取/metrics失败,常见原因是函数 Service 尚未就绪或 Pod 未运行;
  3. 抓取不到指标:检查函数 Pod/Service 是否带有prometheus.io/scrape: "true"注解,以及prometheus.io/port是否指向函数端口(默认为函数服务端口,也可查阅 pkg/utils/k8sutil.go 中GetFunctionPort的端口解析逻辑);
  4. 数据保留周期:内置 Prometheus 清单的本地存储保留 24 小时(-storage.local.retention=24h),长周期查询需自行扩展存储方案;
  5. 版本兼容性:仓库内置的 Prometheus(v1.1.3)、Grafana(3.1.1)镜像与extensions/v1beta1API 均为历史版本,在较新的 Kubernetes 集群上部署前需评估兼容性。

八、小结

Kubeless 的监控能力可以概括为"零埋点、双入口":函数代理自动完成指标埋点与/metrics暴露(源码见 pkg/function-proxy/);用户既可通过 Prometheus + Grafana 实现可视化监控(官方仪表盘 JSON 见 docs/misc/kubeless-grafana-dashboard.json),也可通过kubeless function top在命令行快速巡检。核心指标始终围绕调用量、失败量、执行时长三个维度,配合method标签即可精细化定位单个函数的运行状况。

  • 后端
  • 云原生
  • 微服务

【免费下载链接】kubeless

Kubernetes Native Serverless Framework

项目地址:https://gitcode.com/gh_mirrors/ku/kubeless
点击查看免费下载

相关推荐

上一篇:网络性能测试终极指南:iperf3-win-builds中RSA认证兼容性问题深度解析与解决方案
下一篇:突破精度瓶颈:sf包中基于S2的缓冲区生成优化与max_cells参数深度解析

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询