容器环境中的存储容量管理,往往在应用发布后才暴露出问题:磁盘写满、PVC 无法挂载、扩容操作失败。与其事后处理,不如主动建立一套监控、扩展与回收的闭环流程。本文基于 Kubernetes 官方文档与 Prometheus、OpenTelemetry 等工具,提供可操作的判断路径。
为什么容器存储容量难以把握?
Kubernetes 官方文档指出,其为 Pod 提供长期和临时存储的多种方式。但实际使用中,容量管理常因以下原因失控:
- 临时存储(emptyDir)与节点本地磁盘绑定,易被日志或中间文件填满。
- 持久卷(PV)的配额基于存储类定义,但实际使用率缺乏实时可见性。
- 多个应用共享同一存储后端,容量分配与回收策略不清晰。
要有效管理,需从监控入手,以数据驱动决策。
第一步:建立存储监控体系
监控是容量管理的基础。Prometheus 作为云原生监控的事实标准,其官方文档强调它收集并存储带时间戳的指标,非常适合跟踪存储使用趋势。而 OpenTelemetry 则提供厂商中立的可观测性框架,可统一采集指标、日志和链路,便于关联分析。
监控哪些关键指标?
- PVC 使用率:通过 kubelet 暴露的
kubelet_volume_stats_used_bytes和kubelet_volume_stats_available_bytes获取。 - 节点文件系统使用率:监控
node_filesystem_avail_bytes等指标,防止本地临时存储耗尽。 - 存储后端性能与容量:若使用云盘或分布式存储,需通过 CSI 驱动暴露的指标(如容量、IOPS)补充。
配置告警规则
基于 Prometheus 的 Alertmanager,可设置分级告警:当 PVC 使用率超过 80% 时警告,超过 90% 时紧急。阈值应根据应用写入模式调整,避免误报。
第二步:扩展存储容量
当监控发现容量不足时,需判断是否支持在线扩容。Kubernetes 1.11 起支持 PVC 扩容,但前提是存储类(StorageClass)允许 allowVolumeExpansion: true。具体操作步骤:
- 确认存储类支持扩容:
kubectl get storageclass查看ALLOWVOLUMEEXPANSION字段。 - 编辑 PVC 的
spec.resources.requests.storage字段,增大容量。 - 等待存储控制器自动扩容,并验证 PV 大小更新。
常见误区:部分存储后端(如某些 NFS 或本地卷)不支持在线扩展,此时需提前规划,或采用存储抽象层(如 CSI 驱动)来支持。若扩容失败,需检查存储类配置及 CSI 驱动日志。
第三步:回收与释放存储
回收策略决定 PVC 删除后 PV 的行为。Kubernetes 提供三种回收策略:Retain、Recycle(已弃用)和 Delete。默认情况下,动态供给的 PV 通常为 Delete,即删除 PVC 后底层存储也被释放。但若使用 Retain,PV 会保留,需手动清理。
如何选择回收策略?
- 开发环境:建议使用
Delete,简化资源回收。 - 生产环境:若需备份或审计,使用
Retain,但需建立定期清理流程,避免存储泄漏。
清理孤儿 PV
对于 Retain 策略下已释放的 PV,管理员需手动删除 PV 并清理由此产生的存储资源。可使用 kubectl delete pv 命令,但需先确认底层存储已安全处理。
常见误区与排查思路
误区一:只监控 PVC 使用率,忽略节点临时存储
emptyDir 等临时存储虽不持久,但可能占满节点磁盘,影响 kubelet 和系统组件。务必同时监控节点文件系统。
误区二:扩容后未验证实际生效
扩容操作可能因存储后端限制而失败,或需要重启 Pod 才能生效(取决于文件系统类型)。扩容后应检查 kubectl get pvc 的状态,并进入 Pod 内执行 df -h 验证。
误区三:回收策略设置不当导致存储泄漏
使用 Retain 策略时,若没有定期清理,PV 会积累,造成成本浪费。建议结合自动化脚本或策略定期扫描并清理。
总结
容器存储容量管理并非一次性任务,而是需要持续监控、按需扩展和定期回收的循环。利用 Prometheus 的指标采集和 OpenTelemetry 的统一可观测性,您可以提前发现风险;通过合理的 PVC 扩容流程和回收策略,避免容量瓶颈和资源浪费。最后,请务必根据您的存储后端特性调整方案,并在非生产环境验证每个步骤。
参考资料
延伸阅读
