Skip to content

第三部分 存储与 CSI 进阶

存储是 Kubernetes 生产环境中最容易出问题的领域之一。本部分深入讲解 CSI 架构、存储类、快照、扩容以及 Rook-Ceph 部署。


第 11 章 CSI 架构与原理

11.1 什么是 CSI

CSI(Container Storage Interface)是容器存储接口标准,允许第三方存储厂商为 Kubernetes 提供存储插件。

11.2 CSI 组件

┌────────────────────────────────────────┐
│           Kubernetes Cluster           │
│                                        │
│  ┌──────────────┐  ┌──────────────┐   │
│  │ CSI Driver   │  │ CSI Driver   │   │
│  │ Controller   │  │ Node Plugin  │   │
│  └──────────────┘  └──────────────┘   │
│                                        │
│  External Provisioner/Attacher/...     │
│                                        │
└────────────────────────────────────────┘

11.3 CSI 生命周期

  1. Provision:创建卷
  2. Attach:挂载到节点
  3. Mount:挂载到 Pod
  4. Unmount:从 Pod 卸载
  5. Detach:从节点卸载
  6. Delete:删除卷

11.4 常见 CSI 驱动

CSI 驱动存储后端
csi-driver-nfsNFS
csi-driver-host-path本地测试
aws-ebs-csi-driverAWS EBS
alicloud-disk-csi-driver阿里云云盘
rook-ceph-csiCeph
longhorn-csiLonghorn

11.5 本章练习

  1. 列出你集群中部署的 CSI 驱动。
  2. 查看一个 PVC 的 Provisioning 过程。

第 12 章 StorageClass 高级用法

12.1 允许卷扩展

yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: expandable-ssd
provisioner: ebs.csi.aws.com
parameters:
  type: gp3
allowVolumeExpansion: true
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer

12.2 延迟绑定

volumeBindingMode: WaitForFirstConsumer 让 PVC 延迟到 Pod 调度后再绑定,便于选择就近存储。

12.3 拓扑感知

yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: zonal-ssd
provisioner: pd.csi.storage.gke.io
parameters:
  type: pd-ssd
volumeBindingMode: WaitForFirstConsumer
allowedTopologies:
- matchLabelExpressions:
  - key: topology.kubernetes.io/zone
    values:
    - us-central1-a
    - us-central1-b

12.4 本章练习

  1. 创建一个允许扩容的 StorageClass。
  2. 扩容一个 PVC 并观察过程。
  3. 配置拓扑感知的 StorageClass。

第 13 章 快照与克隆

13.1 VolumeSnapshot

yaml
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: my-snapshot
spec:
  volumeSnapshotClassName: csi-snapclass
  source:
    persistentVolumeClaimName: my-pvc

13.2 从快照恢复

yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: restored-pvc
spec:
  storageClassName: my-sc
  dataSource:
    name: my-snapshot
    kind: VolumeSnapshot
    apiGroup: snapshot.storage.k8s.io
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

13.3 本章练习

  1. 安装 snapshot-controller。
  2. 为 PVC 创建快照。
  3. 从快照恢复新 PVC。

第 14 章 Rook-Ceph 部署与实践

14.1 什么是 Rook

Rook 是 Kubernetes 原生的存储编排器,可以自动化部署 Ceph、Cassandra、NFS 等存储系统。

14.2 Ceph 核心概念

概念说明
OSD对象存储守护进程,管理磁盘
MON监控集群状态
MDS元数据服务器,用于 CephFS
RGW对象网关,提供 S3/Swift 接口
Pool存储池

14.3 部署 Rook-Ceph

bash
# 1. 部署 Rook Operator
git clone --single-branch --branch master https://github.com/rook/rook.git
cd rook/deploy/examples
kubectl apply -f crds.yaml -f common.yaml -f operator.yaml

# 2. 部署 Ceph 集群
kubectl apply -f cluster.yaml

# 3. 部署 CSI 驱动和 StorageClass
kubectl apply -f csi/rbd/storageclass.yaml
kubectl apply -f csi/cephfs/storageclass.yaml

14.4 本章练习

  1. 在实验集群部署 Rook-Ceph(注意资源需求)。
  2. 创建 RBD 和 CephFS StorageClass。
  3. 创建 PVC 并验证数据持久化。

第三部分总结

完成本阶段学习后,你应该能够:

  • 理解 CSI 架构和生命周期
  • 配置高级 StorageClass(扩容、延迟绑定、拓扑感知)
  • 使用 VolumeSnapshot 进行备份恢复
  • 部署 Rook-Ceph 提供分布式存储

进入第四部分:K8s 安全进阶