- 后端
- 云原生
- 微服务
【免费下载链接】kubeless
Kubernetes Native Serverless Framework
本文面向 Kubeless(Kubernetes Native Serverless Framework)的使用者与运维人员,讲解如何利用 Prometheus 采集各语言运行时自动暴露的函数级指标,并借助 Grafana 将函数调用率、失败率与执行时长等核心指标可视化。读完本文,你将掌握 Kubeless 函数指标的产生原理、Prometheus 抓取配置、
kubeless function top命令行查询,以及官方 Grafana 仪表盘的导入与使用方式。
一、监控架构总览:函数指标从产生到展示的完整链路
Kubeless 的监控体系建立在 Prometheus 生态之上。整条链路可以概括为:
- 埋点(Instrumentation):每个函数的语言运行时(language runtime)内置 Prometheus 客户端库,在函数代理(function proxy)处理请求时自动记录指标;
- 暴露(Expose):每个函数 Pod 通过
/metrics端点以 Prometheus 文本格式暴露指标; - 抓取(Scrape):Prometheus 根据服务发现配置定期抓取这些指标;
- 可视化(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_seconds | Histogram(直方图) | 用户函数的执行耗时(秒) | method |
function_calls_total | Counter(计数器) | 用户函数的调用次数 | method |
function_failures_total | Counter(计数器) | 用户函数执行过程中的异常次数 | 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该清单的关键配置点如下:
- 抓取周期:
global.scrape_interval: 30s与scrape_timeout: 30s(抓取超时与周期一致,需保证集群负载下能在超时内完成抓取); - 服务发现:使用 Kubernetes 原生服务发现(
kubernetes_sd_configs),通过in_cluster: true在集群内部访问 API Server,无需外部连接信息; - 抓取任务(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 中直接按该标签过滤。
- 资源与存储: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把指标导出后接入自己的告警、报表或自动化脚本流程。
七、故障排查与注意事项
- 函数面板不显示数据:先确认函数是否被调用过。从未被调用的函数不会产生任何指标,
kubeless function top会显示空记录(MESSAGE列为空),Prometheus 中也不会有对应序列; - "Function does not expose metrics":该提示出现在 metrics.go,表示通过 Service proxy 拉取
/metrics失败,常见原因是函数 Service 尚未就绪或 Pod 未运行; - 抓取不到指标:检查函数 Pod/Service 是否带有
prometheus.io/scrape: "true"注解,以及prometheus.io/port是否指向函数端口(默认为函数服务端口,也可查阅 pkg/utils/k8sutil.go 中GetFunctionPort的端口解析逻辑); - 数据保留周期:内置 Prometheus 清单的本地存储保留 24 小时(
-storage.local.retention=24h),长周期查询需自行扩展存储方案; - 版本兼容性:仓库内置的 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
相关推荐
ZLMediaKit监控集成:Prometheus指标采集与Grafana可视化监控
ZLMediaKit监控集成:Prometheus指标采集与Grafana可视化监控 概述 在现代流媒体服务运维中,实时监控和性能指标采集至关重要。ZLMedi
音视频直播后端Cortex 集群监控指南:基于 Prometheus 与 Grafana 的指标采集、可视化与导出实践
Cortex 集群监控指南:基于 Prometheus 与 Grafana 的指标采集、可视化与导出实践 Cortex 在生产集群内默认部署了 Promethe
人工智能模型推理服务后端云原生MLOpsAWX 监控体系实战:基于 Prometheus 与 Grafana 的指标采集、可视化与告警配置指南
AWX 监控体系实战:基于 Prometheus 与 Grafana 的指标采集、可视化与告警配置指南 AWX 作为 Ansible Automation Pl
后端运维任务调度
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考