Kubernetes 中支持的存储插件详解
一、Kubernetes 存储体系概述
Kubernetes 通过持久卷(Persistent Volume, PV)和持久卷声明(Persistent Volume Claim, PVC)机制实现存储抽象。存储插件作为两者之间的桥梁,主要分为In-Tree和Out-of-Tree两大类:
关键结论:Kubernetes 存储生态已从传统的 In-Tree 插件向 CSI (Container Storage Interface) 标准化架构迁移,CSI 是当前生产环境的最佳实践选择。
二、主要存储插件分类
1. In-Tree 插件(内置插件)
这些是 Kubernetes 原生集成的存储驱动,但已逐步被 CSI 替代:
- AWSElasticBlockStore
:AWS EBS 卷 - AzureDisk
:Azure 托管磁盘 - GCEPersistentDisk
:Google Cloud 持久化磁盘 - CephFS
:Ceph 文件系统 - NFS
:网络文件系统 - iSCSI
:SCSI over IP - Local
:本地存储卷(K8s 1.14+)
# 传统 PV 示例(NFS)
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-nfs
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany
nfs:
server: 10.0.0.1
path: "/exports"
2. CSI 驱动(推荐方案)
Container Storage Interface 是标准化存储接口,主流云厂商和存储提供商都实现了 CSI 驱动:
2.1 公有云 CSI 驱动
- AWS EBS CSI
: ebs.csi.aws.com - Azure Disk CSI
: disk.csi.azure.com - GCP PD CSI
: pd.csi.storage.gke.io - AliCloud Disk CSI
: diskplugin.csi.alibabacloud.com
2.2 企业存储 CSI 驱动
- Ceph CSI
:支持 RBD 和 CephFS - NetApp Trident
: csi.trident.netapp.io - Portworx
: pxd.portworx.com - Pure Storage
: pure-csi
2.3 本地存储方案
- Local Path Provisioner
:简单本地路径供给 - OpenEBS
:开源容器附加存储
# 查看集群已安装的 CSI 驱动
kubectlgetcsidrivers.storage.k8s.io
3. FlexVolume 插件(过渡方案)
FlexVolume 是 CSI 之前的扩展方案,现已被淘汰:
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-flex
spec:
flexVolume:
driver: "azure/azurefile"
secretRef:
name: azure-secret
options:
shareName: "k8s"
三、生产环境选型建议
1. 云环境选择
最佳实践:始终使用对应云厂商的 CSI 驱动,它们经过充分测试且支持最新功能(如快照、扩容等)
2. 本地数据中心选择
- 文件存储
:CephFS CSI / NFS - 块存储
:Ceph RBD CSI / iSCSI - 超融合
:OpenEBS / Rook
3. 特殊场景
- 高性能需求
:Portworx / Pure Storage - 跨云场景
:Rook + Ceph
四、CSI 驱动部署示例(以 AWS EBS 为例)
# 1. 部署 AWS EBS CSI 驱动
kubectl apply -k "github.com/kubernetes-sigs/aws-ebs-csi-driver/deploy/kubernetes/overlays/stable/?ref=master"
# 2. 创建 StorageClass
cat <<EOF | kubectl apply -f -
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: ebs-sc
provisioner: ebs.csi.aws.com
volumeBindingMode: WaitForFirstConsumer
parameters:
type: gp3
encrypted: "true"
EOF
# 3. 创建 PVC
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: ebs-claim
spec:
accessModes:
- ReadWriteOnce
storageClassName: ebs-sc
resources:
requests:
storage: 10Gi
EOF
五、面试重点问题
-
CSI 架构组件:
-
Node Plugin(DaemonSet 部署) -
Controller Plugin(StatefulSet/Deployment 部署) -
动态供给流程:
graphTD
A[创建PVC]--> B[CSI Provisioner监听到]
B--> C[调用CSI CreateVolume]
C--> D[创建PV并绑定] -
拓扑感知调度:
# StorageClass 关键参数
volumeBindingMode: WaitForFirstConsumer -
扩展操作:
-
卷扩容( allowVolumeExpansion: true) -
快照/克隆(需安装 VolumeSnapshot CRD)
面试技巧:结合具体场景说明存储选型理由,例如:”在AWS环境中我们会选择EBS CSI而不是In-Tree驱动,因为它支持更快的卷扩容操作和IOPS配置”
夜雨聆风
