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

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

背景

通过在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中的监控数据归集到一起,但是需要注意的是,归集时只去抓取需要的监控指标,尽量的精简,全量抓取同样会导致之前的问题,而且这对抓取端与被抓取端来说,都是很大的压力

<
在 Kubernetes 中,Pod 突然出现异常状态可能是由多种原因引起的,包括节点问题、容器崩溃、资源限制、网络中断、存储问题等。以下是针对此类问题的排查和解决方案: ### 1. 查看 Pod 状态和事件日志 首先使用 `kubectl describe pod <pod-name>` 命令查看 Pod 的当前状态和最近事件。事件日志通常会提供关键线索,例如容器崩溃、镜像拉取失败、资源不足等。 示例命令: ```bash kubectl describe pod my-pod -n default ``` 通过事件日志可以判断问题是否与调度、容器启动、健康检查失败等有关[^1]。 ### 2. 检查容器日志 使用 `kubectl logs <pod-name>` 查看容器的标准输出日志,识别是否有异常堆栈或错误信息。 如果容器曾发生崩溃并重启,可以使用 `--previous` 参数查看上一次容器的日志: ```bash kubectl logs my-pod -n default --previous ``` ### 3. 检查节点状态 Pod 所在节点可能出现问题,例如节点宕机、资源耗尽或 Kubelet 异常。使用以下命令检查节点状态: ```bash kubectl describe node <node-name> ``` 关注节点的 `Conditions` 字段,查看是否有 `NotReady`、`DiskPressure`、`MemoryPressure` 等异常状态。如果节点状态为 `Unknown`,则可能是由于 Kubelet 失联或网络中断导致[^1]。 ### 4. 检查 Pod 的健康检查配置 Kubernetes 使用 `livenessProbe` 和 `readinessProbe` 来监控容器健康状态。如果探针配置不当或服务响应超时,可能导致容器被重启或标记为不可用。 检查 Pod 的 YAML 配置中探针设置是否合理,例如: ```yaml livenessProbe: httpGet: path: /healthz port: 8080 initialDelaySeconds: 30 periodSeconds: 10 ``` 若探针频繁失败,可适当调整 `initialDelaySeconds` 和 `failureThreshold` 参数,避免误杀正在启动的容器[^1]。 ### 5. 检查资源限制和配额 Pod 可能因为资源请求过高或集群资源不足而无法调度或被 OOMKilled。检查 Pod 的资源请求和限制是否合理: ```yaml resources: requests: memory: "256Mi" cpu: "100m" limits: memory: "512Mi" cpu: "500m" ``` 使用以下命令查看是否有因资源不足导致的调度失败或 Pod 被驱逐: ```bash kubectl describe node <node-name> | grep -i "evicted" ``` ### 6. 检查网络和存储卷配置 Pod 异常也可能是由于网络策略限制、服务发现失败或存储卷挂载失败引起。检查 Pod 的 `volumes` 和 `volumeMounts` 是否配置正确,以及网络策略是否限制了容器间的通信。 ### 7. 使用监控和告警系统 建议集成 Prometheus、Grafana 或 Kubernetes 内置的 Metrics Server,实时监控 Pod 的 CPU、内存、网络等指标。通过设置告警规则(如 CPU 使用率超过阈值、Pod 重启次数过多等),可以在问题发生前及时响应。 ### 8. 定期维护和健康检查 定期执行节点巡检、清理无效 Pod 和镜像、更新 Kubernetes 版本,并配置 Pod 的自动重启策略(如 `restartPolicy: Always`),有助于提升集群的稳定性和容错能力。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值