【Kubernetes存储篇】持久化存储PV、PVC详解

这篇具有很好参考价值的文章主要介绍了【Kubernetes存储篇】持久化存储PV、PVC详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、PV、PVC持久化存储理论

官方中文参考文档:

1、PV、PVC是什么?

  • PersistentVolume(PV)是群集中的一块存储,可以是NFS、iSCSI、本地存储等,由管理员配置或使用存储类动态配置。 PV定义了存储的容量、访问模式、持久化存储的类型等属性。PV的生命周期是独立于Pod的,即使Pod被删除,PV仍然存在,可以被其他Pod继续使用。
  • PersistentVolumeClaim(PVC)是一个持久化存储卷,我们在创建pod时可以定义PVC类型的存储卷,PVC可以用来访问各种类型的持久化存储,如本地存储、网络存储、云存储等,而不必关心这些资源的实际位置和类型,PVC的使用可以使应用程序更加灵活和可移植,同时也可以提高存储资源的利用率。
  • PVC和PV它们是一一对应的关系,PV如果被PVC绑定了,就不能被其他PVC使用了。

2、PV的供应方式

两种分别为静态、动态:

  • 静态供应:管理员手动创建PV对象,并将其绑定到一个具体的存储后端上,然后Pod可以通过PVC(Persistent Volume Claim)请求绑定到该PV上。
  • 动态供应:管理员通过StorageClass定义一组存储后端,然后Pod可以通过PVC请求绑定到该StorageClass上,K8s会自动创建一个PV对象并将其绑定到一个可用的存储后端上。

3、PV、PVC的回收策略

当我们创建pod时如果使用pvc做为存储卷,那么它会和pv绑定,当删除pod,pvc和pv绑定就会解除,解除之后和pvc绑定的pv卷里的数据需要怎么处理 有以下几种:

Kubernetes中有三种PV回收策略:

  • Retain:保留PV,但不删除底层存储资源。这意味着PV中的数据仍然存在,但需要手动清理。
  • Delete:删除PV和底层存储资源。这意味着PV中的数据将被永久删除。
  • Recycle:删除PV中的数据,但不删除底层存储资源。这意味着PV中的数据将被清除,但底层存储资源可以重新使用。(不推荐,1.15可能被移除)

Kubernetes中有两种PVC回收策略:

  • Retain:保留PVC,但不删除底层存储资源。这意味着PVC中的数据仍然存在,但需要手动清理。
  • Delete:删除PVC和底层存储资源。这意味着PVC中的数据将被永久删除。

需要注意的是,PVC的回收策略必须与其所绑定的PV的回收策略相匹配。例如,如果PV的回收策略为Retain,则PVC的回收策略也必须为Retain。否则,可能会导致数据丢失或存储资源泄漏。

二、案例:PV、PVC持久化存储案例演示

1、搭建NFS服务端

PV使用NFS做为存储。

注意:K8S集群所有节点都需要安装 nfs-utils

yum install nfs-utils -y
mkdir /data/volumes/v{1..3} -p

vim /etc/exports
/data/volumes/v1 *(rw,no_root_squash)
/data/volumes/v2 *(rw,no_root_squash)
/data/volumes/v3 *(rw,no_root_squash)

加载配置生效 && 启动NFS服务

exportfs -arv
systemctl enable nfs --now

在其他Node节点上面测试 NFS 是否可以正常挂载:

yum install nfs-utils -y
mkdir /test
mount 16.32.15.200:/data/volumes/v1 /test

df -hT /test/

【Kubernetes存储篇】持久化存储PV、PVC详解

OK,如上图NFS可以正常挂载,表示到此,NFS 配置无问题。

2、创建PV,并使用NFS共享存储

创建三个PV,分别使用不通目录,不通访问模块,YAML如下:

cat pv.yaml 

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-1
  labels:
    app: pv-1
spec:
  nfs:
    path: /data/volumes/v1   # PV使用NFS路径
    server: 16.32.15.200     # NFS 服务端IP地址
  accessModes: ["ReadWriteOnce"]  # 访问模式: ReadWriteOnce,卷可以被一个节点以读写方式挂载
  capacity:
    storage: 1Gi                  # 存储大小
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-2
  labels:
    app: pv-2
spec:
  nfs:
    path: /data/volumes/v2
    server: 16.32.15.200
  accessModes: ["ReadOnlyMany"] # 访问模式: ReadOnlyMany,可以被多个节点只读方式挂载
  capacity:
    storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-3
  labels:
    app: pv-3
spec:
  nfs:
    path: /data/volumes/v3
    server: 16.32.15.200
  accessModes: ["ReadWriteMany"] # 访问模式: ReadWriteMany,可以被多个节点读写方式挂载
  capacity:
    storage: 3Gi
...

访问模式解释:

  • ReadWriteOnce:被一个节点,已读写方式挂载(官方解释,但是无法体现出来,应该是BUG)。
  • ReadOnlyMany:被多个节点,已只读方式挂载。
  • ReadWriteMany:被多个节点,已读写方式挂载。

执行YAML 文件:

kubectl apply -f pv.yaml

查看创建出来的PV资源:

kubectl get pv

【Kubernetes存储篇】持久化存储PV、PVC详解

3、创建PVC,并和PV绑定

创建三个PVC和,上面三个PV进行绑定 YAML 如下:

cat pvc.yaml 
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-1
  labels:
    app: pvc-1
spec:
  accessModes: ["ReadWriteOnce"]   # PVC访问模式,必须和PV访问模式一致
  selector:
    matchLabels:
      app: pv-1                   # 标签选择器,选择具有 app=pv-1 PV绑定
  resources: 
    requests: 
      storage: 1Gi                # 容量,必须和PV容量保持一致
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-2
  labels:
    app: pvc-2
spec:
  accessModes: ["ReadOnlyMany"]
  selector:
    matchLabels:
      app: pv-2
  resources:
    requests:
      storage: 2Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-3
  labels:
    app: pvc-3
spec:
  accessModes: ["ReadWriteMany"]
  selector:
    matchLabels:
      app: pv-3
  resources:
    requests:
      storage: 3Gi
...

执行 YAML 清单文件:

kubectl apply -f pvc.yaml

查看PVC 是否与 PV 相关联:

kubectl get pvc

【Kubernetes存储篇】持久化存储PV、PVC详解

4、创建Pod,并挂载PVC卷

cat pod-pvc.yaml 
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: pvc-test
  labels:
    app: pvc-test
spec:
  replicas: 3
  selector:
    matchLabels:
      app: pvc-test
  template:
    metadata:
      labels:
        app: pvc-test
    spec:
      volumes:
      - persistentVolumeClaim:     # 使用PVC类型
          claimName: pvc-2         # 指定使用PVC名字
        name: web-html-path        # 卷名称
      containers:
      - name: pvc-test
        image: nginx
        imagePullPolicy: IfNotPresent
        volumeMounts:
        - name: web-html-path      # 使用卷名称,和上面卷名称对应上
          mountPath: /usr/share/nginx/html  # 容器内挂载目录

执行YAML 文件:

kubectl apply -f pod-pvc.yaml 

我们使用的是只读权限的 pvc-2,对应目录是 /data/volumes/v2/,在目录中添加 index.html 文件

echo "PVC-DEMO" > /data/volumes/v2/index.html

访问Pod 网站:

kubectl get pods -o wide

【Kubernetes存储篇】持久化存储PV、PVC详解

我们进入容器里面创建文件试试:

kubectl exec -it pvc-test-d65964fd4-jmkmg -- /bin/bash

如下图,我是用的是只读的 PVC,容器里面应当没有创建文件权限,但是容器里面确实可以创建文件,我咨询了云原生领域大佬,这应该是K8S PVC bug,我当前K8S版本是:v1.27.0

【Kubernetes存储篇】持久化存储PV、PVC详解

5、删除PVC正确步骤

  • pvc和pv绑定,如果使用默认的回收策略retain,那么删除pvc之后,pv会处于released状态,我们想要继续使用这个pv,需要手动删除pv,kubectl delete pv pv_name,删除pv,不会删除pv里的数据,当我们重新创建pvc时还会和这个最匹配的pv绑定,数据还是原来数据,不会丢失。

  • 经过测试,如果回收策略是Delete,删除pv,pv后端存储的数据也不会被删除。

  • 回收策略字段:pv.spec.persistentVolumeReclaimPolicy字段

第一步:首先删除使用 PVC 的 Pod

第二步:删除PVC

第三步:删除PV文章来源地址https://www.toymoban.com/news/detail-489462.html

到了这里,关于【Kubernetes存储篇】持久化存储PV、PVC详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Kubernetes基础(二十三)-k8s持久化存储详解

    Kubernetes基础(二十三)-k8s持久化存储详解

    1.1 介绍 在容器中的磁盘文件是短暂的,当容器崩溃时,Kubelet会重新启动容器,但容器运行时产生的数据文件都将会丢失,之后容器会以最干净的状态启动。另外,当一个Pod运行多个容器时,各个容器可能需要共享一些文件,诸如此类的需求都可以使用Volume解决。Pod只需要通

    2024年03月17日
    浏览(11)
  • kubernetes持久化存储卷

    kubernetes持久化存储卷

    pod有生命周期,生命周期结束后 pod 里的数据会消失(如配置文件,业务数据等)。 解决: 我们需要将数据与pod分离,将数据放在专门的存储卷上 pod在k8s集群的节点中是可以调度的, 如果pod挂了被调度到另一个节点,那么数据和pod的联系会中断。 解决: 所以我们需要与集群节点分

    2024年02月15日
    浏览(10)
  • 【kubernetes】持久卷PV、PVC

    目录 PV和PVC之间的相互作用遵循这个生命周期 根据这 5 个阶段,PV 的状态有以下 4 种 一个PV从创建到销毁的具体流程如下 静态PV创建 1、配置nfs存储 2、定义PV 3、定义PVC 4、测试访问 动态PV创建 1、在stor01节点上安装nfs,并配置nfs服务 2、创建 Service Account,用来管理 NFS Provis

    2024年02月13日
    浏览(9)
  • 鸿蒙Harmony-PersistentStorage--持久化存储UI状态储详解

    鸿蒙Harmony-PersistentStorage--持久化存储UI状态储详解

    用简单的心境,对待复杂的人生,方能看淡得失,从容入世,潇洒自如,心变得简单了,世界也就简单了 目录 一,定义 二,限制条件 三,使用 LocalStorage和AppStorage都是运行时的内存,但是在应用退出再次启动后,依然能保存选定的结果,是应用开发中十分常见的现象,这就

    2024年01月18日
    浏览(13)
  • 第18关 K8s数据安全无忧——持久化存储详解

    ------ 课程视频同步分享在今日头条和B站 大家好,我是博哥爱运维,本期课程将深入解析Kubernetes的持久化存储机制,包括PV、PVC、StorageClass等的工作原理、使用场景、最佳实践等,帮您构建稳定可靠的状态存储,确保应用和数据 100% 安全。 Volume 我们这里先来聊聊K8s的存储模型V

    2024年02月05日
    浏览(14)
  • 【Redis】理论进阶篇------Redis的持久化

    【Redis】理论进阶篇------Redis的持久化

         前面学习了Redis的相关的十大数据类型以及用SpringBoot集成我们的Redis的工具代码的书写。从这篇文章开始,就会从Redis相关的一些理论(也是面试和工作的热点知识)如:Redis的持久化、Redis的订阅发布模型、Redis集群环境搭建、哨兵模式等等方面介绍Redis相关的进阶知识

    2024年02月21日
    浏览(8)
  • 【pinia持久化存储】使用pinia和pinia-plugin-persistedstate依赖进行数据的持久化存储

    【pinia持久化存储】使用pinia和pinia-plugin-persistedstate依赖进行数据的持久化存储

    使用pinia和pinia-plugin-persistedstate依赖进行数据的持久化存储。 存储方式 : localStorage sessionStorage pinia-plugin-persistedstate 中文官网 pinia 中文官网 安装和使用 pinia ,请参考使用pinia文章。 安装 pinia-plugin-persistedstate : 使用前先将 pinia-plugin-persistedstate添加到pinia实例上。 在添加的时

    2023年04月17日
    浏览(9)
  • 浅谈Kafka持久化与日志存储

    Apache Kafka是一个分布式流处理平台,用于构建实时数据流管道和流式应用程序。Kafka具有高吞吐量、低延迟、可扩展性和容错性等特点。本文档将介绍Kafka的持久化与日志存储机制,包括Kafka的存储架构、数据压缩和数据清理等;此外还将分析如何在 Kafka 中进行日志监控和维护

    2024年02月03日
    浏览(8)
  • React+Redux 数据存储持久化

    React+Redux 数据存储持久化

    yarn add @reduxjs/toolkit redux react-redux redux-persist 默认已经模块化了reducers,如下图所示 数据持续化存储github redux-persist redux工具 redux RTK redux官网 redux

    2024年02月16日
    浏览(17)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包