理解 Kubernetes 中的存储:StorageClass、PersistentVolume 和 PersistentVolumeClaim
admin
撰写于 2024年 10月 27 日

在 Kubernetes 中,容器的存储管理是一个重要的课题。无论是开发环境还是生产环境,一个清晰的存储管理概念是保障数据可靠性和应用稳定性的基础。对于 Kubernetes 新手来说,StorageClassPersistentVolume (PV)PersistentVolumeClaim (PVC) 可能会让人感到迷惑。那么,今天我们就从这三个概念入手,深入浅出地理解它们各自的角色和相互关系。


1. StorageClass:定义存储类型的“配置模板”

StorageClass 是 Kubernetes 中的存储模板,用来定义存储的类型和配置。它是一种“规格定义”,为不同需求提供了可选的存储配置。例如,在生产环境中,我们可能需要高性能的存储,而在开发环境中则更看重成本的低廉。StorageClass 就是我们用来区分这些不同需求的工具。

关键点

  • 作用:定义不同的存储类型。
  • 用途:允许创建多个 StorageClass,每种类型代表一个独立的存储配置,比如本地存储、云存储、NFS 等。
  • 核心配置项

    • provisioner:指定具体的存储分配方式。例如,可以选择本地存储、网络文件系统(NFS)、云存储(AWS、GCP 等)。
    • reclaimPolicy:存储卷被释放后的处理方式,常用的选项包括 Delete(删除)、Retain(保留数据)、Recycle(清理)。
    • volumeBindingMode:决定存储卷何时绑定,常见的选项包括 Immediate(立即绑定)和 WaitForFirstConsumer(等到首次使用时才绑定)。

案例:以下 StorageClass 配置指定使用 Google Cloud 的持久性 SSD 作为存储后端,适用于需要高性能的应用场景:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast-storage
provisioner: kubernetes.io/gce-pd
parameters:
  type: pd-ssd
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer

这里 provisioner 定义了使用 Google Cloud 的持久性磁盘(gce-pd),并指定了类型 pd-ssd,从而确保高性能。

2. PersistentVolume (PV):存储资源的“实际物理位置”

PersistentVolume 是 Kubernetes 中的存储资源,是一种独立的、物理存在的存储卷。PV 是实际的存储资源,可以是物理机上的磁盘、NFS 文件系统或者云端的存储卷。管理员可以手动创建 PV,或者通过 StorageClass 动态创建。PV 是 Kubernetes 中的持久存储,可以跨 Pod 使用,即便 Pod 被删除,PV 的数据也可以保留。

关键点

  • 作用:PV 是具体的存储卷,指向真实的存储资源。
  • 用途:可以独立于 Pod 使用,管理员可以控制存储卷的配置(大小、访问模式等)。
  • 核心配置项

    • capacity:定义存储卷的大小,比如 10Gi
    • accessModes:定义 PV 的访问权限,包括 ReadWriteOnce(单节点读写)、ReadOnlyMany(多个节点只读)和 ReadWriteMany(多个节点读写)。
    • persistentVolumeReclaimPolicy:存储卷被释放后的处理方式,和 StorageClass 中的 reclaimPolicy 类似。

案例:以下 PV 配置了一个使用 NFS 的持久性存储卷,大小为 10Gi,支持多个节点读写。

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  nfs:
    path: /data/nfs
    server: 192.168.1.100

这里 capacity 设置了存储卷的大小为 10Gi,accessModes 设置为 ReadWriteMany,允许多个节点同时读写,persistentVolumeReclaimPolicy 设置为 Retain 保留数据。

3. PersistentVolumeClaim (PVC):应用对存储的“租房需求”

PersistentVolumeClaim 是用户(应用)对存储的请求,相当于应用的“存储需求声明”。PVC 是应用对 Kubernetes 存储资源的申请,描述了所需的存储容量和访问模式。Kubernetes 会自动根据 PVC 的配置查找或创建一个合适的 PV,将其绑定到 PVC 上。

关键点

  • 作用:PVC 是应用的存储需求声明。
  • 用途:应用不需要知道实际存储的位置,只需声明需求,PVC 会自动匹配合适的 PV。
  • 核心配置项

    • storageClassName:指定 PVC 所需的 StorageClass。
    • accessModes:定义访问模式,与 PV 的访问模式保持一致。
    • resources:定义请求的存储容量。

案例:以下 PVC 声明请求了 5Gi 的存储空间,使用之前定义的 fast-storage StorageClass。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  storageClassName: fast-storage
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

在这里,storageClassNamefast-storage,表示使用前面定义的高性能存储,accessModes 设置为 ReadWriteOnce,只能由一个节点读写,resources.requests.storage 请求了 5Gi 的存储容量。


三者的关系和流程

我们可以用“租房”来比喻这三者之间的关系:

  1. StorageClass 是存储的“配置模板”,就像是房子的“设计图纸”。我们可以有多个 StorageClass 来满足不同应用的需求,比如快速存储、廉价存储等。
  2. PV 是实际存在的存储资源,相当于根据 StorageClass 的设计建好的“房子”,拥有具体的地址、面积和配置。
  3. PVC 是应用的存储需求声明,类似于租客(应用)提出的“租房需求”。租客不需要关心具体的房子在哪里,只需要描述需求(如多大面积、允许多少人入住等),Kubernetes 会根据这些需求去匹配合适的房子(PV)。

当应用发出一个 PVC 请求时,Kubernetes 会查找或创建一个符合条件的 PV,并将 PVC 绑定到该 PV 上。这样,应用无需了解存储的底层细节,PVC 会自动为应用分配合适的存储卷。

案例分析:开发环境与生产环境的存储配置

开发环境:使用本地路径存储

在开发环境中,我们可以使用 local-path StorageClass(K3s 中的默认 StorageClass)来实现简单的本地存储。这种配置足够轻量,适合短期、轻量的数据存储需求。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: dev-pvc
spec:
  storageClassName: "local-path"
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

生产环境:使用 NFS 网络存储

在生产环境中,为了实现数据的高可用性和持久性,推荐使用网络存储,比如 NFS。网络存储通常可以被多个节点共享访问,适合分布式的高可用性需求。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-storage
provisioner: nfs-provisioner
reclaimPolicy: Retain
volumeBindingMode: WaitForFirstConsumer
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
spec:
  capacity:
    storage: 20Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  nfs:
    path: /data/nfs
    server: 192.168.1.100

总结

Kubernetes 中的 StorageClassPersistentVolume (PV)PersistentVolumeClaim (PVC) 是存储管理的核心概念。理解这三者的角色和相互关系,有助于我们更好地管理 Kubernetes 集群中的持久存储资源。

  • StorageClass:定义存储类型的模板,用于配置不同类型的存储卷。
  • PV:实际的存储资源,指向具体的物理存储。
  • PVC
  • PVC:是应用对存储的需求声明,相当于应用提出的“存储请求”。

理解这三者的配合使用,可以帮助我们在 Kubernetes 中实现更灵活、更可靠的存储管理。通过 StorageClass,我们可以定义多种类型的存储,并根据应用的需求动态分配合适的存储资源;通过 PV 和 PVC 的绑定机制,可以让存储的管理变得更加简洁高效。

在实际场景中,Kubernetes 的存储管理可以适应各种需求:

  1. 开发环境:通常以简单、高效为主,比如使用 K3s 中默认的 local-path 存储方式,以节省成本、加快部署速度。
  2. 生产环境:强调数据的可靠性和高可用性,通常会使用网络存储(如 NFS 或云服务提供的存储卷),确保数据的持久性和分布式可用性。

通过合理配置 StorageClass、PV 和 PVC,我们可以针对不同的应用场景设计合适的存储方案。无论是临时性开发环境,还是要求较高的生产环境,这套机制都能提供灵活的支持。


参考配置模板汇总

开发环境(使用 local-path StorageClass)

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: dev-pvc
spec:
  storageClassName: "local-path"
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

生产环境(使用 NFS StorageClass)

StorageClass 配置

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-storage
provisioner: nfs-provisioner
reclaimPolicy: Retain
volumeBindingMode: WaitForFirstConsumer

PersistentVolume 配置

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
spec:
  capacity:
    storage: 20Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  nfs:
    path: /data/nfs
    server: 192.168.1.100

PersistentVolumeClaim 配置

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: prod-pvc
spec:
  storageClassName: "nfs-storage"
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 10Gi

总结

通过这篇文章,我们了解了 Kubernetes 中 StorageClass、PersistentVolume 和 PersistentVolumeClaim 的基本概念、配置方法和应用场景。这三个概念共同构成了 Kubernetes 存储管理的核心机制,为我们的应用提供了灵活、可靠的存储支持。希望这篇文章能帮助你在实际应用中,搭建和管理高效的 Kubernetes 存储解决方案。

理解 Kubernetes 中的存储:StorageClass、PersistentVolume 和 PersistentVolumeClaim

在 Kubernetes 中,容器的存储管理是一个重要的课题。无论是开发环境还是生产环境,一个清晰的存储管理概念是保障数据可靠性和应用稳定性的基础。对于 Kubernetes 新手来说,StorageClassPersistentVolume (PV)PersistentVolumeClaim (PVC) 可能会让人感到迷惑。那么,今天我们就从这三个概念入手,深入浅出地理解它们各自的角色和相互关系。


1. StorageClass:定义存储类型的“配置模板”

StorageClass 是 Kubernetes 中的存储模板,用来定义存储的类型和配置。它是一种“规格定义”,为不同需求提供了可选的存储配置。例如,在生产环境中,我们可能需要高性能的存储,而在开发环境中则更看重成本的低廉。StorageClass 就是我们用来区分这些不同需求的工具。

关键点

  • 作用:定义不同的存储类型。
  • 用途:允许创建多个 StorageClass,每种类型代表一个独立的存储配置,比如本地存储、云存储、NFS 等。
  • 核心配置项

    • provisioner:指定具体的存储分配方式。例如,可以选择本地存储、网络文件系统(NFS)、云存储(AWS、GCP 等)。
    • reclaimPolicy:存储卷被释放后的处理方式,常用的选项包括 Delete(删除)、Retain(保留数据)、Recycle(清理)。
    • volumeBindingMode:决定存储卷何时绑定,常见的选项包括 Immediate(立即绑定)和 WaitForFirstConsumer(等到首次使用时才绑定)。

案例:以下 StorageClass 配置指定使用 Google Cloud 的持久性 SSD 作为存储后端,适用于需要高性能的应用场景:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast-storage
provisioner: kubernetes.io/gce-pd
parameters:
  type: pd-ssd
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer

这里 provisioner 定义了使用 Google Cloud 的持久性磁盘(gce-pd),并指定了类型 pd-ssd,从而确保高性能。

2. PersistentVolume (PV):存储资源的“实际物理位置”

PersistentVolume 是 Kubernetes 中的存储资源,是一种独立的、物理存在的存储卷。PV 是实际的存储资源,可以是物理机上的磁盘、NFS 文件系统或者云端的存储卷。管理员可以手动创建 PV,或者通过 StorageClass 动态创建。PV 是 Kubernetes 中的持久存储,可以跨 Pod 使用,即便 Pod 被删除,PV 的数据也可以保留。

关键点

  • 作用:PV 是具体的存储卷,指向真实的存储资源。
  • 用途:可以独立于 Pod 使用,管理员可以控制存储卷的配置(大小、访问模式等)。
  • 核心配置项

    • capacity:定义存储卷的大小,比如 10Gi
    • accessModes:定义 PV 的访问权限,包括 ReadWriteOnce(单节点读写)、ReadOnlyMany(多个节点只读)和 ReadWriteMany(多个节点读写)。
    • persistentVolumeReclaimPolicy:存储卷被释放后的处理方式,和 StorageClass 中的 reclaimPolicy 类似。

案例:以下 PV 配置了一个使用 NFS 的持久性存储卷,大小为 10Gi,支持多个节点读写。

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  nfs:
    path: /data/nfs
    server: 192.168.1.100

这里 capacity 设置了存储卷的大小为 10Gi,accessModes 设置为 ReadWriteMany,允许多个节点同时读写,persistentVolumeReclaimPolicy 设置为 Retain 保留数据。

3. PersistentVolumeClaim (PVC):应用对存储的“租房需求”

PersistentVolumeClaim 是用户(应用)对存储的请求,相当于应用的“存储需求声明”。PVC 是应用对 Kubernetes 存储资源的申请,描述了所需的存储容量和访问模式。Kubernetes 会自动根据 PVC 的配置查找或创建一个合适的 PV,将其绑定到 PVC 上。

关键点

  • 作用:PVC 是应用的存储需求声明。
  • 用途:应用不需要知道实际存储的位置,只需声明需求,PVC 会自动匹配合适的 PV。
  • 核心配置项

    • storageClassName:指定 PVC 所需的 StorageClass。
    • accessModes:定义访问模式,与 PV 的访问模式保持一致。
    • resources:定义请求的存储容量。

案例:以下 PVC 声明请求了 5Gi 的存储空间,使用之前定义的 fast-storage StorageClass。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  storageClassName: fast-storage
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

在这里,storageClassNamefast-storage,表示使用前面定义的高性能存储,accessModes 设置为 ReadWriteOnce,只能由一个节点读写,resources.requests.storage 请求了 5Gi 的存储容量。


三者的关系和流程

我们可以用“租房”来比喻这三者之间的关系:

  1. StorageClass 是存储的“配置模板”,就像是房子的“设计图纸”。我们可以有多个 StorageClass 来满足不同应用的需求,比如快速存储、廉价存储等。
  2. PV 是实际存在的存储资源,相当于根据 StorageClass 的设计建好的“房子”,拥有具体的地址、面积和配置。
  3. PVC 是应用的存储需求声明,类似于租客(应用)提出的“租房需求”。租客不需要关心具体的房子在哪里,只需要描述需求(如多大面积、允许多少人入住等),Kubernetes 会根据这些需求去匹配合适的房子(PV)。

当应用发出一个 PVC 请求时,Kubernetes 会查找或创建一个符合条件的 PV,并将 PVC 绑定到该 PV 上。这样,应用无需了解存储的底层细节,PVC 会自动为应用分配合适的存储卷。

案例分析:开发环境与生产环境的存储配置

开发环境:使用本地路径存储

在开发环境中,我们可以使用 local-path StorageClass(K3s 中的默认 StorageClass)来实现简单的本地存储。这种配置足够轻量,适合短期、轻量的数据存储需求。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: dev-pvc
spec:
  storageClassName: "local-path"
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

生产环境:使用 NFS 网络存储

在生产环境中,为了实现数据的高可用性和持久性,推荐使用网络存储,比如 NFS。网络存储通常可以被多个节点共享访问,适合分布式的高可用性需求。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-storage
provisioner: nfs-provisioner
reclaimPolicy: Retain
volumeBindingMode: WaitForFirstConsumer
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
spec:
  capacity:
    storage: 20Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  nfs:
    path: /data/nfs
    server: 192.168.1.100

总结

Kubernetes 中的 StorageClassPersistentVolume (PV)PersistentVolumeClaim (PVC) 是存储管理的核心概念。理解这三者的角色和相互关系,有助于我们更好地管理 Kubernetes 集群中的持久存储资源。

  • StorageClass:定义存储类型的模板,用于配置不同类型的存储卷。
  • PV:实际的存储资源,指向具体的物理存储。
  • PVC
  • PVC:是应用对存储的需求声明,相当于应用提出的“存储请求”。

理解这三者的配合使用,可以帮助我们在 Kubernetes 中实现更灵活、更可靠的存储管理。通过 StorageClass,我们可以定义多种类型的存储,并根据应用的需求动态分配合适的存储资源;通过 PV 和 PVC 的绑定机制,可以让存储的管理变得更加简洁高效。

在实际场景中,Kubernetes 的存储管理可以适应各种需求:

  1. 开发环境:通常以简单、高效为主,比如使用 K3s 中默认的 local-path 存储方式,以节省成本、加快部署速度。
  2. 生产环境:强调数据的可靠性和高可用性,通常会使用网络存储(如 NFS 或云服务提供的存储卷),确保数据的持久性和分布式可用性。

通过合理配置 StorageClass、PV 和 PVC,我们可以针对不同的应用场景设计合适的存储方案。无论是临时性开发环境,还是要求较高的生产环境,这套机制都能提供灵活的支持。


参考配置模板汇总

开发环境(使用 local-path StorageClass)

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: dev-pvc
spec:
  storageClassName: "local-path"
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

生产环境(使用 NFS StorageClass)

StorageClass 配置

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-storage
provisioner: nfs-provisioner
reclaimPolicy: Retain
volumeBindingMode: WaitForFirstConsumer

PersistentVolume 配置

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
spec:
  capacity:
    storage: 20Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  nfs:
    path: /data/nfs
    server: 192.168.1.100

PersistentVolumeClaim 配置

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: prod-pvc
spec:
  storageClassName: "nfs-storage"
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 10Gi

总结

通过这篇文章,我们了解了 Kubernetes 中 StorageClass、PersistentVolume 和 PersistentVolumeClaim 的基本概念、配置方法和应用场景。这三个概念共同构成了 Kubernetes 存储管理的核心机制,为我们的应用提供了灵活、可靠的存储支持。希望这篇文章能帮助你在实际应用中,搭建和管理高效的 Kubernetes 存储解决方案。

赞 (0)

评论区(暂无评论)

这里空空如也,快来评论吧~

我要评论