K8s 存储卷(PV/PVC/SC)& 存储集成总结

87次阅读
没有评论

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 流程:
    1. 管理员创建底层存储目录(如 NFS 的/pv001);
    2. 编写 PV 清单(指定 NFS 地址、路径、访问模式、回收策略);
    3. 创建 PVC 申请资源,K8s 绑定匹配的 PV;
    4. Pod 引用 PVC 使用存储。
  • 动态 PV(SC)流程:
    1. 部署 CSI 插件(如 NFS-CSI);
    2. 创建 SC(指定 CSI 驱动、底层存储地址);
    3. 创建 PVC(指定 SC 名称,或使用默认 SC);
    4. 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”}}}’
  • 多存储类使用
    1. 创建多个 SC(如sc-haha/sc-xixi),仅一个标记为默认;
    2. PVC 指定storageClassName: sc-xixi则使用对应 SC;未指定则用默认 SC。
  • 核心规则:集群中仅能有一个默认 SC,PVC 优先使用指定的 SC,无指定时用默认。

3. K8s 对接 Ceph RBD 块存储的核心步骤

  1. 部署 Rook-Ceph 集群,创建 Ceph 存储池并启用 RBD 应用;
  2. 在存储池中创建 RBD 块设备(指定大小);
  3. K8s 中通过 PV/PVC 引用 RBD 块设备(配置认证、池名称、块设备名称);
  4. Pod 挂载 PVC 使用 RBD 存储;
  • 面试追问:RBD 和 CephFS 的区别?(RBD 是块存储,RWO 为主;CephFS 是文件存储,支持 RWX)

三、问题排查类

1. PVC 一直处于 Pending 状态,可能的原因有哪些?

  1. 无匹配的 PV:PV 的容量小于 PVC 申请的大小、访问模式不匹配、PV 已被绑定;
  2. 动态 PV 场景:SC 配置错误(如底层存储地址错误、CSI 插件未正常运行)、默认 SC 未配置且 PVC 未指定 SC;
  3. 权限问题:CSI 插件的 ServiceAccount 权限不足,无法创建底层存储;
  4. 底层存储故障:NFS/Ceph 服务不可用,SC 无法动态创建 PV。

2. Pod 挂载 PVC 后无法写入数据,可能的原因?

  1. PV 的访问模式不匹配(如 PVC 申请 RWX,但 PV 是 RWO);
  2. 底层存储权限问题(如 NFS 目录权限为只读、Ceph RBD 未授权);
  3. PV 回收策略为 Retain,且 PV 处于 “已释放” 状态(需管理员重置 PV);
  4. 容器内挂载路径权限(如挂载目录属主为 root,容器进程无写权限)。

四、核心总结

K8s 存储卷面试核心围绕 “概念定义 + 访问模式 / 回收策略 + 静态 / 动态 PV 部署 + 问题排查” 展开,需重点掌握 PV/PVC/SC 的交互逻辑、CSI/CRI/CNI 的区别、生产环境存储策略(如 Retain 回收策略、RWX 访问模式适配场景),以及动态存储类的配置和故障排查思路。

正文完
 0
评论(没有评论)