Skip to content

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: Retain

3.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: xfs

5. 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)