StorageClass 不能直接定义加密逻辑,因其仅为声明式抽象,只负责描述PV供应方式而不参与数据写入路径;加密必须由底层存储后端(如etcd、Ceph、Vault)或CSI驱动实现,StorageClass仅能通过parameters透传加密参数。

StorageClass 本身不支持直接配置加密,加密必须由底层存储后端(如 etcd、Ceph、Vault 集成插件)或 CSI 驱动实现,StorageClass 只能传递加密相关参数给驱动。
为什么 StorageClass 不能直接定义加密逻辑
StorageClass 是 Kubernetes 的声明式抽象,只负责描述“如何供应 PV”,不参与数据写入路径。真正的加密发生在:
- etcd 层:通过
--encryption-provider-config对 API 对象(如Secret)静态加密,但不影响 PV 中的用户数据 - CSI 驱动层:比如
ceph-csi或aws-ebs-csi-driver支持在创建卷时启用加密(如 AWS KMS 密钥 ID、Ceph 加密池) - 存储系统自身:如 MinIO 启用服务端加密(SSE-S3)、Ceph RBD 使用
rbd-encrypt模块
StorageClass 的作用,是把加密所需的配置项(如密钥 ID、加密开关)作为 parameters 透传给 CSI 插件。
使用 ceph-csi 配置加密 RBD 卷的 StorageClass 示例
以 Ceph RBD 为例,ceph-csi v3.8+ 支持卷级加密(需 Ceph Pacific+ 和内核 5.10+)。关键点:
- 确保 Ceph 集群已启用
rbd-encrypt功能并配置好密钥管理器(如 Vault 或本地 KMIP) - CSI 驱动需启用
enableRbdEncryptedVolume: true(在values.yaml中) - StorageClass 的
parameters必须显式开启加密并指定密钥引用
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: encrypted-rbd provisioner: rbd.csi.ceph.com parameters: clusterID: ceph-cluster-01 pool: encrypted-pool imageFormat: "2" imageFeatures: layering,encrypt csi.storage.k8s.io/provisioner-secret-name: csi-rbd-secret csi.storage.k8s.io/provisioner-secret-namespace: default # 关键:启用加密并指定密钥名(由 CSI 驱动解析) encrypted: "true" encryptionKey: "vault-kms-key-v1" reclaimPolicy: Retain volumeBindingMode: Immediate
注意:encrypted: "true" 是 CSI 驱动约定的开关;encryptionKey 不是明文密钥,而是驱动内部可解析的密钥标识符(如 Vault 中的 path)。
对接 HashiCorp Vault 实现动态密钥分发
若底层 CSI 驱动支持 Vault 集成(如社区版 ceph-csi + 自定义 KMS 插件),StorageClass 本身无需改动,但需确保:
- Vault 已启用
transit引擎,并创建了加密密钥(如kv/encrypt/rbd-key) - CSI 驱动 Pod 被注入 Vault Token(通过
Vault Agent Injector注入 sidecar) - StorageClass 的
parameters.encryptionKey值与 Vault 中密钥路径一致(如transit/keys/rbd-enc-key) - Pod 的 ServiceAccount 绑定了具备
read权限的 Vault 策略
此时加密密钥不落盘、不硬编码,每次创建卷时由 CSI 驱动向 Vault 请求临时 DEK(Data Encryption Key)并封装进 RBD image header。
常见错误和验证要点
部署后最容易被忽略的是「加密是否真正生效」,而不是「配置是否通过校验」:
- 创建 PVC 后检查 PV 的
spec.csi.volumeAttributes是否包含encrypted: "true"—— 这仅表示请求已发出,不代表后端执行成功 - 登录 Ceph 集群执行
rbd info <pool>/<image-name></image-name></pool>,确认输出中含encryption format: luks1或类似字段 - 若使用 AWS EBS,StorageClass 中必须设
encrypted: "true"且kmsKeyId为有效 ARN,否则卷会创建成功但不加密 - etcd 层加密对 PV 数据无效:即使启用了
--encryption-provider-config,PVC 绑定的 NFS 或 RBD 卷中的文件仍以明文存于后端存储
真正端到端加密的关键,永远在 CSI 驱动与存储后端的协同实现上,StorageClass 只是一张带参数的“工单”。


















