当前位置: 首页 > news >正文

【kubernetes】持久化存储 —— PV / PVC

一,理论

概念

PersistentVolume(简称PV)是群集中的一块存储,由管理员配置或使用存储类动态配置。 它是集群中的资源。 PV是容量插件,如Volumes。
其生命周期独立于使用PV的任何单个pod。

PersistentVolumeClaim(简称PVC)是一个持久化存储卷,在创建pod时可以定义这个类型的存储卷。

它类似于一个pod。 Pod消耗节点Node资源,PVC消耗PV资源。

原理

PV是群集中的资源。 PVC是对这些资源的请求。
PV和PVC之间的相互作用遵循以下生命周期:

(1)pv的供应方式

可以通过两种方式配置PV:静态或动态。

静态的:
集群管理员创建了许多PV。它们包含可供群集用户使用的实际存储的详细信息。

动态的:
当管理员创建的静态PV都不匹配用户的PersistentVolumeClaim时,群集可能会尝试为PVC专门动态配置卷。此配置基于StorageClasses,PVC必须请求存储类,管理员必须创建并配置该类,以便进行动态配置。

(2)绑定

用户创建pvc并指定需要的资源和访问模式。在找到可用pv之前,pvc会保持未绑定状态。
pvc和pv它们是一一对应的关系,pv如果被pvc绑定了,就不能被其他pvc使用了。

(3)回收策略

当删除pod时候,pvc和pv绑定就会解除,pv卷里的数据的回收策略persistentVolumeReclaimPolicy有3种处理方式:

保留:Retain

当删除pvc时,pv仍然存在,且处于released状态,但是它不能被其他pvc再次绑定使用,里面的数据还是存在的,当我们下次再使用的时候,数据还是存在的。
此默认的回收策略

删除:Delete

当删除pvc时,即会从Kubernetes中移除PV,也会从相关的外部设施中删除存储资产

回收:Recycle (不推荐使用,1.15可能被废弃了)

(4)使用

a)准备一个存储服务器,把它划分成多个存储空间,并定义成多个pv;
b)先创建pvc,通过定义需要使用的pv的大小和对应的访问模式,找到合适的pv;
c)在定义pod时,就可以使用这个pvc的存储卷;
d)在确保有可以绑定的pv的情况下,再创建pvc。如果没有合适的pv,那么pvc就会被创建,并处于pending状态。

二,应用

本案例以nfs为存储类

1、创建nfs共享目录
# 在宿主机创建NFS需要的共享目录
mkdir /data/volume_test/v{1,2,3,4,5,6,7,8,9,10} -p#配置nfs共享宿主机上的/data/volume_test/v1..v10目录 新增一下配置:
vim /etc/exports
/data/volume_test/v1 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v2 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v3 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v4 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v5 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v6 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v7 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v8 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v9 192.168.40.0/24(rw,no_root_squash)
/data/volume_test/v10 192.168.40.0/24(rw,no_root_squash)#重新加载配置,使配置成效
[root@xianchaomaster1 ~]# exportfs -arv
2、编写pv的常用字段
# 看定义pv需要的字段
# kubectl explain pvapiVersion	  <string>
kind	      <string>
metadata	  <Object>
spec	      <Object># 看定义pv需要的字段
# kubectl explain pv.specaccessModes   <[]string>   
# 访问模式:ReadWriteOnce,ReadOnlyMany,ReadWriteMany,ReadWriteOncePod
persistentVolumeReclaimPolicy   <string>  # 回收模式:Retain,Delete,Recycle
capacity	  <map[string]string>  # 指定容量大小
# capacity:
#   storage: 1Gi# 查看定义nfs类型的pv需要的字段
# kubectl explain pv.spec.nfs
path	      <string> -required-
readOnly	  <boolean>
server	      <string> -required-
3、创建pv

创建3个存储卷。

# vim pv.yamlapiVersion: v1
kind: PersistentVolume
metadata:name: v1labels:                        # 定义pv标签app: v1
spec:nfs:path: /data/volume_test/v1server: 192.168.40.180accessModes: ["ReadWriteOnce"] # 定义访问模式capacity:                      # 定义资源大小storage: 1Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:name: v2labels:app: v2
spec:nfs:path: /data/volume_test/v2server: 192.168.40.180accessModes: ["ReadOnlyMany"]capacity:storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:name: v3labels:app: v3
spec:nfs:path: /data/volume_test/v3server: 192.168.40.180accessModes: ["ReadWriteMany"]capacity:storage: 3Gi
kubectl apply -f pv.yaml persistentvolume/v1 created
persistentvolume/v2 created
persistentvolume/v3 created
kubectl get pv
NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
v1     1Gi        RWO            Retain           Available                                   108s
v2     2Gi        ROX            Retain           Available                                   108s
v3     3Gi        RWX            Retain           Available                                   108s

【注解】
RWO:readwariteonce: 单路读写,允许同一个node节点上的pod访问。
ROX: readonlymany: 多路只读,允许不通node节点的pod以只读方式访问。
RWX: readwritemany: 多路读写,允许不同的node节点的pod以读写方式访问。

4、创建pvc,绑定符合条件的pv

创建3个pvc,访问模式,标签,资源大小均有上面符合的pv,即可!

# cat pvc.yaml apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: pvc-v1
spec:accessModes: ["ReadWriteOnce"]   # 访问模式 一致selector:                        # 筛选pv的标签 一致matchLabels:app: v1resources:                       # 资源大小 一致requests:storage: 1Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: pvc-v2
spec:accessModes: ["ReadOnlyMany"]selector:matchLabels:app: v2resources:requests:storage: 2Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: pvc-v3
spec:accessModes: ["ReadWriteMany"]selector:matchLabels:app: v3resources:requests:storage: 3Gi
kubectl apply -f pvc.yaml persistentvolumeclaim/pvc-v1 created
persistentvolumeclaim/pvc-v2 created
persistentvolumeclaim/pvc-v3 created
kubectl get pvc
NAME     STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc-v1   Bound    v1       1Gi        RWO                           86s
pvc-v2   Bound    v2       2Gi        ROX                           86s
pvc-v3   Bound    v3       3Gi        RWX                           86s

【注解】
STATUS : 状态为Bound 表示与对应pv绑定成功。

5、创建pod [deployment],挂载pvc

照常创建deploy资源,仅仅是volume挂载不同。

# vim pod-pvc.yamlapiVersion: apps/v1
kind: Deployment
metadata:name: pvc-test
spec:replicas: 3selector:matchLabels:cunchu: pvctemplate: metadata:labels:cunchu: pvcspec:containers:- name: test-pvcimage: xianchao/nginx:v1imagePullPolicy: IfNotPresentports:- containerPort: 80protocol: TCPvolumeMounts:                # 挂载- name: nginx-html           # 必须和volumes名字一致mountPath: /usr/share/nginx/htmlvolumes:- persistentVolumeClaim:       # 挂载 pvcclaimName: pvc-v1          # 指定 pvc的名称name: nginx-html             # volumes 名字

在这里插入图片描述

至此,新建的3个pod的目录‘/usr/share/nginx/html’ 与 宿主机的pv1 目录‘/data/volume_test/v1/’ 共享。

6、删除pvc的步骤:
  • 先删除使用pvc的pod
  • 再删除pvc,
  • pv视情况而定,删除与保留。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 打开mdk的configuration wizard界面
  • Qt:玩转QPainter序列九(文本,文本框,填充)
  • SpringBoot Web请求响应
  • 极盾故事|某金融租赁机构应用数据保护新策略:“动态脱敏”“二次授权”
  • Trm理论 2(Word2Vec)
  • 使用AI写WebSocket知识是一种怎么样的体验?
  • 【C++ Qt day5】
  • Docker 安装FileBeat、Elasticsearch及Kibana详细步骤
  • git查看代码提交记录
  • python使用selenium,实现简单爬虫功能
  • 9月4日星期三今日早报简报微语报早读
  • 太阳能光伏异常红外图像数据集
  • CentOS 7 docker 部署遇到内网通,外网不通 问题
  • pytorch pyro更高阶的优化器会使用更高阶的导数,比如二阶导数(Hessian矩阵)
  • HTTP、Session、Token及Cookie详解
  • ES6指北【2】—— 箭头函数
  • #Java异常处理
  • 4. 路由到控制器 - Laravel从零开始教程
  • CSS居中完全指南——构建CSS居中决策树
  • java多线程
  • Java多线程(4):使用线程池执行定时任务
  • java取消线程实例
  • log4j2输出到kafka
  • ng6--错误信息小结(持续更新)
  • PaddlePaddle-GitHub的正确打开姿势
  • PAT A1017 优先队列
  • python大佬养成计划----difflib模块
  • SQLServer之创建数据库快照
  • 工作手记之html2canvas使用概述
  • 聊聊flink的BlobWriter
  • 使用common-codec进行md5加密
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 小而合理的前端理论:rscss和rsjs
  • 写给高年级小学生看的《Bash 指南》
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • AI算硅基生命吗,为什么?
  • Android开发者必备:推荐一款助力开发的开源APP
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (贪心) LeetCode 45. 跳跃游戏 II
  • .net 4.0发布后不能正常显示图片问题
  • .Net Core 中间件与过滤器
  • .NET Framework与.NET Framework SDK有什么不同?
  • .NET 中创建支持集合初始化器的类型