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 不会自动删除。我们也设置了 storageClassNameslow,使 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。我们设置了 storageClassNameslow,使 Kubernetes 能够匹配带有 PVC 存储类名称的 PV。

4. PV 和 PVC 的区别

PV 和 PVC 之间的主要区别在于 PV 表示集群中的存储片段,而 PVC 表示 pod 请求的存储。

以下是 PV 和 PVC 之间的其他一些区别:

属性

PV

PVC

范围

集群中多个 pod 可以使用它

代表命名空间中 pod 的存储请求

预置

可以静态预置、动态预置或导入

由 pod 创建以请求来自 PV 的存储

生命周期

独立于任何使用的 pod 的生命周期

与 pod 的生命周期绑定

配置

可以配置访问模式、persistentVolumeReclaimPolicystorageClassName

可以指定存储需求,如大小、访问模式和存储类

访问

多个 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 集群中的存储。