自学内容网 自学内容网

应用存储和持久化数据卷

应用存储和持久化数据卷

在 Kubernetes 中,存储是应用的重要组成部分,尤其是对于需要持久化数据的应用,如数据库、文件存储等。Kubernetes 提供了多种存储资源来满足不同应用的需求,最重要的概念之一就是 Persistent Volume (PV)Persistent Volume Claim (PVC)

1. 存储资源类型

1.1 Ephemeral Storage(临时存储)

临时存储是指 Kubernetes 容器生命周期内存储的数据。当容器终止或者被销毁时,临时存储的数据将会丢失。临时存储的例子包括:

  • emptyDir:一个临时的空目录,在容器启动时创建,容器终止时删除。
  • hostPath:挂载主机上的文件或目录,通常用于调试或测试,但不适合持久化数据,因为数据会依赖宿主机。
1.2 Persistent Storage(持久化存储)

持久化存储用于存储需要在 Pod 重启或迁移时保持的数据。Kubernetes 提供了以下持久化存储解决方案:

  • Persistent Volume (PV):集群中的一块存储资源。由管理员预先配置,代表外部存储(如 NFS、GlusterFS、Ceph、云存储等)。
  • Persistent Volume Claim (PVC):用户向 Kubernetes 请求存储资源的方式。PVC 表示应用所需的存储量,Kubernetes 会将其与 PV 绑定,提供相应的存储。
1.3 其他存储类型
  • ConfigMap 和 Secret:这两种 Kubernetes 资源用于存储配置信息或敏感数据,可以被容器挂载为文件或作为环境变量传递。
  • StatefulSet:用于需要持久化存储的有状态应用。StatefulSet 自动管理与存储相关的细节,每个 Pod 都可以有自己的持久化存储。

2. Persistent Volumes (PV) 和 Persistent Volume Claims (PVC)

2.1 Persistent Volume (PV)

Persistent Volume (PV) 是集群中管理员预配置的存储资源。PV 可以使用多种存储技术(如 NFS、iSCSI、Ceph、云存储等)来提供持久化存储。PV 是由管理员创建的,存储资源具有生命周期,可以在多个 Pod 之间共享。

PV 是集群中的资源对象,类似于节点或 pod 的其他资源。管理员通过 YAML 文件定义 PV,并将其与物理存储资源相关联。

PV 示例

apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-pv
spec:
  capacity:
    storage: 5Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: standard
  hostPath:
    path: /mnt/data
  • capacity: 指定存储的大小。
  • accessModes: 定义 PV 可以被访问的模式(如 ReadWriteOnceReadOnlyManyReadWriteMany)。
  • persistentVolumeReclaimPolicy: 定义回收策略,如 Retain(保留)、Recycle(回收)、Delete(删除)。
  • storageClassName: 存储的类型(例如使用某个存储类)。
  • hostPath: 使用本地存储作为持久化存储,通常用于开发和测试环境。
2.2 Persistent Volume Claim (PVC)

Persistent Volume Claim (PVC) 是用户对存储资源的请求,它定义了需要的存储大小、访问模式等要求。PVC 会与合适的 PV 绑定,确保应用可以使用到所需的存储。

PVC 是用户创建的,它描述了应用所需的存储资源(如大小和访问模式)。Kubernetes 会根据 PVC 的要求找到适合的 PV,并将它们绑定在一起。

PVC 示例

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
  • accessModes: 请求存储的访问模式。
  • resources.requests.storage: 请求的存储大小。

当 PVC 被创建时,Kubernetes 会寻找符合该请求的 PV 并将其绑定。如果有多个 PV 满足条件,Kubernetes 会根据存储类、容量等选择最佳匹配。

2.3 PV 与 PVC 的绑定
  • 动态供应:如果没有预先创建的 PV 可以满足 PVC 的请求,Kubernetes 可以使用 StorageClass 来动态创建 PV。
    动态访问方式的优点
  • 灵活性高,无需管理员手动干预,适合大规模、自动化环境。
  • 动态供应存储卷,减少人工配置和管理的工作量。
    动态访问方式的缺点
  • 需要管理员配置适当的 StorageClass 和存储提供者。
  • 可能存在存储资源使用不均衡的风险,需进行资源管理和监控。
    动态访问示例
  1. 创建 StorageClassstorageclass.yaml):

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: standard
    provisioner: kubernetes.io/aws-ebs
    parameters:
      type: gp2
    
  2. 创建 PVC 并使用 StorageClasspvc-dynamic.yaml):

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

    在这个例子中,用户请求的 PVC 会使用 StorageClass 中定义的 EBS 类型来动态供应存储。

  • 静态供应:如果管理员手动创建了 PV,则 Kubernetes 会根据 PVC 的要求将 PVC 与 PV 进行匹配,并绑定在一起。
    静态访问方式的优点
  • 提供明确的存储资源控制,可以手动配置 PV 来匹配特定的存储需求。
  • 适用于已有存储设备或对存储资源有特殊要求的场景。
    静态访问方式的缺点
  • 不够灵活,管理员需要预先创建 PV,管理工作量较大。
  • 难以应对动态需求,特别是在存储需求变化频繁的环境中。
    静态访问示例
  1. 创建 PVpv.yaml):

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: my-pv
    spec:
      capacity:
        storage: 10Gi
      volumeMode: Filesystem
      accessModes:
        - ReadWriteOnce
      persistentVolumeReclaimPolicy: Recycle
      storageClassName: manual
      hostPath:
        path: /mnt/data
    
  2. 创建 PVCpvc.yaml):

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

    在这个例子中,管理员创建了一个 10Gi 的 PV,Pod 通过 PVC 请求 5Gi 的存储。PVC 会和符合要求的 PV(即 10Gi)绑定。

3. StorageClass 和动态卷供应

StorageClass 是一种用于动态供应存储卷的方式。管理员可以创建一个或多个 StorageClass,定义不同的存储类型和配置(例如基于不同云平台的存储)。当 PVC 指定了某个 StorageClass 时,Kubernetes 会使用该 StorageClass 中定义的策略动态创建 PV。

StorageClass 示例

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast-storage
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp2
  • provisioner: 存储供应器,指定存储类型(如 AWS EBS、GCE PD、Ceph、NFS 等)。
  • parameters: 存储供应器的具体参数,因供应器而异。

当 PVC 指定了 StorageClass 时,Kubernetes 会使用该类来动态创建一个 PV:

PVC 使用 StorageClass 示例

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

4. 访问模式

PV 和 PVC 都使用 访问模式 (Access Modes) 来控制如何访问存储资源,常见的访问模式有:

  • ReadWriteOnce:只能由一个节点以读写方式访问。
  • ReadOnlyMany:可以由多个节点以只读方式访问。
  • ReadWriteMany:可以由多个节点以读写方式访问。

选择合适的访问模式对应用非常重要,尤其是在有多个副本或多个节点时。


5. 使用场景

  • 数据库存储:对于需要持久化数据的应用(如 MySQL、PostgreSQL、Redis 等数据库),可以使用 PV 和 PVC 来提供可靠的存储。
  • 文件存储:如果应用需要存储文件,Kubernetes 也可以使用 PV 和 PVC 来提供持久化存储,并使文件在 Pod 重启或迁移时依然可用。
  • 共享存储:某些应用可能需要多个 Pod 共享同一个存储卷。在这种情况下,可以使用 PVC 配合 ReadWriteManyReadOnlyMany 访问模式来实现共享存储。
  • 备份和恢复:PV 可以用于存储应用的备份数据,以便在应用或容器发生故障时进行恢复。

6. 管理和生命周期

Kubernetes 中的存储生命周期管理通常分为以下几种情况:

  • 回收策略

    • Retain:当 PVC 被删除时,PV 保留不变,管理员需要手动回收资源。
    • Recycle:删除 PVC 后,PV 的数据会被清空并重新可用(此选项已不推荐使用)。
    • Delete:当 PVC 被删除时,PV 也会被删除(适用于动态供应的存储)。
  • 持久化数据的迁移:可以通过 PV 和 PVC 配置,确保数据在 Pod 或容器迁移、重启时不会丢失。


7. 总结

在 Kubernetes 中,存储和持久化数据是关键的基础设施之一。Persistent Volume (PV)Persistent Volume Claim (PVC) 提供了灵活的存储管理方式,使应用可以依赖于 Kubernetes 提供的持久化存储来保存数据。

  • PV:管理员创建的存储资源,可能是云存储、NFS 等。
  • PVC:用户的存储需求声明,Kubernetes 会根据 PVC 绑定适当的 PV。
  • StorageClass:提供动态存储卷供应的功能,可以根据存储类型(如云存储)配置动态创建 PV。

通过正确使用 PV、PVC 和 StorageClass,Kubernetes 可以为容器化应用提供高效、可靠、持久的存储解决方案。


原文地址:https://blog.csdn.net/qq_35861084/article/details/144735923

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!