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

news2024/11/17 14:39:40

文章目录

    • 一、PV、PVC持久化存储理论
      • 1、PV、PVC是什么?
      • 2、PV的供应方式
      • 3、PV、PVC的回收策略
    • 二、案例:PV、PVC持久化存储案例演示
      • 1、搭建NFS服务端
      • 2、创建PV,并使用NFS共享存储
      • 3、创建PVC,并和PV绑定
      • 4、创建Pod,并挂载PVC卷
      • 5、删除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/

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ekJ4U0X0-1686473061750)(D:\MD归档文档\IMG\image-20230611135004109.png)]

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qIdR6GdY-1686473061751)(D:\MD归档文档\IMG\image-20230611140856919.png)]

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TQTsbz18-1686473061752)(D:\MD归档文档\IMG\image-20230611151351851.png)]

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NZN6DVxq-1686473061752)(D:\MD归档文档\IMG\image-20230611161521242.png)]

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

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gbyw4p4M-1686473061752)(D:\MD归档文档\IMG\image-20230611161652570.png)]

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/634385.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

docker中运行PostgreSQL容器

我们如何在docker中运行postgresql容器,要进过如下几个步骤就可以了。 拉取postgresql容器 docker pull postgres:latest使用上述命令将从 Docker Hub 存储库中提取最新可用版本的 PostgreSQL。 从 PostgreSQL 服务器 Docker 镜像运行容器 在部署之前,…

2023年6月DAMA-CDGA/CDGP数据治理工程师认证报名特惠

DAMA认证为数据管理专业人士提供职业目标晋升规划,彰显了职业发展里程碑及发展阶梯定义,帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力,促进开展工作实践应用及实际问题解决,形成企业所需的新数字经济下的核心职业…

WinDbg安装入坑3(C#)

由于作者水平有限,如有写得不对的地方,请指正。 使用WinDbg的过程中,坑特别的多,对版本要求比较严格,如: 1 32位应用程序导出的Dump文件要用32位的WinDbg打开,想要没有那么多的问题&#xf…

Xcode 15 beta (15A5160n) - Apple 平台 IDE

Xcode 15 beta (15A5160n) - Apple 平台 IDE IDE for iOS/iPadOS/macOS/watchOS/tvOS/visonOS 请访问原文链接:https://sysin.org/blog/apple-xcode-14/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org Xcode 15 使…

windows系统cmd命令设置别名,并添加到环境变量

众所周知,Linux 命令很强大,使用起来也很方便,但是想在 windows 系统上使用 Linux 命令有些困难,要么下载第三方终端工具,要么就是安装一系列命令环境。 作为一个前端开发,其实可以全局安装一下 npm 命令行…

分库分表-ShardingSphere

分库分表拆常见分方法与特点 分片策略 数据分布 以后扩展 基于Hash:hash(分片键)%分片数 数据分布均匀 不易扩容,扩容需要数据迁移 范围分片:例如按年分,按月,按日 数据分表可能不均匀 易扩展,扩展…

API自动化测试利器Postman,帮助你更好地进行 API 自动化测试

目录 前言: 一、基本功能 二、测试工具 三、示例 前言: Postman 是一个易于使用的 API 开发和测试工具,可以在其中快速构建、测试和文档化 Web API。Postman 提供了一个直观的用户界面,可以轻松地创建 HTTP 请求、测试响应、…

深入解析XMLHttpRequest:实现异步通信的利器

文章目录 介绍什么是XMLHttpRequest?XMLHttpRequest的基本用法1.创建XMLHttpRequest对象2.配置请求3.发送请求 XMLHttpRequest 属性sendreadyStatestatusstatusTextresponseresponseTextresponseTyperesponseURLtimeoutwithCredentials 异步请求与同步请求请求类型和…

淡季,老手买入的季节。

刚在刷抖音,刷到马云的视频。心里在想:这么大的企业家大富豪怎么会哽咽呢?他缺钱吗?他需要为生存奋斗吗? 他当然不缺钱,也不需要为生存去奋斗。如果以家庭生活支出来算,他的钱够几代儿孙挥霍了。…

漂亮国因一颗气球而疯狂给质量团队带来的启示

最近漂亮国因为我国的一颗漂洋过海的淘气的民用气球而疯狂。这颗气球成功躲过了号称全球最先进的防空系统,跨越大半个漂亮国,直到被一居民拍照无意间发现,漂亮国才反应过来。多次派战斗机拦截无果,在气球降到15km后,F2…

数据链路层之以太网协议基本知识总结分享

目录 1. 以太网协议报文格式 2. MTU是什么?它对哪些协议有影响? 1. 以太网协议报文格式 这里的目的地址不是ip地址,是Mac地址,mac地址是6个字节,比ipv4地址大了2个字节,当前的mac地址是可以让每个设备都是唯一的,且不需要动态分配,一般是网卡出厂就分配好了的.这就代表我们…

【他山之石】基于Echarts表格的时间线(轴)组件触发时间变化事件,带多种方案比较

【他山之石】基于Echarts表格的时间线组件触发时间变化事件 1 背景2 调整思路3 函数监听 1 背景 在开发中遇到一个场景:要展示的数据随着时间的变化发生改变,有以下几点要求的的时间线。 水平方向可以切换时间变化,带播放按钮时间节点背景图…

chatgpt赋能python:Python编程:如何删除前面的代码?

Python编程:如何删除前面的代码? 在Python编程中,我们有时会需要删除之前写的一些代码,以便更好地组织我们的代码结构和逻辑。那么,Python中如何删除前面的代码呢?在本文章中,我们将为您详细介…

python字符串格式化通过占位符拼接

我之前写了python字符串拼接 但我们会发现 它不太好用 第一个 当变量很多的时候 会写的很长 第二个 是python中字符串不能直接和其他类型的变量拼接 字符串格式化 也属于是字符串拼接的一种方法 语法上不是使用加号 我们打开编辑器 编写代码如下 weight 8.70; age 2; name…

Nvidia AGX Orin MAX9296 /MAX9295驱动寄存器配置

MAX9295 配置说明 1.Max9295 的功能及应用 MAX9295 是把 MIPI CSI-2 转化成 GMSL2 或者 GMSL1 信号,该信号是可以通过 15m 长的线缆发送或接受控制数据以及传递 video 数据和双向的控制数据。 GMSL2 有固定的速率,正向的速率为 3Gbps 或者 6Gbps &…

SpringBoot整合Flyway实现数据库的初始化和版本管理

文章目录 一、Flyway1、介绍2、业务痛点3、个人理解 二、SpringBoot整合flyway1、整合2、SQL文件命名3、版本号校验算法4、工作流程5、注意事项 一、Flyway 1、介绍 Flyway 是一款开源的数据库版本管理工具。它可以很方便的在命令行中使用,或者在Java应用程序中引入…

win10无法使用浏览器上网问题总结贴(附带解决办法)

现象 电脑连接WIFI之后,可以登录微信但是一直打不开网页,其它软件也无法联网。 解决办法 重启大法 遇到这种问题通常最简单有效的办法就是,重启电脑,然而在我重启完成之后还是这样无法使用浏览器上网疑难解答 使用win10的疑难解…

【EraAI智能写作助手】一键生成精准文案,让创作更高效

一键生成精准文案,让创作更高效! 传送门【EraAI智能助手】: txt.eraai.cn 亲爱的文案创作者和营销人员,您是否常常为文案创作而烦恼?现在,有了EraAI智能助手,让您的创作事半功倍!我…

Qt详解实现TCP文件传输例子(文件下载和上传)附源码

网络通信我们用的很频繁,如文字,语音,文件,图片等,这个些传输方式都差不多 QT文件传输主要考验对传输的控制,还是需要点逻辑的,文件传输的大致框架如下 先看一下简单例子实现的效果&#xff08…

【Python】使用pdf2docx库将.pdf转化为.docx

1、使用VS code搭建Python编译环境 2、安装pdf2doc库1 pip install pdf2docx3、编写代码 3.1 使用parse将pdf转化为docx 编写 pdf2docxParse.py from pdf2docx import parse # 文件名 pdf_file demo-image-overlap.pdf docx_file demo-image-overlap.docx# 将pdf转为doc…