Kubernetes 存储实战:PVC 动态供给与 Pod 重启后数据丢失排查
Kubernetes 存储实战:PVC 动态供给与 Pod 重启后数据丢失排查写数据库、写上传文件、写缓存,只要 Pod 里的进程往磁盘写东西,你迟早会撞上同一个问题:Pod 一重启,数据全没了。很多人第一反应是「加个 volume 不就行了」,结果加了emptyDir发现重启照样丢,或者用了 PVC 却发现多副本时数据对不上。这篇把动态供给讲清楚,再把「重启后数据丢失」这个最高频的坑逐层拆开。先搞清楚:emptyDir 为什么救不了你新手最容易写出这样的 volume:apiVersion:v1kind:Podmetadata:name:demospec:containers:-name:appimage:busyboxcommand:[sh,-c,echo hi /data/log.txt; sleep 3600]volumeMounts:-name:cachemountPath:/datavolumes:-name:cacheemptyDir:{}# 生命周期绑定 Pod,Pod 没了目录就没了emptyDir的生命周期和 Pod 绑定。容器崩溃重启(同一个 Pod 内)数据还在,但 Pod 被删除重建(滚动更新、节点驱逐、kubectl delete pod)时,emptyDir会被清空。它的定位是「临时暂存」,不是持久化。要跨 Pod 生命周期保留数据,必须用PersistentVolume(PV)。动态供给:别再手写 PV早期用法是管理员先手动创建一堆 PV,用户再用 PVC 去认领。规模一大就崩溃。现在的标准做法是动态供给:你只声明「我要多大、什么类型」,StorageClass背后的 provisioner 自动帮你开一块盘。先看集群有哪些 StorageClass:kubectl get storageclass# NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE# standard (default) k8s.io/minikube-hostpath Delete Immediate# gp3 ebs.csi.aws.com Delete WaitForFirstConsumer带(default)的是默认类。写 PVC 时不指定storageClassName就用它:apiVersion:v1kind:PersistentVolumeClaimmetadata:name:data-pvcspec:accessModes:-ReadWriteOnce# 单节点读写,最常用resources:requests:storage:5GistorageClassName:gp3# 显式指定,别依赖默认类应用到 Deployment:apiVersion:apps/v1kind:Deploymentmetadata:name:webspec:replicas:1selector:matchLabels:{app:web}template:metadata:labels:{app:web}spec:containers:-name:webimage:nginxvolumeMounts:-name:datamountPath:/usr/share/nginx/htmlvolumes:-name:datapersistentVolumeClaim:claimName:data-pvc现在 Pod 重启、重建,/usr/share/nginx/html里的数据都还在——只要 PVC 没被删。坑一:PVC 一直 Pending,Pod 也起不来kubectl get pvc看到Pending,先看事件:kubectl describe pvc># Events:# Warning ProvisioningFailed ... no volume plugin matched常见三种原因:storageClassName写错或集群根本没这个类。kubectl get sc核对名字。VolumeBindingMode 是WaitForFirstConsumer。这不是错误——它故意等到有 Pod 调度了才创建卷(为了把卷开在 Pod 所在的可用区)。此时 PVC Pending 是正常的,等 Pod 调度上去就会 Bound。如果 Pod 也 Pending,去查 Pod 的调度事件。底层配额不足,比如云账号 EBS 卷数量到上限。看 provisioner 的日志。坑二:多副本时数据「对不上」——ReadWriteOnce 的真相把上面的replicas改成 3,你可能会发现 3 个 Pod 看到的数据不一致,甚至有 Pod 卡在ContainerCreating。原因在accessModes。ReadWriteOnce(RWO)的含义是同一时刻只能被一个节点挂载读写。多个副本如果被调度到不同节点,后面的 Pod 挂不上卷:kubectl describe pod web-xxx# Warning FailedAttachVolume Multi-Attach error for volume pvc-...# Volume is already exclusively attached to one node三种访问模式记牢:模式缩写语义ReadWriteOnceRWO单节点读写(块存储,如 EBS)ReadOnlyManyROX多节点只读ReadWriteManyRWX多节点读写(需 NFS、CephFS 等文件存储)结论:多副本共享写数据,要么用支持 RWX 的存储(NFS/CephFS),要么改架构——用StatefulSet给每个副本一块独立的 PVC。坑三:重启后数据还是丢了——三个隐藏杀手你明明用了 PVC,数据却还是没了。逐个排查:1. ReclaimPolicy 是 Delete,PVC 被删了kubectl getpv# RECLAIM POLICY: DeleteDelete策略下,删除 PVC 会连带删掉 PV 和底层云盘。如果你的 CI 脚本或helm uninstall删了 PVC,数据就真没了。生产环境重要数据把 StorageClass 的reclaimPolicy设成Retain,删 PVC 后 PV 保留、数据还在,可手动恢复。2. subPath 挂错,写进了容器层volumeMounts:-name:datamountPath:/app/datasubPath:prod# 卷内的子目录如果应用实际写的是/app/logs而不是/app/data,那/app/logs还在容器可写层里,重启就没。确认应用的写入路径和mountPath完全一致,进容器df -h看目标目录是不是挂载点:kubectlexec-itweb-xxx --df-h/app/data# Filesystem ... Mounted on# /dev/nvme1n1 ... /app/data ← 是独立设备才说明挂上了如果Mounted on显示的是overlay(容器根文件系统),说明根本没挂上卷,写的都是临时数据。3. StatefulSet 缩容删了 PVCStatefulSet缩容默认不会删 PVC(这是有意保护数据)。但如果你手动kubectl delete pvc,或者设了persistentVolumeClaimRetentionPolicy: Delete,缩容时 PVC 就被回收了。检查:kubectl get statefulset db-oyaml|grep-A3RetentionPolicy一个能落地的排查顺序数据丢失时,按这个顺序查,基本 5 分钟定位:# 1. Pod 到底挂没挂上卷?kubectlexec-itpod--df-hmountPath# 看是不是 overlay# 2. PVC 是不是 Bound?kubectl get pvc# 3. PV 的回收策略?会不会被连带删除?kubectl getpv-ocustom-columnsNAME:.metadata.name,POLICY:.spec.persistentVolumeReclaimPolicy# 4. 应用写入路径 vs mountPath/subPath 对得上吗?kubectl get podpod-oyaml|grep-A5volumeMounts小结emptyDir是临时暂存,Pod 重建即清空,别拿它做持久化。动态供给靠StorageClass,PVC 只声明「多大 什么类」,provisioner 自动开盘。PVC Pending 先看describe:多半是storageClassName错,或WaitForFirstConsumer在等 Pod 调度。ReadWriteOnce是单节点读写,多副本共享写要用 RWX 存储或 StatefulSet。重要数据把reclaimPolicy设成Retain,删 PVC 也不丢盘。一句话记忆点:数据丢了先df -h看目标目录是不是 overlay——是 overlay 就压根没挂上卷,别的都白查。

相关新闻

Godot 4实战:动画状态机与行为树构建第三人称战斗原型

Godot 4实战:动画状态机与行为树构建第三人称战斗原型

1. 项目概述:从零构建一个可玩的第三人称战斗原型最近在捣鼓Godot 4,想做一个手感还不错的第三人称动作战斗原型。这听起来像是个大工程,但拆解开来,核心其实就是两件事:让角色动起来像那么回事,以及让角色…

2026/10/17 8:49:00 阅读更多 →
AI 短剧疯狂内卷!有人月入十万,大量新手亏到退场,避坑指南收好

AI 短剧疯狂内卷!有人月入十万,大量新手亏到退场,避坑指南收好

#AI 漫剧# #AI 短剧变现# #短视频创#全网 AI 短剧赛道冰火两重天。头部团队依靠成熟剧本、稳定流量分成持续盈利;大量跟风入局的新手,投入时间、购买工具,最终播放惨淡,一分钱收益没有。很多博主只宣传 “零成本做 AI 短剧月入过…

2026/10/14 17:41:49 阅读更多 →
扣子飞书机器人权限体系详解,97%开发者忽略的5个安全断点及加固方案

扣子飞书机器人权限体系详解,97%开发者忽略的5个安全断点及加固方案

更多请点击: https://codechina.net 第一章:扣子飞书机器人权限体系全景概览 扣子(Coze)与飞书(Feishu)深度集成后,机器人权限不再仅由飞书侧单点控制,而是形成“飞书应用权限 扣子…

2026/10/3 11:46:29 阅读更多 →

最新新闻

C++ libcurl工业级实战:断点续传、进度回调与SSL证书校验

C++ libcurl工业级实战:断点续传、进度回调与SSL证书校验

简介:本资源是一套面向C中高级开发者与跨平台网络编程学习者的实战项目包,聚焦libcurl在HTTP文件上传与下载场景下的工程化应用,并配套Node.js服务端用于端到端功能验证。资源共872个文件,涵盖227个JavaScript服务端逻辑文件、128…

2026/10/17 8:49:26 阅读更多 →
artcraft:融合数字艺术与手工工艺的创作实践指南

artcraft:融合数字艺术与手工工艺的创作实践指南

1. 项目定位与创作思路拆解1.1 “artcraft”到底要做什么“artcraft”这个名字,我第一次看到时就觉得挺有意思:前半段是 art(艺术),后半段是 craft(工艺、手艺)。很多人把它理解成“艺术手作”&…

2026/10/17 8:49:26 阅读更多 →
Flutter Sliver 固定头布局:SliverPersistentHeader 与 SliverToBoxAdapter 实战

Flutter Sliver 固定头布局:SliverPersistentHeader 与 SliverToBoxAdapter 实战

在 Flutter 的滚动体系里,Sliver 家族算是把“灵活”两个字玩到极致的一层。很多人第一次接触 CustomScrollView 的时候,看到一堆 Sliver 前缀的组件会本能地犯怵,觉得这玩意儿比 ListView 复杂太多。但真正在项目里做过复杂头部交互的人都知…

2026/10/17 8:49:26 阅读更多 →
OSPF区域外路由计算:FA值与Type-4/5 LSA深度解析

OSPF区域外路由计算:FA值与Type-4/5 LSA深度解析

1. 从一个让人抓头的现象说起如果你平时维护过企业内网或者数据中心的网络,大概率遇到过这种场景:明明路由表里看到了一条外部路由,下一跳也正确,但数据包就是不通。抓包一看,流量被丢到了错误的出口,或者干…

2026/10/17 8:49:26 阅读更多 →
图表即代码:diagram-design让架构图像代码一样可维护、评审、复用

图表即代码:diagram-design让架构图像代码一样可维护、评审、复用

写这套图表脚本,我前后重构了三次,中间推翻过两版,才找到一套真正能扛住真实业务压力的结构。如果你也在用手拖拽画架构图、时序图,画完发现版本对不上、变更查不到、图形风格全靠个人手感,那这篇东西应该对你有用。这…

2026/10/17 8:49:26 阅读更多 →
GLA与KDA对比:门控线性注意力与Delta规则的长文本建模实战

GLA与KDA对比:门控线性注意力与Delta规则的长文本建模实战

聊到长文本建模,GLA(Gated Linear Attention,门控线性注意力)和KDA(KimiDeltaAttention,一类基于Delta规则的线性注意力变体)是我最近被问得最多的两个名字。如果你一直在用标准Softmax注意力&a…

2026/10/17 8:48:26 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →