k8s pod因节点临时存储(ephemeral-storage)不足而被驱逐

📅 2026/7/23 4:26:20
k8s pod因节点临时存储(ephemeral-storage)不足而被驱逐
es master三节点中的一个节点提示容器状态未知describe发现events有如下提示这个是Kubernetes Pod因节点临时存储ephemeral-storage不足而被驱逐Evicted的事件日志。Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning Evicted 15m kubelet Thenodewas low on resource: ephemeral-storage. Threshold quantity:3692958570, available: 3567316Ki. Container es-agent was using 1280Ki, request is0, has larger consumption of ephemeral-storage. Container kbagent was using 4Ki, request is0, has larger consumption of ephemeral-storage. Container exporter was using 20Ki, request is0, has larger consumption of ephemeral-storage. Container elasticsearch was using 976Ki, request is0, has larger consumption of ephemeral-storage. Normal Killing 15m kubelet Stopping container elasticsearch Normal Killing 15m kubelet Stopping container kbagent Normal Killing 15m kubelet Stopping container es-agent Normal Killing 15m kubelet Stopping container exporter Warning ExceededGracePeriod 15m kubelet Container runtime did notkillthe pod within specified grace period. Warning FailedPreStopHook 14m kubelet PreStopHook failed问题根因分析直接原因节点可用临时存储available: 3567316Ki ≈ 3.4Gi低于驱逐阈值Thresholdquantity: 3692958570 ≈ 3.52Gi触发机制kubelet 的节点压力驱逐Node Pressure Eviction连锁问题PreStop钩子执行失败14m前容器未在优雅终止期内停止ExceededGracePeriod最终被强制杀死核心问题容器未设置 ephemeral-storage 资源请求/限制从日志看所有容器 request is 0这意味着没有声明对临时存储的资源请求QoS等级为 BestEffort最低优先级节点资源不足时这类Pod会被最先驱逐解决方案1. 立即恢复临时措施# 查看Pod当前状态kubectl get podpod-name-nnamespace# 如果Pod已被删除检查是否有控制器Deployment/StatefulSet自动重建kubectl get deploy,sts-nnamespace# 手动删除Pod让其重建如果控制器存在kubectl delete podpod-name-nnamespace2. 根本解决资源配置在Pod/Deployment/StatefulSet中添加资源限制spec:containers:-name:elasticsearchresources:requests:ephemeral-storage:2Gi# 请求量limits:ephemeral-storage:4Gi# 限制量防止容器写爆磁盘-name:es-agentresources:requests:ephemeral-storage:500Milimits:ephemeral-storage:1Gi-name:kbagentresources:requests:ephemeral-storage:100Milimits:ephemeral-storage:200Mi-name:exporterresources:requests:ephemeral-storage:50Milimits:ephemeral-storage:100Mi3. 修复 PreStop 钩子PreStop钩子失败会导致优雅终止超时检查并修复# 查看Pod的PreStop配置kubectl get podpod-name-nnamespace-oyaml|grep-A5-B5preStop# 常见问题# - 钩子中调用的命令/API不存在# - 超时时间设置过短# - 网络问题导致钩子无法完成建议增加 terminationGracePeriodSeconds默认30秒spec:terminationGracePeriodSeconds:60# 增加到60秒containers:-name:elasticsearchlifecycle:preStop:exec:command:[/bin/sh,-c,curl -XPOST http://localhost:9200/_cluster/nodes/_local/shutdown]4. 节点层面优化# 查看节点磁盘使用情况kubectl describenodenode-name|grep-A5Allocated resources# 清理节点上的无用资源# - 清理已终止的容器日志# - 清理未使用的镜像# - 清理已完成的Poddockersystem prune-f# 如果是Docker运行时5. 配置驱逐阈值集群管理员修改kubelet配置调整更合理的阈值# /var/lib/kubelet/config.yamlevictionHard:imagefs.available:15%nodefs.available:10%ephemeral-storage.available:10%# 当前是约15%evictionSoft:ephemeral-storage.available:15%evictionSoftGracePeriod:ephemeral-storage.available:2m预防建议监控告警对节点磁盘使用率设置告警如 80%日志轮转配置容器日志轮转策略max-size, max-file持久化存储对需要大量存储的组件使用PVC而非emptyDir资源配额在命名空间级别设置ResourceQuota限制总存储使用apiVersion:v1kind:ResourceQuotametadata:name:compute-quotanamespace:your-namespacespec:hard:requests.ephemeral-storage:20Gilimits.ephemeral-storage:40Gi验证修复# 查看Pod资源请求/限制是否生效kubectl describe podpod-name-nnamespace|grep-A3QoS# 期望输出QoS Class: Burstable 或 Guaranteed有requests如果问题持续需要检查是否有日志文件过大未轮转是否有应用产生大量临时文件节点的emptyDir目录/var/lib/kubelet是否被其他Pod占满怎么看出来是临时存储的1. 直接从事件消息中识别日志里明确写了Thenodewas low on resource: ephemeral-storageephemeral-storage 就是临时存储的英文术语中文翻译临时存储、临时存储空间、临时卷存储2. 关键词对照表英文关键词中文含义说明ephemeral-storage临时存储Kubernetes官方术语ephemeral临时/短暂的表示非持久化emptyDir临时卷Pod级别临时存储的一种实现nodefs节点文件系统包含/var/lib/kubelet等imagefs镜像文件系统存放容器镜像3. 阈值表达式的含义Threshold quantity:3692958570, available: 3567316Ki这两个值的单位不一样3692958570 → 没有单位后缀默认是字节bytes换算3692958570 bytes ≈ 3.52 GiB3567316Ki → KiBKibibyte换算3567316 KiB ≈ 3.4 GiB所以实际含义是阈值:3.52GiB(硬驱逐阈值)可用:3.40GiB 可用阈值 → 触发驱逐4. Kubernetes存储类型对比存储类型生命周期是否临时典型用途ephemeral-storagePod生命周期✅ 是容器日志、镜像层、emptyDiremptyDirPod生命周期✅ 是临时缓存、共享数据hostPath节点生命周期❌ 否宿主机目录挂载PersistentVolume (PVC)独立于Pod❌ 否持久化数据数据库configMap/secretPod生命周期✅ 是配置文件、密钥5. ephemeral-storage 包含哪些内容/var/lib/kubelet/ ├── containers/# 容器可写层├── volumes/# emptyDir等临时卷├── pods/# Pod相关文件└──... /var/log/containers/# 容器日志/var/lib/docker/# 镜像层部分计入如何查看当前Pod的临时存储使用# 方法1查看Pod的详细状态kubectl describe podpod-name-nnamespace# 查找 Ephemeral Storage 相关行# 方法2查看节点上所有Pod的存储使用kubectltoppod-nnamespace--containers# 注top命令不直接显示存储需要结合以下命令# 方法3查看节点的存储分配情况kubectl describenodenode-name# 输出示例# Allocated resources:# ephemeral-storage: 15Gi (40%)7. 实际查看节点存储的命令# 登录到节点查看实际磁盘使用df-h/var/lib/kubelet# 输出示例# Filesystem Size Used Avail Use% Mounted on# /dev/sda1 100G 85G 15G 85% /var/lib/kubelet# 查看详细的目录占用du-sh/var/lib/kubelet/*|sort-hr|head-108. 日志中的request is 0含义Container es-agent was using 1280Ki, request is0容器实际使用了 1280 KiB 的临时存储但没有设置资源请求request0这意味着该Pod的QoS是 BestEffort最低优先级当节点资源不足时这种Pod会被最先驱逐9.快速验证命令bash# 查看Pod的QoS等级如果是BestEffort则没有requestskubectl get podpod-name-nnamespace-ojsonpath{.status.qosClass}# 查看Pod的资源请求kubectl get podpod-name-nnamespace-oyaml|grep-A10resources:总结如何一眼识别临时存储驱逐看关键词ephemeral-storage 或 临时存储看资源类型不是 memory 或 cpu看驱逐原因Evicted resource: ephemeral-storage看数值单位Ki、Mi、Gi或纯数字表示字节看容器使用using 多少request 是多少如果日志写的是 disk pressure 或 nodefs也是指磁盘/存储相关但 ephemeral-storage 是Kubernetes 1.8后的标准术语。