主题
04 — 存储基础深度教材
存储是 K8s 中最容易出故障、也最难调试的领域。本章覆盖文件系统对比、LVM、NFS/iSCSI 配置、Ceph 架构与运维,为后续的 PV/PVC/CSI 编排打下坚实基础。
1. Linux 文件系统对比
| 文件系统 | 特点 | K8s 场景推荐 |
|---|---|---|
| ext4 | 成熟稳定,广泛默认 | 通用场景,节点系统盘 |
| XFS | 大文件/大目录性能好,支持在线扩容 | 数据盘,大量小文件场景 |
| btrfs | 快照、子卷、压缩 | 实验性,生产慎用 |
| overlay2 | 容器存储驱动 | containerd/Docker 默认 |
bash
# 查看文件系统类型
df -Th
lsblk -f
# XFS 常用操作
xfs_info /data # 查看 XFS 信息
xfs_growfs /data # 在线扩容(只能增不能缩)
xfs_repair /dev/sdb1 # 修复文件系统
# ext4 常用操作
tune2fs -l /dev/sda1 # 查看 ext4 信息
resize2fs /dev/sda1 # 在线扩容2. LVM(逻辑卷管理)
bash
# === 基本概念 ===
# PV (Physical Volume) → VG (Volume Group) → LV (Logical Volume)
# 物理磁盘 → 卷组(池) → 逻辑卷(可动态调整大小)
# === 创建 LVM ===
pvcreate /dev/sdb /dev/sdc # 创建物理卷
vgcreate vg-data /dev/sdb /dev/sdc # 创建卷组
lvcreate -L 100G -n lv-apps vg-data # 创建逻辑卷
mkfs.xfs /dev/vg-data/lv-apps # 格式化
mount /dev/vg-data/lv-apps /data # 挂载
# === 扩容 ===
lvextend -L +50G /dev/vg-data/lv-apps # 逻辑卷扩容
xfs_growfs /data # 文件系统扩容(XFS)
# resize2fs /dev/vg-data/lv-apps # 文件系统扩容(ext4)
# === 查看状态 ===
pvs # 物理卷
vgs # 卷组
lvs # 逻辑卷
pvdisplay / vgdisplay / lvdisplay # 详细信息
# === 快照 ===
lvcreate -L 10G -s -n snap-apps /dev/vg-data/lv-apps # 创建快照
lvremove /dev/vg-data/snap-apps # 删除快照
# K8s CSI 快照底层就是调用 LVM/Ceph 快照3. NFS(Network File System)
3.1 NFS 服务端配置
bash
# 安装
yum install nfs-utils -y # RHEL/CentOS
apt install nfs-kernel-server -y # Ubuntu
# 配置共享目录 → /etc/exports
/data/k8s *(rw,sync,no_subtree_check,no_root_squash)
/data/pv 192.168.0.0/16(rw,sync,no_subtree_check)
# 参数说明:
# rw → 读写
# sync → 同步写入(数据安全但性能低)
# no_subtree_check → 不检查子目录(性能更好)
# no_root_squash → 允许 root 访问(K8s 容器常以 root 运行)
# 启动服务
exportfs -ra # 重新导出
systemctl enable --now nfs-server
showmount -e localhost # 验证共享3.2 NFS 客户端与 K8s 集成
bash
# 手动挂载测试
mount -t nfs 192.168.1.100:/data/k8s /mnt
ls /mnt
# K8s NFS PV 示例
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv-01
spec:
capacity:
storage: 100Gi
accessModes: [ReadWriteMany] # NFS 支持多读多写
nfs:
server: 192.168.1.100
path: /data/k8s/pv-01
persistentVolumeReclaimPolicy: Retain3.3 NFS 故障排查
bash
# 问题 1:挂载超时
showmount -e <nfs-server> # 检查 NFS 服务是否响应
rpcinfo -p <nfs-server> # 检查 RPC 端口
# 问题 2:D 状态进程(NFS 服务端无响应)
ps aux | awk '$8~/D/' # 查看 D 状态进程
umount -f -l /mnt/nfs # 强制 lazy umount
# 问题 3:权限问题
ls -la /mnt/nfs/ # 检查 UID/GID 匹配
# 容器内 UID 与 NFS 文件 UID 不匹配 → Permission denied
# NFS 监控指标
nfsstat -c # 客户端统计
nfsiostat 1 5 # 每秒 I/O 统计4. iSCSI
bash
# iSCSI 概念:
# Target = 存储端(服务端)
# Initiator = 客户端(K8s 节点)
# LUN = 逻辑单元号(一块虚拟磁盘)
# 客户端操作
iscsiadm -m discovery -t sendtargets -p <target-ip>:3260 # 发现目标
iscsiadm -m node --login # 登录
lsblk # 看到新磁盘
# K8s iSCSI PV
apiVersion: v1
kind: PersistentVolume
metadata:
name: iscsi-pv
spec:
capacity:
storage: 50Gi
accessModes: [ReadWriteOnce] # iSCSI 通常单读单写
iscsi:
targetPortal: 192.168.1.100:3260
iqn: iqn.2026-01.com.example:storage
lun: 0
fsType: xfs5. Ceph 架构与运维
5.1 Ceph 架构
Ceph 三大组件:
MON (Monitor) → 维护集群状态(PAXOS 共识)
OSD (Object Storage Daemon) → 实际存储数据
MDS (Metadata Server) → CephFS 元数据(块存储不需要)
Ceph 三种接口:
RBD (RADOS Block Device) → 块存储 → K8s CSI 最常用
CephFS → 文件系统 → 多读多写场景
RGW (RADOS Gateway) → S3 兼容对象存储
RBD 与 K8s 集成:
PVC → CSI Driver → RBD → OSD → 物理磁盘
优势:快照、克隆、瘦分配、高可用5.2 Ceph 运维命令
bash
# 集群状态
ceph status
ceph health detail
ceph osd tree # OSD 拓扑
ceph osd pool ls detail # 存储池详情
# 性能监控
ceph osd perf # OSD 延迟
ceph osd blocked-by # 阻塞操作
# 常用运维
ceph osd set noout # 维护模式(OSD 下线不触发数据迁移)
ceph osd unset noout # 恢复正常
# RBD 操作
rbd create --size 10240 pool/image-name # 创建块设备
rbd ls pool/
rbd info pool/image-name
rbd snap create pool/image-name@snap1 # 快照
rbd snap rollback pool/image-name@snap1 # 回滚6. 面试高频问题
Q: NFS 与 iSCSI/Ceph RBD 在 K8s 中的选型?
NFS:
优势:ReadWriteMany(多 Pod 同时读写)
劣势:性能一般,单点故障(除非 HA NFS)
场景:共享配置、日志收集、小文件共享
iSCSI:
优势:块存储性能好,成熟稳定
劣势:ReadWriteOnce(单 Pod),管理复杂
场景:数据库、高性能单写场景
Ceph RBD:
优势:分布式、高可用、快照克隆、性能好
劣势:部署复杂,运维门槛高
场景:生产环境首选分布式存储方案Q: K8s 中如何选择存储方案?
决策树:
需要 ReadWriteMany?
→ 是 → NFS / CephFS / GlusterFS
→ 否 → 需要高可用?
→ 是 → Ceph RBD / 云厂商块存储(EBS/云盘)
→ 否 → Local PV / iSCSI(性能优先)
需要快照/克隆?
→ Ceph RBD / 云厂商快照
预算有限、规模小?
→ NFS + Keepalived 高可用
大规模生产?
→ Ceph 集群(3+ MON,按需扩容 OSD)