PV、PVC、StorageClass的区别和联系原创
在 Kubernetes 中,持久化存储是一个重要的概念,它通过 PersistentVolume (PV)、PersistentVolumeClaim (PVC) 和 StorageClass 来实现。下面我们详细介绍它们的区别和联系。
# 1. PersistentVolume (PV)
定义: PersistentVolume 是 Kubernetes 中的一种资源对象,它表示集群中的一个存储卷。PV 是由管理员预先创建的,或者通过 StorageClass 动态创建的。
特点:
- PV 是集群范围的资源。
- PV 的生命周期独立于 Pod。
- PV 定义了存储的容量、访问模式、回收策略等。
示例:
apiVersion: v1
kind: PersistentVolume
metadata:
name: example-pv
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: standard
hostPath:
path: /mnt/data
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# 2. PersistentVolumeClaim (PVC)
定义: PersistentVolumeClaim 是 Kubernetes 中的一种资源对象,它表示用户对存储的申请。PVC 用于绑定到 PV,并为 Pod 提供存储。
特点:
- PVC 是用户的存储需求声明。
- PVC 会自动绑定到符合条件的 PV。
- PVC 通过
accessModes
和storageClassName
来匹配 PV。
示例:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: example-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
storageClassName: standard
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 3. StorageClass
定义: StorageClass 是 Kubernetes 中的一种资源对象,它定义了存储卷的动态配置方式。通过 StorageClass,可以动态地创建 PV,而无需管理员手动创建。
特点:
- StorageClass 定义了存储的提供方式。
- StorageClass 可以指定不同的存储类型(如 NFS、Ceph、AWS EBS 等)。
- StorageClass 可以设置
provisioner
和parameters
来配置存储。
示例:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: standard
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2
1
2
3
4
5
6
7
2
3
4
5
6
7
# 4. 区别
资源对象 | 定义 | 作用 |
---|---|---|
PersistentVolume (PV) | 表示集群中的存储卷 | 由管理员或 StorageClass 创建,用于存储数据 |
PersistentVolumeClaim (PVC) | 用户的存储需求声明 | 用户通过 PVC 申请存储,并绑定到 PV |
StorageClass | 动态配置存储卷的方式 | 定义存储卷的类型和配置,用于动态创建 PV |
# 5. 联系
PV 与 PVC 的联系:
- PVC 是用户的存储需求声明,PV 是存储的实际实现。
- PVC 会自动绑定到符合条件的 PV。
StorageClass 与 PV 的联系:
- StorageClass 定义了动态创建 PV 的方式。
- 如果使用 StorageClass,PV 会根据 StorageClass 的配置动态生成。
StorageClass 与 PVC 的联系:
- PVC 可以通过
storageClassName
字段指定使用哪个 StorageClass。 - PVC 的
storageClassName
决定了绑定的 PV 的类型。
- PVC 可以通过
# 6. 使用场景
静态存储: 如果集群管理员已经预先创建了 PV,用户可以通过 PVC 绑定到这些 PV。
动态存储: 如果使用了 StorageClass,用户可以通过 PVC 动态创建 PV,而无需管理员手动干预。
# 7. 示例流程
以下是一个使用 StorageClass 动态创建 PV 的完整流程:
- 创建 StorageClass:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast-storage
provisioner: kubernetes.io/aws-ebs
parameters:
type: io1
iopsPerGB: "10"
fsType: ext4
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
- 创建 PVC:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: fast-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: fast-storage
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
- 检查自动创建的 PV:
$ kubectl get pv
1
通过以上流程,PVC 会自动绑定到由 StorageClass 动态创建的 PV。
# 总结
- PV 是存储的实际实现。
- PVC 是用户的存储需求声明。
- StorageClass 提供了动态创建 PV 的方式。
- 三者共同构成了 Kubernetes 中的持久化存储体系。
上次更新: 4/24/2025