处理资源耗尽错误
目录
Overview配置驱逐策略在节点配置中创建驱逐策略驱逐信号驱逐阈值硬驱逐阈值默认硬驱逐阈值软驱逐阈值配置可调度资源防止节点状态振荡回收节点级资源Pod 驱逐服务质量与 Out of Memory Killer调度器与资源耗尽状态示例场景推荐实践DaemonSet 与资源耗尽处理Overview
本指南介绍如何防止 Alauda Container Platform 节点出现内存(OOM)或磁盘空间耗尽的情况。节点的稳定运行至关重要,尤其是对于不可压缩的资源如内存和磁盘。资源耗尽可能导致节点不稳定。
管理员可以配置驱逐策略,监控节点并在稳定性受影响之前回收资源。
本文档涵盖了 Alauda Container Platform 处理资源耗尽场景的机制,包括资源回收、Pod 驱逐、Pod 调度以及 Out of Memory Killer。还提供了示例配置和最佳实践。
如果节点启用了 swap 内存,则无法检测内存压力。请禁用 swap 以启用基于内存的驱逐。
配置驱逐策略
驱逐策略允许节点在资源不足时终止 Pod,从而回收所需资源。策略由驱逐信号和阈值组成,可在节点配置或命令行中设置。驱逐分为:
- Hard(硬驱逐):阈值超出时立即执行。
- Soft(软驱逐):在宽限期后执行。
合理配置驱逐策略有助于节点主动防止资源耗尽。
当 Pod 被驱逐时,Pod 中的所有容器都会被终止,PodPhase 状态变为 Failed。
对于磁盘压力,节点监控 nodefs(根文件系统)和 imagefs(容器镜像存储)。
- nodefs/rootfs:用于本地磁盘卷、日志及其他存储(如
/var/lib/kubelet)。 - imagefs:容器运行时用于镜像和可写层。
如果没有本地存储隔离(临时存储)或 XFS 配额(volumeConfig),无法限制 Pod 的磁盘使用。
在节点配置中创建驱逐策略
要设置驱逐阈值,请编辑节点配置映射中的 eviction-hard 或 eviction-soft。
硬驱逐示例:
- 驱逐类型:使用
eviction-hard表示硬驱逐阈值。 - 每个驱逐阈值格式为
<eviction_signal><operator><quantity>,例如memory.available<500Mi或nodefs.available<10%。
inodesFree 必须使用百分比值,其他参数可使用百分比或数值。
软驱逐示例:
- 驱逐类型:使用
eviction-soft表示软驱逐阈值。 - 每个驱逐阈值格式为
<eviction_signal><operator><quantity>,例如memory.available<500Mi或nodefs.available<10%。 - 软驱逐的宽限期。建议保持默认值以获得最佳性能。
修改后重启 kubelet 服务使配置生效:
驱逐信号
节点可基于以下信号触发驱逐:
inodesFree必须以百分比形式指定。- 内存计算不包括可回收的非活动文件内存。
- 不要在容器中使用
free -m。
节点每 10 秒监控一次这些文件系统。专用的卷或日志文件系统不被监控。
在因磁盘压力驱逐 Pod 之前,节点会执行容器和镜像垃圾回收。
驱逐阈值
驱逐阈值触发资源回收。当达到阈值时,节点报告压力状态,阻止新 Pod 调度,直到资源回收完成。
- 硬阈值:立即执行。
- 软阈值:宽限期后执行。
阈值格式为:
示例:
memory.available<1Gimemory.available<10%
节点每 10 秒评估一次阈值。
硬驱逐阈值
无宽限期,立即执行。
示例:
默认硬驱逐阈值
软驱逐阈值
软阈值需要宽限期。可选设置最大 Pod 终止宽限期(eviction-max-pod-grace-period)。
示例:
配置可调度资源
通过设置 system-reserved 为系统守护进程保留资源,控制节点可用于调度的资源量。只有当 Pod 超出其请求资源时才会触发驱逐。
- Capacity(容量):节点上的总资源。
- Allocatable(可调度资源):可用于调度的资源。
示例:
可通过节点摘要 API 确定合适的值。
修改后重启 kubelet:
防止节点状态振荡
为避免软驱逐阈值上下振荡,设置 eviction-pressure-transition-period:
示例:
默认值为 5 分钟。修改后重启服务。
回收节点级资源
当满足驱逐条件时,节点会先回收资源,再驱逐用户 Pod。
- 启用 imagefs 时:
- 达到
nodefs阈值:删除死亡的 Pod/容器。 - 达到
imagefs阈值:删除未使用的镜像。
- 达到
- 未启用 imagefs 时:
- 达到
nodefs阈值:先删除死亡的 Pod/容器,再删除未使用的镜像。
- 达到
Pod 驱逐
当阈值和宽限期满足时,Pod 会被驱逐,直到信号低于阈值。
Pod 按服务质量(QoS)和资源消耗排序驱逐。
只有当系统守护进程超过保留资源或仅剩 Guaranteed Pod 时,Guaranteed Pod 才会被驱逐。
磁盘为 BestEffort 资源,Pod 按 QoS 和磁盘使用量逐个驱逐以回收磁盘空间。
服务质量与 Out of Memory Killer
如果在内存回收前发生系统 OOM,OOM Killer 会介入。
OOM 分数根据 QoS 设置:
OOM Killer 会终止得分最高的容器。优先终止 QoS 最低且内存使用最高的容器。容器可能根据节点策略重启。
调度器与资源耗尽状态
调度器在调度 Pod 时会考虑节点状态。
示例场景
运维希望:
- 节点内存为 10Gi。
- 为系统守护进程保留 10%。
- 在利用率达到 95% 时驱逐 Pod。
计算:
capacity = 10Gisystem-reserved = 1Giallocatable = 9Gi
若要在可用内存低于 10% 持续 30 秒时触发软驱逐,或低于 5% 时立即硬驱逐:
system-reserved = 2Giallocatable = 8Gi
配置示例:
此配置避免了调度后立即出现内存压力和驱逐。
推荐实践
DaemonSet 与资源耗尽处理
DaemonSet 创建的 Pod 被驱逐后会立即重建。DaemonSet 应避免使用 BestEffort Pod,采用 Guaranteed QoS 以降低被驱逐风险。