1. 概述
Kubernetes 是一个广泛使用的开源平台,用于容器编排。然而,在 Kubernetes 上运行 状态化应用 的关键挑战之一是管理存储。此外,Kubernetes 提供了两种主要的对象来管理存储:PersistentVolume
(PV)和 PersistentVolumeClaim
(PVC)。
在本教程中,我们将讨论 PV 和 PVC 之间的区别,并提供示例来说明它们的用法。
2. PersistentVolume
(PV)简介
PersistentVolume
(PV)是 Kubernetes 资源的一种表示集群中的存储片段。它是集群级别的资源,可以被 Kubernetes 集群中的多个 pod 使用。它可以通过多种方式创建,包括静态预置卷、动态预置卷或导入现有卷。
PV 是将存储与 pod 分离的一种方式,允许 pod 独立于 pod 的生命周期访问存储。PV 设计为供多个 pod 使用,这意味着它们可以具有独立于使用它们的任何 pod 的生命周期。
下面是一个 PV YAML 定义的示例:
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-example
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: slow
hostPath:
path: /data
在这个例子中,我们创建了一个容量为 10GB、访问模式设置为 ReadWriteOnce 的 PV,允许单个节点以读写方式挂载卷。
我们可以看到 PV 的 persistentVolumeReclaimPolicy 设置为 Retain,意味着当 PVC 删除时 PV 不会自动删除。我们也设置了 storageClassName 为 slow,使 PVC 能够使用相同的存储类名称请求来自这个 PV 的存储。
3. PersistentVolumeClaim
(PVC)简介
PersistentVolumeClaim
(PVC)是 Kubernetes 资源的一种表示 pod 请求存储。它可以指定存储的需求,如大小、访问模式和存储类。Kubernetes 使用 PVC 来找到满足 PVC 要求的可用 PV。
PVC 由 pod 创建以请求 PV 的存储。一旦创建了 PVC,它就可以作为卷在 pod 中挂载。然后,pod 可以使用挂载的卷来存储和检索数据。
让我们看一个 PVC YAML 定义的示例:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-example
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
storageClassName: slow
通过这个 YAML 文件,我们创建了一个请求 5GB 存储、访问模式为 ReadWriteOnce 的 PVC。我们设置了 storageClassName 为 slow,使 Kubernetes 能够匹配带有 PVC 存储类名称的 PV。
4. PV 和 PVC 的区别
PV 和 PVC 之间的主要区别在于 PV 表示集群中的存储片段,而 PVC 表示 pod 请求的存储。
以下是 PV 和 PVC 之间的其他一些区别:
属性
PV
PVC
范围
集群中多个 pod 可以使用它
代表命名空间中 pod 的存储请求
预置
可以静态预置、动态预置或导入
由 pod 创建以请求来自 PV 的存储
生命周期
独立于任何使用的 pod 的生命周期
与 pod 的生命周期绑定
配置
可以配置访问模式、persistentVolumeReclaimPolicy 和 storageClassName
可以指定存储需求,如大小、访问模式和存储类
访问
多个 pod 可以访问它
只有请求的 pod 可以访问它
5. PV 和 PVC 示例
让我们看看如何在 Kubernetes 中使用 PV 和 PVC。我们将创建一个从 PV 请求存储的 PVC,并使用 PVC 将卷挂载到 pod 中。
首先,我们通过以下规格静态预置一个卷来生成 PV:
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-storage
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
hostPath:
path: /data
接下来,我们创建一个请求来自 PV 的存储的 PVC:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-storage
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
最后,我们创建一个使用 PVC 作为卷的 pod:
apiVersion: v1
kind: Pod
metadata:
name: pod-storage
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: storage
mountPath: /data
volumes:
- name: storage
persistentVolumeClaim:
claimName: pvc-storage
我们首先创建了一个容量为 1GB、访问模式为 ReadWriteOnce 的 PV。之后,我们继续创建了一个请求 1GB 存储且访问模式相同的 PVC。最后,为了使用 PVC 作为卷,我们创建了一个挂载到 /data 的 pod。
6. 总结
在这篇文章中,我们看到了用于管理存储的两个关键的 Kubernetes 资源。首先,PV 表示集群中的存储片段,而 PVC 表示 pod 请求的存储。
此外,我们了解到尽管这两个资源之间存在相似性,但在范围、预置、生命周期、配置和访问方面它们也存在显著差异。
通过理解 PV 和 PVC 之间的区别,我们可以更明智地决定如何有效地管理我们的 Kubernetes 集群中的存储。