场景
某金融平台的 Kubernetes 集群托管了一个名为 ledger-sync 的微服务。在一次例行发布中,2.3.1 版本在后台 worker 中引入了内存泄漏。四小时内,集群开始出现内存压力:多个节点报告 MemoryPressure 条件,kubelet 开始驱逐低优先级 Pod 以回收内存。收到告警:KubeNodeMemoryPressure。
初始症状
kubectl get nodes显示多个节点在CONDITION列有MemoryPressure。- 多个 Pod(包括无关服务的 Pod)被驱逐或重启。
kubectl get events -A显示FailedScheduling,原因是Insufficient memory。- Pod 指标显示
ledger-syncworker Pod 的内存使用量稳定攀升至其限制。
诊断步骤
1. 确定压力来源
使用 kubectl top nodes 确认内存使用情况。然后进一步深入工作负载:
kubectl top nodes
kubectl top pods -n production --sort-by=memory
ledger-sync worker Pod 很可能显示接近限制的内存。
2. 检查节点和 kubelet 事件
kubectl describe node <nodename> | grep -A10 Conditions
kubectl get events -n production --field-selector involvedObject.name=<pod-name> -o wide
寻找 SystemOOM 或 Evicted 原因。
3. 检查资源请求和限制
kubectl describe pod <pod-name> -n production | grep -A2 Requests
如果容器没有内存限制,泄漏会耗尽节点内存。如果存在限制,容器将被 OOMKilled。
4. 检查应用程序日志
kubectl logs <pod-name> -n production --previous | tail -50
寻找重复分配或错误模式,这可能是泄漏的迹象。
5. 验证 HPA 和扩缩容行为
kubectl get hpa -n production
如果 HPA 基于内存进行扩缩容,它可能已经增加了副本,使问题更严重。
风险控制和安全检查
- 不要在不了解影响的情况下随机删除 Pod。只有在确保工作负载可重新调度后,才使用
kubectl drain。 - 限制爆炸半径:在回滚前使用
kubectl scale减少副本数,但请注意,如果现有 Pod 仍然累积内存,缩容可能不会释放内存。 - 保护关键服务:如果必须驱逐 Pod,使用 PodDisruptionBudget(PDB)确保可用性。
- 保留证据:在更改之前,保存当前部署规范:
kubectl get deployment ledger-sync -n production -o yaml > ledger-sync-current.yaml。 - 准备回滚工件:在镜像仓库中保留上一个镜像版本。
回滚计划
- 隔离有故障的工作负载 – 将部署缩小到零,以停止进一步资源消耗:
kubectl rollout undo deployment/ledger-sync -n production --to-revision=<previous-revision>
- 验证镜像标签 – 确保旧镜像健康:
kubectl get deployment ledger-sync -n production -o jsonpath='{.spec.template.spec.containers[].image}'
- 检查卡住的驱逐 – 如果节点仍然有压力,封锁受影响的节点并迭代地排空:
kubectl cordon <nodename>
kubectl drain <nodename> --ignore-daemonsets --delete-emptydir-data --disable-eviction
警告:
drain与--delete-emptydir-data会删除 emptyDir 数据。仅在确认数据不重要时使用。
- 快速缓解压力 – 如果集群严重不平衡,临时删除已驱逐的 Pod 以释放元数据:
kubectl delete pods -n production --field-selector=status.phase=Succeeded
验证
- 节点健康:
kubectl get nodes应显示没有MemoryPressure。 - Pod 稳定性:
kubectl get pods -n production应显示所有期望的 Pod 都处于Running和Ready。 - 应用性能:监控
ledger-sync服务的延迟和错误率,确保回滚恢复正常。 - 资源使用:在 24 小时内观察
kubectl top nodes,确认内存使用回到基线。
何时提交 OpsGlobal 工单
如果出现以下任何一种情况,请提交 OpsGlobal 工单:
- 内存泄漏在多个版本中反复出现,需要代码级修复。
- 节点出现 SystemOOM 内核事件,这可能表明更深层的基础设施问题。
- 尽管尝试了回滚,集群仍处于降级状态超过 30 分钟。
- 您需要设计或实施资源配额、垂直 Pod 自动扩缩容或工作负载重新平衡。
OpsGlobal 提供 7×24 小时的事件响应、根本原因分析和集群加固服务,让您的团队专注于产品,而我们将确保控制平面稳定。
适用场景
适合正在处理 Kubernetes、Kubernetes, SRE, 事故响应, 内存压力 相关问题的团队,用于快速建立排查路径和交付标准。
问题背景
应对 Kubernetes 内存压力事件的实用指南:识别症状、诊断命令、风险控制、回滚与验证。
排查步骤
先确认影响范围和最近变更,再收集日志、配置、指标和链路数据,最后按风险从低到高执行修复。
命令示例
示例命令请替换为你的真实资源名,并使用环境变量保存账号、密码、token 等敏感信息。
风险说明
生产环境操作前需要确认备份、权限边界、变更窗口和回滚路径,避免扩大故障影响。
回滚方案
保留原配置和发布版本;如修复后指标异常,立即回退配置、镜像或数据库变更并复核日志。
交付清单
问题定位记录、关键命令、修复步骤、验证结果、后续优化建议。
遇到类似技术问题?
如果你的服务器、K8s、Docker、CI/CD、数据库或监控系统出现类似问题,可以提交日志和配置文件,我们帮你远程诊断。