k8s PV与PVC持久化存储详解与实际应用分享

🐇明明跟你说过:个人主页

🏅个人专栏:《Kubernetes航线图:从船长到K8s掌舵者》 🏅

🔖行路有良友,便是天堂🔖

目录

一、前言

 1、k8s概述

2、k8s为什么要有持久化存储

二、 Persistent Volume (PV) 详解

1、PV是什么

 2、PV的生命周期

3、PV的访问模式

4、PV的类型(如:NFS、GlusterFS、AWS EBS等)

5、PV 的回收策略

三、Persistent Volume Claim (PVC) 详解

1、PVC是什么

2、PVC与PV的绑定机制

3、PVC的生命周期

四、实战案例

1、创建PV

2、创建PVC

3、创建Pod

4、测试


一、前言

 1、k8s概述

 Kubernetes单词起源于希腊语, 是“舵手”或者“领航员、飞行员”的意思。

Kubernetes(简称K8s)的前世今生可以追溯到谷歌(Google)内部的一个项目,它起源于2003年,当时谷歌正面临着不断增长的应用程序和服务的管理挑战。这个项目最初被称为"Borg",是一个早期的容器编排系统。Borg 的成功经验成为 Kubernetes 开发的契机。

 有关k8s起源的介绍,请参考《初识K8s之前世今生、架构、组件、前景》这篇文章

Kubernetes的优点包括可移植性、可伸缩性和扩展性。它使用轻型的YAML清单文件实现声明性部署方法,对于应用程序更新,无需重新构建基础结构。管理员可以计划和部署容器,根据需要扩展容器并管理其生命周期。借助Kubernetes的开放源代码API,用户可以通过首选编程语言、操作系统、库和消息传递总线来构建应用程序,还可以将现有持续集成和持续交付(CI/CD)工具集成。

2、k8s为什么要有持久化存储

Kubernetes (k8s) 引入持久化存储是为了处理容器化应用在动态调度和生命周期管理过程中遇到的数据持久性问题。在Kubernetes中,Pod是应用实例的载体,它们具有短暂性,即Pod可以根据集群的健康状况、资源需求等因素被创建、销毁、重启或迁移到不同的节点。这就意味着,如果Pod内部的容器直接将数据写在其自身的存储空间中,一旦Pod被删除或重建,这些数据就会丢失。

持久化存储在Kubernetes中的核心作用包括:

  1. 数据持久性:允许容器在Pod被重新调度、重启或迁移时,保持对其存储数据的访问,即使Pod本身发生了变化,数据也不会丢失。
  2. 状态管理:对于状态型应用(如数据库服务MySQL、Redis等),需要确保在任何情况下都能访问和维护其关键状态数据。
  3. 资源共享:支持多容器间的共享存储,使得同一Pod内的多个容器或不同Pod间的容器能读取和修改相同的数据集。
  4. 应用可移植性:通过抽象出PersistentVolume (PV) 和 PersistentVolumeClaim (PVC) 对象,Kubernetes可以灵活地对接各种类型的存储系统(如云存储服务、网络存储、本地磁盘等),从而实现了跨不同基础设施环境的存储兼容性和可移植性。

二、 Persistent Volume (PV) 详解

1、PV是什么

在 Kubernetes(K8s)中,PV(PersistentVolume)是一种抽象资源,用于提供持久化存储。PV 表示集群中的一块持久化存储,可以由集群管理员预先创建,然后由开发者或应用程序使用。PV 与 Pod 分离,因此它们的生命周期独立于 Pod。这意味着即使 Pod 被删除,PV 也可以保持不变。

PV 可以用来提供持久化存储,如磁盘、网络存储等。它们具有容量、访问模式(如只读、读写)、回收策略等属性,用于描述存储的特性和行为。PV 可以静态创建(由管理员手动创建)或动态创建(通过 StorageClass 自动创建)。

PV 的主要作用是为 Pod 提供持久化存储,使应用程序可以持久化地存储数据,而不会受到 Pod 生命周期的影响。通过 PV,Kubernetes 提供了一种灵活和可扩展的方式来管理持久化存储资源,使得应用程序可以方便地访问并使用持久化存储,同时与集群的其他组件解耦。

 2、PV的生命周期

PV(PersistentVolume)的生命周期包括以下几个阶段:

  1. 创建(Provisioning):PV 可以由集群管理员手动创建或通过动态配置的方式由 StorageClass 自动创建。在创建阶段,PV 被分配一个唯一的标识符(UID),并设置其容量、访问模式、存储类型等属性。
  2. 绑定(Binding):PV 可以绑定到一个或多个 PersistentVolumeClaim(PVC)。PVC 是 Pod 对 PV 的声明,用于请求持久化存储。当 PVC 被创建并与 PV 匹配时,它们将被绑定在一起,形成 PV-PVC 绑定关系。
  3. 使用(Utilization):PV 可以被 Pod 使用。Pod 可以通过 VolumeMount 将 PV 挂载到容器中,并在容器中访问持久化存储。Pod 中的应用程序可以读取和写入 PV 中的数据,从而实现持久化存储。
  4. 释放(Releasing):当 PV 不再被使用时,它可以被释放。释放操作可能是手动的(由管理员执行)或自动的(根据回收策略)。在释放后,PV 可以重新被其他 PVC 绑定,以供新的 Pod 使用。
  5. 回收(Reclaiming):PV 的回收是指在释放后对 PV 进行清理和重用的过程。回收策略决定了 PV 在释放后的处理方式。回收策略可以是 Retain(保留)、Delete(删除)或 Recycle(回收)。具体的回收策略由管理员在创建 PV 时指定。
  6. 删除(Deletion):PV 可以被删除,释放其资源并从集群中移除。删除 PV 时,通常会根据回收策略执行相应的回收操作。PV 删除后,PV-PVC 绑定关系也将被解除。

 这些阶段构成了 PV 的完整生命周期,从创建、绑定、使用到释放、回收和删除,涵盖了 PV 在集群中的各个状态和操作。 

3、PV的访问模式

PV(PersistentVolume)的访问模式指定了持久化存储如何被挂载到 Pod 中的容器。Kubernetes 支持以下几种 PV 的访问模式:

  • ReadWriteOnce(RWO):该模式表示 PV 只能被单个节点上的单个 Pod 以读写模式挂载。这意味着 PV 可以被多个 Pod 同时挂载,但每次只能由一个 Pod 进行读写操作。适用于需要独占性访问的场景,例如传统的分布式文件系统。
  • ReadOnlyMany(ROX):该模式表示 PV 可以被多个节点上的多个 Pod 以只读模式挂载。这意味着 PV 可以同时被多个 Pod 挂载,并允许它们读取 PV 中的数据,但不能进行写操作。适用于只读数据共享的场景,例如共享配置文件或静态资源。
  • ReadWriteMany(RWX):该模式表示 PV 可以被多个节点上的多个 Pod 以读写模式挂载。这意味着 PV 可以同时被多个 Pod 挂载,并允许它们读取和写入 PV 中的数据。适用于需要多个 Pod 之间共享读写数据的场景,例如分布式数据库或共享存储卷。

不同的访问模式适用于不同的场景和需求。在创建 PV 时,需要根据实际需求选择合适的访问模式,并根据 PV 所支持的访问模式来选择适当的存储解决方案。

  

4、PV的类型(如:NFS、GlusterFS、AWS EBS等)

PV(PersistentVolume)的类型定义了持久化存储的具体类型,包括底层存储解决方案的类型。Kubernetes 支持多种类型的 PV,常见的包括以下几种:

  1. NFS(Network File System):NFS 是一种网络文件系统,通过网络共享文件系统的方式提供持久化存储。在 Kubernetes 中,可以通过 NFS 服务器挂载 NFS 服务器上的共享目录作为 PV,从而提供持久化存储支持。
  2. GlusterFS:GlusterFS 是一种分布式文件系统,通过将多个存储节点组合在一起,形成一个统一的、可扩展的存储池,为应用程序提供持久化存储。在 Kubernetes 中,可以使用 GlusterFS 作为 PV,提供分布式的、可扩展的持久化存储。
  3. AWS EBS(Amazon Elastic Block Store):AWS EBS 是亚马逊提供的一种云端块存储服务,为虚拟机实例提供持久化存储支持。在 Kubernetes 中,可以使用 AWS EBS 卷作为 PV,将亚马逊云上的块存储挂载到 Pod 中,以提供持久化存储。
  4. Azure Disk:Azure Disk 是微软 Azure 云平台提供的一种云端块存储服务,类似于 AWS EBS,在 Kubernetes 中也可以将 Azure Disk 卷作为 PV 使用。
  5. HostPath:HostPath 类型的 PV 使用节点上的本地文件系统作为持久化存储,通常用于开发、测试或临时性的存储需求。
  6. Ceph RBD(Ceph Block Device):Ceph RBD 是 Ceph 存储系统提供的一种分布式块存储服务,可以将 Ceph RBD 卷作为 PV 使用,提供高可用、可扩展的持久化存储支持。

除了上述类型外,还有其他一些存储解决方案(如 iSCSI、Fiber Channel 等)也可以作为 PV 使用,具体取决于 Kubernetes 集群所支持的存储插件和底层存储设施。

   

5、PV 的回收策略

在 Kubernetes 中,PersistentVolume(PV)的回收策略由管理员在 PV 的配置中指定。PV 的回收策略定义了当 PV 与 PersistentVolumeClaim(PVC)解绑后,如何处理 PV 中的数据以及 PV 自身的状态。

Kubernetes 支持以下几种 PV 回收策略:

  1. Retain(保留):保留策略表示在 PV 与 PVC 解绑后,PV 中的数据将被保留,并且 PV 的状态不会被修改。这意味着管理员需要手动处理 PV 中的数据,可以选择重新绑定现有的 PVC 或者手动清理 PV 中的数据。
  2. Delete(删除):删除策略表示在 PV 与 PVC 解绑后,Kubernetes 将会自动删除 PV 中的数据,并且将 PV 的状态标记为 Released。这样可以确保释放 PV 中的资源,但是会导致 PV 中的数据丢失,因此在使用该策略时需要谨慎。
  3. Recycle(回收):回收策略表示在 PV 与 PVC 解绑后,Kubernetes 将会尝试对 PV 中的数据进行清理或重置,以便为新的 PVC 重新使用。这种策略通常用于支持静态存储资源,例如 NFS 或 HostPath 等。
  4. Dynamic Provisioning(动态配置):动态配置策略是一种特殊的策略,它与静态配置不同,PV 不需要手动配置,而是根据 PVC 的需求动态创建 PV。对于动态配置的 PV,回收策略通常由存储后端提供商定义,例如 AWS EBS 或 GCE PD 等,因此会根据存储后端的配置来确定如何处理 PV。

三、Persistent Volume Claim (PVC) 详解

1、PVC是什么

PVC(PersistentVolumeClaim)是 Kubernetes 中用于申请持久化存储的资源对象。它用于声明 Pod 所需的持久化存储资源,如 PV(PersistentVolume),并且允许用户指定所需的存储容量、访问模式以及其他选项。

简单来说,PVC 是 Pod 对持久化存储的需求描述,而 PV 则是实际提供持久化存储的资源。PVC 通过声明的方式来请求 PV,并与其进行绑定,从而实现 Pod 对持久化存储的访问。

2、PVC与PV的绑定机制

在 Kubernetes 中,PVC(PersistentVolumeClaim)与 PV(PersistentVolume)之间的绑定是通过匹配 PV 和 PVC 的标签和属性来实现的。具体绑定机制如下:

  1. 标签匹配:PV 和 PVC 都可以拥有标签(Labels),这些标签用于描述存储资源的属性。当创建 PVC 时,可以通过指定 selector 字段来选择满足特定标签条件的 PV。如果 PV 的标签与 PVC 的 selector 字段匹配,那么它们就可以进行绑定。
  2. 访问模式匹配:PV 和 PVC 之间还需要满足访问模式(AccessModes)的匹配。PV 通常会定义支持的访问模式,例如 ReadWriteOnce、ReadWriteMany 和 ReadOnlyMany。当创建 PVC 时,可以指定所需的访问模式。只有当 PVC 请求的访问模式与 PV 支持的访问模式匹配时,它们才能进行绑定。
  3. 容量匹配:最后,PV 和 PVC 之间还需要满足容量(Capacity)的匹配。PV 会定义其提供的存储容量大小,而 PVC 可以指定所需的存储容量。只有当 PVC 请求的存储容量小于或等于 PV 提供的容量时,它们才能进行绑定。

绑定成功后,PVC 就可以使用绑定的 PV 提供的持久化存储资源了。

  

3、PVC的生命周期

PersistentVolumeClaim(PVC)在 Kubernetes 中具有以下生命周期:

  1. 创建:用户通过定义 PVC 资源清单文件并提交给 Kubernetes API Server 来创建 PVC。在 PVC 被创建之后,Kubernetes 将会按照 PVC 描述的要求尝试匹配并绑定可用的 PersistentVolume(PV)。
  2. 绑定:PVC 会尝试与匹配的 PV 进行绑定。绑定是根据 PVC 的标签选择器、访问模式和容量等条件来确定的。如果找到合适的 PV,并且其满足 PVC 的要求,就会进行绑定。
  3. 使用:一旦 PVC 与 PV 绑定成功,Pod 可以通过将 PVC 挂载到其容器中来访问 PV 提供的持久化存储资源。Pod 中的容器可以通过 PVC 指定的路径来读取和写入数据。
  4. 释放:当用户不再需要 PVC 时,可以删除 PVC 资源。在 PVC 被删除之后,与之绑定的 PV 不会立即释放,而是等到所有使用该 PV 的 Pod 都被删除后才会释放。这样可以确保 PV 的持久化存储资源不会意外丢失。
  5. 回收:一旦 PVC 被删除且与之绑定的 PV 不再使用,Kubernetes 将会执行 PV 的回收操作。PV 的回收策略可以由管理员在 PV 的配置中定义。通常情况下,PV 可以通过重新格式化、删除数据等方式进行回收,以便为新的 PVC 重新使用。

总的来说,PVC 的生命周期包括创建、绑定、使用、释放和回收等阶段。

四、实战案例

1、创建PV

要在 Kubernetes 中创建一个 PersistentVolume(PV),需要编写一个 YAML 文件,指定 PV 的属性。这里我们用的后端存储是NFS,如果还未搭建NFS服务器,可以参考《搭建NFS服务器,部署k8s集群,并在k8s中使用NFS作为持久化储存》这篇文章

以下是一个示例 PV 的 YAML 文件:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-pv
spec:
  capacity:
    storage: 5Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  nfs:
    path: /data/nfs-k8s
    server: 192.168.40.132
  • name:PV 的名称,这里命名为 my-pv。
  • capacity:PV 的容量,这里设置为 5Gi。
  • volumeMode:PV 的卷模式,这里设置为 Filesystem。
  • accessModes:PV 的访问模式,这里设置为 ReadWriteOnce,表示 PV 只能被单个节点挂载为读写模式。
  • persistentVolumeReclaimPolicy:PV 的回收策略,这里设置为 Retain,表示删除 PVC 后保留 PV 的数据。
  • nfs:PV 的类型为 NFS,指定 NFS 服务器的路径和地址。

 创建PV,在k8s Master节点执行

[root@master ~]# kubectl apply -f  pv.yaml
persistentvolume/my-pv created

查看PV

  

2、创建PVC

创建一个PVC,使用上面刚刚创建的PV,编写YAML文件

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
  storageClassName: manual
  volumeName: my-pv
  • name:PVC 的名称,这里命名为 my-pvc。
  • accessModes:PVC 的访问模式,这里设置为 ReadWriteOnce,与 PV 的访问模式一致。
  • resources:PVC 请求的资源,这里请求 5Gi 的存储空间。
  • volumeName:指定要使用的 PV 的名称,这里设置为 my-pv,与创建的 PV 的名称一致。

 创建并查看PVC

3、创建Pod

在 Kubernetes 中创建一个 Pod,并使用刚刚创建的 PVC,编写YAML文件:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  volumes:
    - name: my-volume
      persistentVolumeClaim:
        claimName: my-pvc
  containers:
    - name: my-container
      image: nginx
      ports:
      - containerPort: 80
      volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: my-volume
  • name:Pod 的名称,这里命名为 my-pod。
  • volumes:指定 Pod 使用的卷,这里创建了一个名为 my-volume 的卷,并通过 persistentVolumeClaim 引用了名为 my-pvc 的 PVC。
  • containers:定义 Pod 中的容器,这里创建了一个名为 my-container 的容器,使用了 nginx 镜像,并将 my-volume 挂载到了容器的 /usr/share/nginx/html目录。

创建pod

 

4、测试

在nfs服务器的 /data/nfs-k8s 目录下创建nginx首页文件

 查看刚刚创建的pod的IP。并请求该pod

 返回结果就是我们刚刚创建的首页文件,证明pod已成功调用PVC持久化存储

💕💕💕每一次的分享都是一次成长的旅程,感谢您的陪伴和关注。希望这些关于Kubernetes的文章能陪伴您走过技术的一段旅程,共同见证成长和进步!😺😺😺

🧨🧨🧨让我们一起在技术的海洋中探索前行,共同书写美好的未来!!!    

  • 29
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
PV(PersistentVolume)和PVC(PersistentVolumeClaim)是Kubernetes中用于实现持久化存储的重要概念。 PV是集群中的一块存储,可以是NFS、iSCSI、本地存储等,由管理员进行配置或使用存储类进行动态配置。PV定义了存储的容量、访问模式、持久化存储的类型等属性。PV的生命周期是独立于Pod的,即使Pod被删除,PV仍然存在,可以被其他Pod继续使用。 PVC是一个持久化存储卷,用于访问各种类型的持久化存储,如本地存储、网络存储、云存储等。PVC的使用使应用程序更加灵活和可移植,同时也提高了存储资源的利用率。PVCPV是一一对应的关系,即一个PVC只能绑定一个PV,而一个PV也只能被一个PVC绑定。 下面是一个演示k8s持久化存储PVPVC的案例: 1. 创建PV: ```yaml apiVersion: v1 kind: PersistentVolume metadata: name: my-pv spec: capacity: storage: 1Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: my-storage-class nfs: path: /data server: nfs-server-ip ``` 2. 创建PVC: ```yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi storageClassName: my-storage-class ``` 3. 创建Pod,并挂载PVC卷: ```yaml apiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: my-container image: nginx volumeMounts: - name: my-volume mountPath: /data volumes: - name: my-volume persistentVolumeClaim: claimName: my-pvc ``` 4. 删除PVC的正确步骤: ```shell kubectl delete pod my-pod kubectl delete pvc my-pvc kubectl delete pv my-pv ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

明明跟你说过

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值