2. K8s存储基础回顾:PV、PVC、StorageClass核心概念与生命周期管理

在深入卷加密与回滚策略之前,必须牢固掌握Kubernetes存储的三大核心抽象:PersistentVolume(PV)、PersistentVolumeClaim(PVC)和StorageClass。这三者构成了K8s声明式存储的基石,也是后续所有安全变更操作的操作对象。

2.1 三大核心概念速览

概念 角色 类比(传统运维) 关键属性
PV 集群资源(存储的“物理”抽象) 已挂载的NFS共享 / iSCSI LUN 容量、访问模式、回收策略、存储类
PVC 用户请求(存储的“需求”声明) 申请“50GB 读写多次”的工单 请求容量、访问模式、选择器、存储类
StorageClass 动态供应模板(存储的“品类”定义) 云硬盘规格目录(SSD/HDD/加密型) Provisioner、参数、回收策略、绑定模式

核心原则:PV是资源,PVC是请求,StorageClass是自动化工厂。PVC与PV的绑定是一对一的,绑定后PVC成为Pod内卷的“凭证”。

2.2 生命周期管理流程

K8s存储的生命周期分为静态供应和动态供应两条路径,理解这两条路径对后续设计加密回滚策略至关重要。

2.2.1 静态供应(Static Provisioning)

  1. 管理员预先创建PV,指定容量、访问模式和存储后端细节。
  2. 用户创建PVC,声明需求(如:5GB,ReadWriteOnce)。
  3. K8s调度器将PVC与满足条件的PV进行匹配绑定。
  4. Pod引用PVC,挂载到容器路径。

2.2.2 动态供应(Dynamic Provisioning)

  1. 用户创建PVC,并指定storageClassName。
  2. StorageClass的Provisioner(如 kubernetes.io/aws-ebs、csi-hostpath)自动调用后端API创建存储卷。
  3. 系统自动生成对应的PV,并与PVC绑定。
  4. Pod引用PVC完成挂载。

生产建议:动态供应是主流方式,尤其在云原生环境中。StorageClass允许统一配置加密参数(如 encrypted: "true"、kmsKeyId),是实现“加密门禁”的第一道防线。

PV / PVC / StorageClass 生命周期与绑定关系 管理员 用户 PV(静态) PVC(请求) StorageClass 绑定 挂载到Pod 动态供应 自动创建PV 💡 生命周期要点 静态供应:管理员预创建PV → 用户PVC匹配绑定。动态供应:用户PVC指定StorageClass → Provisioner自动创建PV并绑定。 回收策略(Retain/Delete/Recycle)决定PV释放后的行为,直接影响加密卷的数据残留风险。

2.3 访问模式与回收策略

这两个属性直接决定了卷能否被多个Pod共享,以及删除PVC后数据如何处理——在加密场景中,回收策略尤其关键。

2.3.1 访问模式(Access Modes)

模式 缩写 说明 典型后端
ReadWriteOnce RWO 单节点读写 大多数块存储(EBS、Cinder)
ReadOnlyMany ROX 多节点只读 共享文件系统(NFS、GlusterFS)
ReadWriteMany RWX 多节点读写 分布式文件系统(CephFS、EFS)
ReadWriteOncePod RWOP 单Pod读写(K8s 1.22+) CSI驱动支持

2.3.2 回收策略(Reclaim Policy)

  • Retain(保留):删除PVC后,PV进入Released状态,数据保留,需管理员手动清理。适合加密卷审计场景。
  • Delete(删除):删除PVC时,PV和后端存储卷一并删除。适合临时卷,但加密密钥需同步销毁。
  • Recycle(回收):已弃用,不建议使用。

加密安全警示:若使用Delete回收策略,务必确保存储后端在删除卷时同步擦除加密元数据。对于敏感数据,建议使用Retain策略,并在回滚流程中增加手动密钥吊销步骤。

2.4 StorageClass关键参数与加密配置

StorageClass是动态供应的核心,也是注入加密策略的最佳位置。以下是一个启用AWS EBS加密的StorageClass示例:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: encrypted-ebs-sc
provisioner: ebs.csi.aws.com
parameters:
  type: gp3
  encrypted: "true"                # 启用加密
  kmsKeyId: "arn:aws:kms:..."     # 指定KMS密钥
  csi.storage.k8s.io/fstype: ext4
reclaimPolicy: Retain              # 加密卷建议Retain
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true

关键参数解读:encrypted: "true" 开启卷加密;kmsKeyId 指定加密密钥;volumeBindingMode: WaitForFirstConsumer 延迟绑定,确保Pod调度到节点后再创建卷,避免跨AZ加密密钥分发问题。

StorageClass 动态供应与加密参数传递流程 用户创建PVC storageClassName: encrypted-sc StorageClass encrypted: true, kmsKeyId: xxx CSI Provisioner 调用云API创建卷 加密卷(PV) 后端存储 + KMS加密 Pod 引用PVC,挂载加密卷 🔐 加密参数传递链路 1. PVC指定StorageClass → 2. StorageClass携带加密参数(encrypted, kmsKeyId)→ 3. CSI Provisioner调用云API创建加密卷 → 4. 加密卷作为PV绑定PVC → 5. Pod挂载后自动解密(对应用透明)。密钥由KMS管理,Pod内无感知。

2.5 生命周期状态机

PV的状态转换是理解存储故障和回滚触发条件的基础。以下是PV的完整状态机:

状态 含义 触发条件 加密相关关注点
Available 可用,未绑定 PV创建完成 检查加密属性是否已设置
Bound 已绑定到PVC PVC匹配成功 加密密钥已关联,卷可正常使用
Released PVC已删除,PV待回收 删除PVC(Retain策略) 数据仍加密存在,需手动处理密钥
Failed 自动回收失败 Delete策略下后端删除出错 可能导致加密卷残留,需人工介入

回滚设计启示:当需要回滚存储变更时,若PV处于Bound状态,需先处理Pod和PVC;若处于Released状态,可直接操作PV的加密属性或重建。理解状态机是设计安全回滚步骤的前提。