k8s集群内prometheus频繁oomkilled问题解决

随着k8s集群规模扩大,Prometheus面临OOM问题。本文分享了解决方案:拆分抓取任务、过滤指标、调整数据落盘时间,采用联邦模式汇总监控数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

通过在k8s集群内搭建prometheus对k8s集群进行监控,主要包括以下模块

  • node-exporter监控物理机资源
  • cadavisor、kube-state-metrics监控容器资源
  • kubelete
  • apiserver
  • etcd
  • controller manager
  • kube-proxy
  • 应用程序容器自身暴露的metrics

但随着集群规模的增大,抓取的监控指标越来越多,prometheus容器开始经常出现oomkilled的问题,导致prometheus几乎不可用,无限增大分配给prometheus容器的内存终究不是最终的解决方案,现将自己解决这个问题的思路给大家分享一下,希望能够对你有所帮助!

解决方案

  • 拆分抓取任务

最初数据抓取量不大时,单个prometheus就可以完成对背景介绍中几个模块的数据的抓取,即所有的job都在一个prometheus中进行配置,但随着集群规模的增大,个别job的数据抓取量变得非常庞大,导致oomkilled之后所有的任务都会受到影响,所以可以通过查询每个job的数据量,对抓取任务进行拆分,将他们分散到多个prometheus中去完成任务的抓取

# 查看job数据抓取量
sort_desc(sum(scrape_samples_scraped) by (job))
  • 过滤抓取指标

将prometheus拆分成多个之后,监控数据分散在了多个不同的位置,如何方便的查询就又成了一个新的问题,这个就可以使用prometheus的联邦模式(FEDERATION)将多个Prometheus中的监控数据归集到一起,但是需要注意的是,归集时只去抓取需要的监控指标,尽量的精简,全量抓取同样会导致之前的问题,而且这对抓取端与被抓取端来说,都是很大的压力

# 联邦配置,只抓取需要的指标

- job_name: prod-k8s-node
  honor_labels: true
  honor_timestamps: true
  params:
    match[]:
    - node_cpu_seconds_total
    - node_filesystem_avail_bytes
    - node_filesystem_size_bytes
    - node_memory_Cached_bytes
    - node_memory_MemFree_bytes
    - node_memory_MemTotal_bytes
    - node_processes_max_processes
    - node_processes_threads
    - node_systemd_unit_state
    - node_timex_estimated_error_seconds
    - process_max_fds
    - process_open_fds
  scrape_interval: 1m
  scrape_timeout: 1m
  metrics_path: /federate
  scheme: http
  static_configs:
  - targets:
    - 127.0.0.12:9090
  • 调整数据落盘时间

prometheus抓取到的监控数据在落盘之前都是存储在内存中的,所以适当的减小数据落盘时间可以减小内存的压力

storage.tsdb.max-block-duration	设置数据块最小时间跨度,默认 2h 的数据量。监控数据是按块(block)存储,每一个块中包含该时间窗口内的所有样本数据(data chunks)
storage.tsdb.min-block-duration	设置数据块最大时间跨度,默认为最大保留时间的 10%

# 通过在promethe启动参数中设置相应参数来调整
./prometheus \
--web.listen-address=:9090 \
--web.external-url=http://0.0.0.0:9090/ \
--web.enable-admin-api \
--storage.tsdb.min-block-duration=1h \
--storage.tsdb.max-block-duration=1h \
--storage.tsdb.retention=30d

总结

以上就是我在处理Prometheus频繁oomkilled问题的解决方案,希望能对你有所帮助,后面会更新背景介绍中几个模块任务的抓取任务配置方式,欢迎关注!

欢迎关注我的个人微信公众号,一个菜鸟程序猿的技术分享和奔溃日常

一个菜鸟程序猿的技术技术分享和奔溃日常

<think>嗯,用户这次聚焦在Kubernetes集群中Pod数量过多引发的资源竞争问题诊断和解决,这属于云原生环境下的典型性能调优场景。结合用户提供的引用和先前讨论的Pod性能影响分析,需要从系统监控、资源隔离、调度策略三个维度展开。 用户引用的材料[^1]提到kubelet通过静态Pod启动控制平面组件,这提示控制平面本身也可能受资源竞争影响;引用[^2]强调Node负责运行工作负载,说明诊断需覆盖节点级资源;引用[^4]描述的扁平网络模型则暗示网络带宽可能成为隐形瓶颈。诊断流程应该分层递进:首先用kubectl toppod/node确认基础资源水位(CPU/MEM),再通过节点kernlog检查OOMKiller事件;若资源充足却仍有竞争,需用perf-tools分析内核调度延迟。对于网络问题,引用[^4]提到的Pod CIDR机制提示要检查CNI插件配置和iptables规则数量。 优化策略需要结合K8s特性:引用[^1]提到的kubeadm部署方式会影响控制平面稳定性,因此DaemonSet类Pod要限制资源;引用[^2]的Node角色划分则支持用节点亲和性隔离关键负载。最后必须强调HPA的合理配置——先前分析指出70%-80%利用率是黄金区间,这与autoscaling/v2版本的容器资源指标配置直接相关。 用户作为云平台运维人员,深层需求其实是预防而非补救。所以补充了ResourceQuotas和LimitRanges的配置示例,并建议用PDB保障关键服务。相关问题设计也延续了这种思路,从故障注入到成本优化都指向系统性解决方案。</think>在Kubernetes环境中,Pod数量过多导致的资源竞争问题可按以下步骤诊断和解决: --- ### **诊断资源竞争问题** #### **1. 监控关键指标** - **节点级资源**: - 使用 `kubectl top nodes` 查看节点CPU/内存使用率 - 若节点CPU > 80% 或内存 > 90%,表明资源紧张[^4] - 通过`kubectl describe node <节点名>` 检查 `Allocatable` 与 `Requests` 差值 - **Pod级资源**: - `kubectl top pods --all-namespaces` 识别高负载Pod - 关注 **OOMKilled** 事件(内存竞争)或 **Throttling**(CPU竞争) - **网络与存储**: - 使用 `atop` 工具监控磁盘I/O繁忙度(`DSK`列)[^4] - 通过 `iftop` 检查节点网络带宽占用 #### **2. 分析资源瓶颈类型** | 瓶颈类型 | 诊断工具 | 关键指标 | |----------|----------|----------| | **CPU竞争** | `kubectl describe pod` | `CPU Throttling` 日志 | | **内存竞争** | 节点`kern.log` | `OOM Killer` 记录 | | **I/O竞争** | `atop` / `iostat` | 磁盘 `await` > 10ms | | **网络竞争** | `iftop` / `nload` | 带宽持续 > 80% | > 引用[^4]强调:磁盘高繁忙度(busy)会显著影响其他进程性能 #### **3. 控制平面影响检查** 若Master节点资源不足(引用[^1][^2]): - 检查 `kube-apiserver`/`etcd` 的延迟:`kubectl get --raw=/readyz?verbose` - 查看 `kube-scheduler` 日志:`kubectl logs -n kube-system <scheduler-pod>` --- ### **解决资源竞争策略** #### **1. 垂直扩容(Vertical Scaling)** ```yaml # 调整Pod资源限制(示例) resources: limits: cpu: "2" # 从1核提升到2核 memory: "4Gi" # 从2Gi提升到4Gi ``` > **适用场景**:单个Pod因资源不足频繁重启 #### **2. 水平扩容优化(Horizontal Scaling)** - **调整HPA策略**: ```yaml # 基于资源利用率扩容 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 70 # 原为80,降低触发阈值 ``` - **添加反亲和性**:避免高负载Pod集中 ```yaml affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: [high-load-app] topologyKey: kubernetes.io/hostname ``` #### **3. 节点级优化** - **增加节点**:`kubectl scale --replicas=5 node/node-pool` - **污点隔离**:为特殊负载预留节点 ```bash kubectl taint nodes node1 dedicated=highmem:NoSchedule ``` #### **4. 控制平面加固(引用[^1][^2])** - **静态Pod资源限制**:编辑 `/etc/kubernetes/manifests/kube-apiserver.yaml` ```yaml resources: requests: cpu: "500m" memory: "512Mi" ``` - **etcd优化**:启用SSD存储,分离API服务器与etcd节点 --- ### **预防性措施** 1. **资源配额管理**: ```yaml # 命名空间级资源配额 apiVersion: v1 kind: ResourceQuota metadata: name: pod-limit spec: hard: pods: "50" # 限制Pod数量 requests.cpu: "20" ``` 2. **LimitRanges设置默认值**: ```yaml apiVersion: v1 kind: LimitRange metadata: name: mem-limit-range spec: limits: - default: memory: "1Gi" type: Container ``` 3. **定期巡检**: - 使用 `Prometheus` + `Grafana` 建立资源趋势看板 - 部署 `kube-state-metrics` 监控Pod密度 > 关键原则:**资源竞争本质是调度失衡**,需结合负载特征动态调整策略[^3][^4] ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值