Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >基于DaemonSet的Process Exporter监控实践指南

基于DaemonSet的Process Exporter监控实践指南

作者头像
没有故事的陈师傅
发布于 2025-03-04 06:03:19
发布于 2025-03-04 06:03:19
24610
代码可运行
举报
文章被收录于专栏:运维开发故事运维开发故事
运行总次数:0
代码可运行

导语

作为一名Kubernetes管理员,你是否经历过: ✅ 服务正常却找不到CPU飙升的根本原因? ✅ 容器进程异常但无法快速定位根源? ✅ 缺乏完整的进程级监控体系导致故障排查困难?

本文将带你掌握 Process Exporter 的完整使用链路,涵盖基础部署、Prometheus集成、Grafana可视化及告警规则配置,即使是新手也能轻松上手!

一、初识Process Exporter

1.1 什么是Process Exporter?

  • 官方出品:Prometheus生态标准exporter
  • 轻量级:镜像仅15MB,支持容器/宿主机进程监控
  • 核心能力: ✓ 进程CPU/内存占用 ✓ 文件描述符数量 ✓ 线程数与运行时长 ✓ 支持正则表达式过滤进程

1.2 为什么必须用它?

对比项

Node Exporter

Process Exporter

监控粒度

节点级别

进程级别(精确到PID)

核心指标

CPU/内存/磁盘IO

CPU/内存/线程/文件描述符

典型场景

整体资源负载分析

异常进程根因定位

典型业务价值

  • 识别恶意进程占用资源
  • 监控Java应用GC行为
  • 分析MySQL连接池耗尽原因

1.3 部署控制器选择

  • 全节点覆盖:确保每个Worker节点运行监控实例
  • 混合监控:同时采集容器进程和宿主机关键服务(如kubelet、sshd)
  • 资源占用优化:避免Deployment模式下多副本的资源浪费

二、快速部署Process Exporter

2.1 架构设计图

2.2 部署YAML模板

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 1. 创建RBAC权限
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: process-exporter
rules:
- apiGroups: [""]
  resources: ["nodes/proxy"]
  verbs: ["get", "list", "watch"]
---
# 2. 配置DaemonSet
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: process-exporter
  namespace: monitoring
spec:
  selector:
    matchLabels:
      app: process-exporter
  template:
    metadata:
      labels:
        app: process-exporter
    spec:
      hostPID: true          # 共享宿主机 PID 命名空间
      hostNetwork: true      # 可选:共享宿主机网络命名空间
      # 添加容忍规则
      tolerations:
      - operator: Exists  # 容忍所有污点
      containers:
      - name: process-exporter
        image: prometheus/process-exporter:v1.7.0
        args:
        - "-procfs=/host/proc"          # 指定宿主机 /proc 路径
        - "-config.path=/etc/process-exporter/config.yaml"
        volumeMounts:
        - name: config-volume
          mountPath: /etc/process-exporter/config.yaml  # 挂载为文件
          subPath: config.yaml                           # 指定子路径
        - name: proc                     # 挂载宿主机的 /proc
          mountPath: /host/proc
          readOnly: true
        ports:
        - containerPort: 9256
        resources:
          limits:
            cpu: "200m"
            memory: "256Mi"
        securityContext:
          capabilities:
            add:
            - SYS_PTRACE                # 允许追踪进程
            - SYS_ADMIN                 # 可选:访问宿主机资源
      volumes:
      - name: config-volume
        configMap:
          name: process-exporter-config
          items:                        # 明确指定 ConfigMap 的键和路径
          - key: config.yaml            # ConfigMap 中的键名
            path: config.yaml           # 挂载到容器内的文件名
      - name: proc
        hostPath:
          path: /proc                   # 宿主机 /proc 目录
---
apiVersion: v1
kind: Service
metadata:
  name: process-exporter
  namespace: monitoring
  labels:
    app: process-exporter  # 必须与 ServiceMonitor 的 selector 匹配
spec:
  ports:
  - port: 9256
    targetPort: 9256
    protocol: TCP
    name: http              # 端口名称必须与 ServiceMonitor 的 endpoints.port 匹配
  selector:
    app: process-exporter   # 关联到 Deployment 的 Pod 标签

2.3 configmap配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: v1
kind: ConfigMap
metadata:
  name: process-exporter-config
  namespace: monitoring
data:
  config.yaml: |
    process_names:
      - name: "{{.Comm}}"       # 进程组名称模板(使用进程名作为标签)
        cmdline:                # 匹配命令行参数的正则表达式
        - '.+'                  # 匹配所有进程

2.4 验证部署

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 查看Pod状态
kubectl get pods -n monitoring -l app=process-exporter

# 测试数据采集
kubectl exec -it <pod-name> -- curl http://localhost:9103/metrics | grep java_process_cpu_seconds_total

三、与Prometheus监控体系集成

3.1 Prometheus Operator自动接入

步骤1:单独创建ServiceMonitor
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: process-exporter
  namespace: monitoring
spec:
  endpoints:
  - port: http
    interval: 15s
    path: /metrics
    relabelings:
    - sourceLabels: [__meta_kubernetes_pod_node_name]
      targetLabel: node  # 自动添加节点标签
  namespaceSelector:
    matchNames:
    - monitoring        # 监控的命名空间
  selector:
    matchLabels:
      app: process-exporter
步骤2:自动化数据同步

Operator会自动完成以下操作: ✅ 创建TargetGroup ✅ 注册到Prometheus Server ✅ 自动生成Recording Rules

3.2 Grafana看板和指标

3.2.1 关键指标

在实际监控进程时,主要使用的指标就是cpu和内存。

  • process-exporter中进程的指标以namedprocess_namegroup开头:
  • namedprocess_namegroup_cpu_seconds_total:cpu使用时间,通过mode区分是user还是system
  • namedprocess_namegroup_memory_bytes:内存占用,通过memtype区分不同的占用类型
  • namedprocess_namegroup_num_threads:线程数
  • namedprocess_namegroup_open_filedesc:打开的文件句柄数
  • namedprocess_namegroup_read_bytes_total:进程读取的字节数
  • namedprocess_namegroup_thread_context_switches_total:线程上下文切换统计
  • namedprocess_namegroup_thread_count:线程数量统计
  • namedprocess_namegroup_thread_cpu_seconds_total:线程的cpu使用时间
  • namedprocess_namegroup_thread_io_bytes_total:线程的io
3.2.2 cpu相关

cpu是我们最经常关注的指标,如果使用node-exporter采集节点的指标数据,可以得到机器的cpu占比。

而使用process-exporter采集的是进程的指标,具体来说就是采集/proc/pid/stat中与cpu时间有关的数据:

  • 第14个字段:utime,进程在用户态运行的时间,单位为jiffies
  • 第15个字段:stime,进程在内核态运行的时间,单位为jiffies
  • 第16个字段:cutime,子进程在用户态运行的时间,单位为jiffies
  • 第17个字段:cstime,子进程在内核态运行的时间,单位为jiffies

那么通过上述值就可以得到进程的单核CPU占比:

  • 进程的单核CPU占比=(utime+stime+cutime+cstime)/时间差
  • 进程的单核内核态CPU占比=(stime+cstime)/时间差

因此,进程的单核CPU占比的promsql语句为increase(namedprocess_namegroup_cpu_seconds_total{mode="user",groupname="procname"}[30s])*100/30,单核内核态CPU占比的promsql语句为increase(namedprocess_namegroup_cpu_seconds_total{mode="system",groupname="procname"}[30s])*100/30。

注意:实测发现,process-exporter获取的数据与/proc/pid/stat中的有一定差异,需要进一步看下。

3.2.3 memory

process-exporter采集内存的指标时将内存分成5种类型:

  • resident:进程实际占用的内存大小,包括共享库的内存空间,可以从/proc/pid/status中的VmRSS获取
  • proportionalResident:与resident相比,共享库的内存空间会根据进程数量平均分配
  • swapped:交换空间,系统物理内存不足时,会将不常用的内存页放到硬盘的交换空间,可以从/proc/pid/status中的VmSwap获取
  • proportionalSwapped:将可能被交换的内存页按照可能性进行加权平均
  • virtual:虚拟内存,描述了进程运行时所需要的总内存大小,包括哪些还没有实际加载到内存中的代码和数据,可以从/proc/pid/status中的VmSize获取

对于一般的程序来说,重点关注的肯定是实际内存,也就是resident和virtual,分别表示实际在内存中占用的空间和应该占用的总空间

3.2.4 看板

process-exporter基于上述指标提供了grafana的面板可以直接导入:https://grafana.com/grafana/dashboards/249-named-processes/

可以看到,面板中的cpu和读写是直接基于指标和rate函数得到的,内存则是直接基于指标而来的。

四、配置说明

proces-exporter的配置包括两部分的配置项,一个是process-exporter的一些参数控制,另一个是进程信息的配置。

一般来说,exporter都会有几部分的参数控制采集:

  • config/config.path:指定配置文件路径
  • web.listen-address:指定监听端口,通常都会有默认的端口,prometheus就是访问该端口获取指标数据
  • web.telemetry-path:指标数据的url,通常都是/metrics

除了有以上配置项之外,process-exporter还有其他特有的配置项:

  • children:如果某个进程被采集,那么它的子进程也属于该组
  • namemapping:名称映射,
  • procfs:proc文件系统的路径,默认是/proc
  • procnames:需要采集的进程名列表
  • threads:是否采集线程,默认为是

基于性能的考虑,process-exporter只能对事先配置的进程进行指标采集,因此,需要对进程进行过滤,只采集需要的进程的指标。

在过滤进程时,会将进程进行分组,因此,就会有分组的名称,以及将进程放到分组的规则。例如,如果使用deb/rpm安装process-exporter时,默认的配置文件是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
process_names:
  - name: "{{.Comm}}"
    cmdline:
    - '.+'

process_names是个数组,每个成员表示一个分组。

name是分组的名称,这里使用模版。cmdline用于对分组中的进程进行过滤,这里的正则表达式就表示过滤所有进程。

因此,上述配置文件的含义是:采集所有进程的指标数据,当遍历到某个进程时,获取该进程的进程名,然后放到进程名对应的分组。

name字段可以使用固定的字符串,也可以使用以下模版:

  • {{.Comm}}:进程名
  • {{.ExeBase}}:可执行文件的文件名,与进程的区别是,进程名有长度15的限制
  • {{.ExeFull}}:可执行文件的全路径
  • {{.Username}}:进程的有效用户名
  • {{.Matches}}:用正则匹配cmdline等字段时得到的匹配项的map,例如下面的Cfgfile
  • {{.PID}}:pid,使用pid表示这个组只会有这一个进程
  • {{.StartTime}}:进程的起始时间
  • {{.Cgroups}}:进程的cgoup,可以用于区分不同的容器

进行分组进程过滤除了使用cmdline字段,还可以使用comm和exe,分别表示进程名和二进制路径,并且遵循以下规则:

  • 如果使用了多个字段,则必须都匹配,例如,如果既使用了comm,又使用了exe,两个过滤必须都满足
  • 对于comm和exe,它们是字符串数组,并且是OR的关系
  • 对于cmdline,则是正则表达式数组,并且是AND的关系

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
process_names:
  # 进程名过滤,超过15个字符会被截断
  - comm:
    - bash

  # argv[0],如果开头不是/,说明匹配进程名
  # 如果开头是/,则需要使用二进制路径全匹配
  - exe:
    - postgres
    - /usr/local/bin/prometheus

  # 如果使用多个字段进行匹配,则需要都匹配
  - name: "{{.ExeFull}}:{{.Matches.Cfgfile}}"
    exe:
    - /usr/local/bin/process-exporter
    cmdline:
    - -config.path\s+(?P<Cfgfile>\S+)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 监控NVIDIA GPU进程
filter:
  - name: gpu-process
    pattern: "^nvidia-smi"
    env: ["NVIDIA_VISIBLE_DEVICES=all"]

五、结语

通过DaemonSet部署的Process Exporter,配合Prometheus Operator和Grafana看板,可构建覆盖 容器进程-宿主机服务-硬件资源 的全维度监控体系。建议按照以下步骤落地:

  1. 分阶段实施:从测试环境到生产逐步推进
  2. 制定监控SLA:明确不同级别进程的监控指标阈值
  3. 定期演练:模拟进程异常验证告警有效性
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-03-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维开发故事 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
已关注大佬,是否可以 互粉,和给我这开源项目 https://github.com/youzeliang/rdb 给一个star
已关注大佬,是否可以 互粉,和给我这开源项目 https://github.com/youzeliang/rdb 给一个star
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
Prometheus Process-exporter 监控进程状态
Process-exporter 主要监控主机进程状态,采集服务的进程数、消耗CPU、内存、IO资源等。
Kevin song
2023/02/22
6.3K0
Prometheus Process-exporter 监控进程状态
Prometheus监控进程状态(Process-Exporter)
Prometheus有众多的Exporter可供使用,如在Prometheus+Grafana监控系统搭建一文中提到的Node Exporter就可以用来采集机器的各项指标,从而监控机器的状态。
Cloudox
2021/11/23
7.4K0
Prometheus监控进程状态(Process-Exporter)
Promethues如何对进程监控
process-exporter对应的dashboard为:https://grafana.com/grafana/dashboards/249 注意:CPU一栏有2同样名称,一个是系统空间,一个是用户空间
Linux运维技术之路
2022/06/07
1.4K0
Promethues如何对进程监控
prometheus监控进程数据-process-export
process-exporter是一个进程监控软件,可以把数据传输给prometheus进行管理
仙士可
2023/02/16
1.6K0
linux安装Promethus普罗米修斯监控
下载地址:Releases · prometheus/node_exporter · GitHub
全栈程序员站长
2022/09/09
1.1K0
【实践】Docker环境部署Prometheus+Grafana监控系统
Prometheus是由SoundCloud开发的开源监控报警系统和时序列数据库(TSDB)。
辉哥
2021/03/30
2.3K0
【实践】Docker环境部署Prometheus+Grafana监控系统
kubernetes系列教程(二十)prometheus提供完备监控系统
上一个章节中kubernetes系列教程(十九)使用metric-server让HPA弹性伸缩愉快运行介绍了在kubernetes中的监控架构,通过安装和使用metric-server提供kubernetes中的核心监控指标:提供node节点和pod容器CPU和内存的监控能力,核心监控指标提供的监控维度和指标相对有限,需要更好的扩展监控能力,需要使用自定义监控来实现,本文介绍prometheus提供更更加丰富的自定义监控能力。
HappyLau谈云计算
2020/01/31
6.2K0
kubernetes系列教程(二十)prometheus提供完备监控系统
手把手教你使用 Prometheus 监控 JVM
roc,腾讯高级工程师,Kubernetes Contributor,热爱开源,专注云原生领域。目前主要负责腾讯云TKE 的售中、售后的技术支持,根据客户需求输出合理技术方案与最佳实践,为客户业务保驾护航。 概述 当你的 Java 业务容器化上 K8S 后,如果对其进行监控呢?Prometheus 社区开发了 JMX Exporter 来导出 JVM 的监控指标,以便使用 Prometheus 来采集监控数据。本文将介绍如何利用 Prometheus 与 JMX Exporter 来监控你 Java 应用
腾讯云原生
2020/10/14
6.5K0
PrometheusOperator云原生监控:基于operator部署的资源内部链路分析
假设有个需求:需要将node-exporter的指标暴露到k8s集群外部。如果要搞清楚这个问题,并实现这个需求,需要对通过operator部署的资源、内部链路有一定的了解才可以。所以,本篇要做这方面的一个分享。
不背锅运维
2023/04/28
4970
PrometheusOperator云原生监控:基于operator部署的资源内部链路分析
kubernetes(k8s) 安装 Prometheus + Grafana
MetricServer:是kubernetes集群资源使用情况的聚合器,收集数据给kubernetes集群内使用,如 kubectl,hpa,scheduler等。
小陈运维
2022/04/24
1.7K1
Prometheus+Grafana+altermanager监控k8s并配置报警[通俗易懂]
通过daemonset部署可使每个节点都有一个Pod来采集数据,node-exporter.yaml 内容如下:
全栈程序员站长
2022/08/25
4.6K0
Prometheus+Grafana+altermanager监控k8s并配置报警[通俗易懂]
kubernetes集群全栈监控报警方案kube-prometheus
注意:This will be the last release supporting Kubernetes 1.13 and before. The next release is going to support Kubernetes 1.14+ only. 后续版本只支持k8s1.14+,所以后续要下载release版本,目前只有一个版本所以可以直接git clone
三杯水Plus
2019/06/11
2K0
技术分享 | Linux 环境下针对进程维度的监控实现
运维工作中可能会遇到这么一个痛点,因线上机器基本都是单机多实例,有时候会出现因为某个实例而影响了整个机器的性能。因缺少进程级别的监控,事后想分析是哪个实例跑满了系统资源往往比较困难。为了解决这一痛点,迫切希望实现进程级别的监控。
爱可生开源社区
2022/07/06
1.5K0
kubernetes监控-prometheus(十六)
通过各种exporter采集不同维度的监控指标,并通过Prometheus支持的数据格式暴露出来,Prometheus定期pull数据并用Grafana展示,异常情况使用AlertManager告警。
yuezhimi
2020/09/30
8170
kubernetes监控-prometheus(十六)
使用 Prometheus-Operator 监控 Calico
Calico 中最核心的组件就是 Felix,它负责设置路由表和 ACL 规则等,以便为该主机上的 endpoints 资源正常运行提供所需的网络连接。同时它还负责提供有关网络健康状况的数据(例如,报告配置其主机时发生的错误和问题),这些数据会被写入 etcd,以使其对网络中的其他组件和操作人员可见。
米开朗基杨
2020/07/03
1.8K0
使用 Prometheus-Operator 监控 Calico
Prometheus监控k8s集群节点
Kubernetes 节点的监控:比如节点的 cpu、load、disk、memory 等指标 内部系统组件的状态:比如 kube-scheduler、kube-controller-manager、kubedns/coredns 等组件的详细运行状态 编排级的 metrics:比如 Deployment 的状态、资源请求、调度和 API 延迟等数据指标
mikelLam
2022/10/31
1.5K0
Prometheus监控k8s集群节点
kubernetes监控-prometheus+grafana完美监控
通过各种exporter采集不同维度的监控指标,并通过Prometheus支持的数据格式暴露出来,Prometheus定期pull数据并用Grafana展示,异常情况使用AlertManager告警。
kubernetes中文社区
2019/06/21
6.4K0
kubernetes监控-prometheus+grafana完美监控
Prometheus 开源监控解决方案 之 基本架构及部署
Prometheus把所有的数据按时序列进行存储, 所有采集上来的数据在都被打了时间戳并按时间先后顺序进行流化,这些数据属于相同的指标名以及一组标签维度(labeled dimensions)
王录华
2019/07/31
4K0
Prometheus 开源监控解决方案 之 基本架构及部署
部署 Prometheus Operator 监控 Kubernetes 集群
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/aixiaoyang168/article/details/81661459
哎_小羊
2019/05/25
1.6K0
Kubernetes 集群和应用监控方案的设计与实践
当你的应用部署到 Kubenetes 后,你很难看到容器内部发生了什么,一旦容器死掉,里面的数据可能就永远无法恢复,甚至无法查看日志以定位问题所在,何况一个应用可能存在很多个实例,用户的一个请求不指定被哪个容器处理了,这使得在 Kubernetes 中对应用进行故障排除较为复杂。在应用之外,由于 Kubernetes 作为基础设施,掌管这整个集群的生死,Kubernetes 的任何故障,必定影响到应用服务的运行,因此监控 Kubernetes 运行状况也至关重要。
痴者工良
2022/05/06
1.2K0
Kubernetes 集群和应用监控方案的设计与实践
推荐阅读
相关推荐
Prometheus Process-exporter 监控进程状态
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验