K8s 存储卷(PV/PVC/SC)& 存储集成总结
一、核心概念类
1. 请简述 PV、PVC、SC 的定义及三者关系
- PV(PersistentVolume):持久化卷,是对底层存储(NFS/Ceph 等)的抽象,由管理员创建,包含存储大小、访问模式、回收策略等属性,属于集群级资源,不绑定命名空间。
- PVC(PersistentVolumeClaim):持久化卷声明,由业务人员创建,用于申请 PV 资源(指定大小、访问模式),绑定命名空间,Pod 通过 PVC 使用存储。
- SC(StorageClass):存储类,用于动态创建 PV,替代手动创建 PV 的方式,可配置默认存储类,PVC 未指定 SC 时会使用默认 SC 动态生成 PV。
- 核心关系:Pod → PVC(申请资源)→ 绑定 PV(静态)/SC 动态创建 PV → 底层存储;SC 是 PV 的 “动态创建模板”,PVC 是 Pod 和 PV/SC 之间的 “桥梁”。
2. PV 的访问模式有哪些?分别说明适用场景
| 访问模式 | 简称 | 核心说明 |
|---|---|---|
| ReadWriteOnce | RWO | 仅允许单个节点读写,多 Pod 可在该节点共享(适合单机使用的存储,如本地盘) |
| ReadOnlyMany | ROX | 允许多节点只读(适合静态数据共享,如配置文件) |
| ReadWriteMany | RWX | 允许多节点读写(适合多 Pod 共享写数据,如 NFS/CephFS) |
| ReadWriteOncePod | RWOP | 仅允许单个 Pod 读写(K8s 1.22+,CSI 卷专属,强隔离场景) |
- 面试追问:NFS 常用哪种访问模式?(RWX);本地盘能用 RWX 吗?(不能,仅 RWO)
3. PV 的回收策略有哪些?区别是什么
- Retain(保留):删除 PVC 后,PV 仍存在且状态为 “已释放”,需管理员手动清理数据和 PV,数据安全性高,但需手动运维。
- Delete(删除):删除 PVC 后,K8s 自动删除 PV 及底层存储数据(仅支持部分存储插件,如 CSI-NFS),适合测试 / 临时场景。
- Recycle(回收):已弃用,会执行
rm -rf /thevolume/*清理数据后重新可用,推荐用动态 PV 替代。 - 面试追问:生产环境优先选哪种?(Retain,防止误删数据)
4. 请解释 CSI、CRI、CNI 的区别(高频考点)
- CSI(Container Storage Interface):容器存储接口,定义 K8s 与底层存储的交互标准,只要存储系统实现 CSI 接口,就能被 K8s 集成(如 NFS-CSI、Ceph-CSI)。
- CRI(Container Runtime Interface):容器运行时接口,K8s 与容器运行时(Docker/Containerd)的交互标准,解耦 K8s 和运行时。
- CNI(Container Network Interface):容器网络接口,K8s 与网络插件(Calico/Flannel)的交互标准,定义 Pod 网络的创建 / 删除规则。
- 核心总结:CSI 管存储、CRI 管容器运行、CNI 管网络,均为 K8s 的 “解耦型接口标准”。
二、实战配置类面试题
1. 静态 PV(NFS)和动态 PV(SC)的部署流程区别
- 静态 PV 流程:
- 管理员创建底层存储目录(如 NFS 的
/pv001); - 编写 PV 清单(指定 NFS 地址、路径、访问模式、回收策略);
- 创建 PVC 申请资源,K8s 绑定匹配的 PV;
- Pod 引用 PVC 使用存储。
- 管理员创建底层存储目录(如 NFS 的
- 动态 PV(SC)流程:
- 部署 CSI 插件(如 NFS-CSI);
- 创建 SC(指定 CSI 驱动、底层存储地址);
- 创建 PVC(指定 SC 名称,或使用默认 SC);
- K8s 通过 SC 自动创建 PV,PVC 绑定后 Pod 引用。
- 面试追问:动态 PV 相比静态的优势?(无需手动创建 PV,适配大规模集群,减少运维成本)
2. 如何配置 K8s 默认存储类?多存储类场景如何使用
- 设置默认 SCkubectl patch sc nfs-csi -p ‘{“metadata”: {“annotations”:{“storageclass.kubernetes.io/is-default-class”:”true”}}}’
- 取消默认 SCkubectl patch sc nfs-csi -p ‘{“metadata”: {“annotations”:{“storageclass.kubernetes.io/is-default-class”:”false”}}}’
- 多存储类使用
- 创建多个 SC(如
sc-haha/sc-xixi),仅一个标记为默认; - PVC 指定
storageClassName: sc-xixi则使用对应 SC;未指定则用默认 SC。
- 创建多个 SC(如
- 核心规则:集群中仅能有一个默认 SC,PVC 优先使用指定的 SC,无指定时用默认。
3. K8s 对接 Ceph RBD 块存储的核心步骤
- 部署 Rook-Ceph 集群,创建 Ceph 存储池并启用 RBD 应用;
- 在存储池中创建 RBD 块设备(指定大小);
- K8s 中通过 PV/PVC 引用 RBD 块设备(配置认证、池名称、块设备名称);
- Pod 挂载 PVC 使用 RBD 存储;
- 面试追问:RBD 和 CephFS 的区别?(RBD 是块存储,RWO 为主;CephFS 是文件存储,支持 RWX)
三、问题排查类
1. PVC 一直处于 Pending 状态,可能的原因有哪些?
- 无匹配的 PV:PV 的容量小于 PVC 申请的大小、访问模式不匹配、PV 已被绑定;
- 动态 PV 场景:SC 配置错误(如底层存储地址错误、CSI 插件未正常运行)、默认 SC 未配置且 PVC 未指定 SC;
- 权限问题:CSI 插件的 ServiceAccount 权限不足,无法创建底层存储;
- 底层存储故障:NFS/Ceph 服务不可用,SC 无法动态创建 PV。
2. Pod 挂载 PVC 后无法写入数据,可能的原因?
- PV 的访问模式不匹配(如 PVC 申请 RWX,但 PV 是 RWO);
- 底层存储权限问题(如 NFS 目录权限为只读、Ceph RBD 未授权);
- PV 回收策略为 Retain,且 PV 处于 “已释放” 状态(需管理员重置 PV);
- 容器内挂载路径权限(如挂载目录属主为 root,容器进程无写权限)。
四、核心总结
K8s 存储卷面试核心围绕 “概念定义 + 访问模式 / 回收策略 + 静态 / 动态 PV 部署 + 问题排查” 展开,需重点掌握 PV/PVC/SC 的交互逻辑、CSI/CRI/CNI 的区别、生产环境存储策略(如 Retain 回收策略、RWX 访问模式适配场景),以及动态存储类的配置和故障排查思路。
正文完