k8s的存储卷、数据卷

容器内的目录和宿主机目录进行挂载。

容器在系统上的生命周期是短暂的。

k8s用控制器创建的pod。delete相当于重启。容器的状态也会恢复到初始状态。一旦恢复到初始状态,所有的后天编辑的文件都会消失

容器和节点之间创建一个可以持久化保存容器内文件的存储卷。即使容器被摧毁、删除、重启,节点上存储卷的数据依旧存在。后续也可以继续使用。可以继续讲容器内的目录和宿主机挂载。保存的数据可以继续使用。

存储卷的方式

  1. emptyDir:

  2. hostPath:

  3. NFS:

emptyDir

emptyDir:容器内部共享存储卷。在k8s中表示一个pod当中的多个容器共享一个存储卷目录。

emptyDir卷可以使pod当中的容器在这个存储卷上读取和写入。

emptyDir不能挂载到节点。随着pod生命周期结束。emptyDir也会结束。数据不会保留

主要用于容器内部共享数据

实验举例:

apiVersion: apps/v1
kind: Deployment
metadata:labels:app: nginx1name: nginx1
spec:replicas: 3selector:matchLabels:app: nginx1template:metadata:labels:app: nginx1spec:containers:- image: nginx:1.22name: nginx1volumeMounts:
#开始创建挂载卷- name: html
#定义存储卷的名称mountPath: /usr/share/nginx/html
#mountPath:定义容器内的挂载点。或者其他容器的共享目录- image: nginx:1.22name: nginx2volumeMounts:- name: html
#需要和上面定义的名称保持一致mountPath: /data
#引用上一个挂载的名称。
#表示我将使用/data目录和/usr/share/nginx/html这个目录挂载command: ["/bin/bash", "-c", "while true; do echo $(data) >> /data/index.html; sleep 2; done"]volumes:- name: htmlemptyDir: {}

 

hostPath

hostPath:将容器内的挂载点和节点上的目录进行挂载。hostPath可以实现数据持久。node节点被销毁,那么数据也会丢失。

污点设置为NoExecute时节点上的pod会被驱逐。文件数据在不在?

文件数据肯定在的。只是pod节点被销毁了。并不是node节点被销毁。所有数据还保留在节点上。

只有基于控制器创建的pod会在其他节点重新部署。他又会在其他节点生成一个新的存储卷。数据依然可以持久化。

驱逐不会使文件数据丢失

实验举例:

apiVersion: apps/v1
kind: Deployment
metadata:labels:app: nginx1name: nginx1
spec:replicas: 3selector:matchLabels:app: nginx1template:metadata:labels:app: nginx1spec:containers:- image: nginx:1.22name: nginx1volumeMounts:
#开始创建挂载卷- name: html
#定义存储卷的名称mountPath: /usr/share/nginx/html
#mountPath:定义容器内的挂载点。或者其他容器的共享目录- image: nginx:1.22name: nginx2volumeMounts:- name: html
#需要和上面定义的名称保持一致mountPath: /data
#引用上一个挂载的名称。
#表示我将使用/data目录和/usr/share/nginx/html这个目录挂载command: ["/bin/bash", "-c", "while true; do echo $(date) >> /data/index.html; sleep 2; done"]volumes:- name: htmlhostPath:path: /opt/testtype: DirectoryOrCreate
#如果节点上没有这个目录则帮你创建这个目录

实现nginx1、nginx2、节点是平级关系实现三方同步

相同pod不同容器的信息

kubectl exec -it pod名称 -c 容器名称 bash
#进入相同pod中的不同容器
kubectl logs pod名称 -c 容器名称
#查看相同pod中的不同容器的日志

nfs共享存储

所有pod内的目录都和节点上的nfs共享目录形成数据卷。所有的数据文件都保存在共享目录当中。集中方便管理

nfs共享的工作流程图:

创建nfs共享目录

mkdir /data/volumes
chmod 777 /data/volumes
vim /etc/exports
/data/volumes 20.0.0.0/24(rw,no_root_squash)
#rw,no_root_squash:给客户机访问本地提供本地root权限

实验举例:

apiVersion: apps/v1
kind: Deployment
metadata:labels:app: nginx1name: nginx1
spec:replicas: 3selector:matchLabels:app: nginx1template:metadata:labels:app: nginx1spec:containers:- image: nginx:1.22name: nginx1volumeMounts:
#开始创建挂载卷- name: html
#定义存储卷的名称mountPath: /usr/share/nginx/html
#mountPath:定义容器内的挂载点。或者其他容器的共享目录- image: nginx:1.22name: nginx2volumeMounts:- name: html
#需要和上面定义的名称保持一致mountPath: /data
#引用上一个挂载的名称。
#表示我将使用/data目录和/usr/share/nginx/html这个目录挂载command: ["/bin/bash", "-c", "while true; do echo $(date) >> /data/index.html; sleep 2; done"]volumes:- name: htmlnfs:path: /data/volumes
#表示将容器和节点目录进行挂载server: 20.0.0.35
#这里可以使用IP地址也可以使用主机名来替代。但是需要做主机名映射

基于yaml文件删除:

kubectl delete -f 文件名称.yaml
#如果是基于这个yaml文件创建的pod。可以使用这种方式删除deployment。

工作中最常见的是hostPath和NFS。推荐使用NFS

PVC和PV

PV:全程Persistent Volume 持久化存储卷。用来描述和定义一个存储卷。

PV是由运维人员来定的。

PVC:全程Persistent Volume Claim 是存储化存储的请求。

PVC是用来描述或者声明我希望使用什么样的PV来进行存储。

PVC和PV是一一对应的关系(描述、存储)

描述:期望的PV的类型是什么

存储:PV存储的大小是什么

PVC请求PV到NFS

PVC发起请求

PV是满足请求的存储卷

在k8s中PVC和PV都是虚拟化的概念。是一种虚拟存储资源。

PVC和PV的结构图:

PVC提供读写方式、存储空间等等。

PV的虚拟存储会通过NFS共享存储的方式挂载到提供共享目录的服务器

PVC发起请求的读写方式会和PV保持一致。

PVC会匹配最完整、最优路径。如果pv3被占用了,则会选择pv4。

PV和PVC静态请求的工作流程:

1、 pod内设定声明一个PVC请求。

2、 PVC请求会找一个最合适的PV来作为pod的存储卷。

3、 PV和共享目录在一一映射。

4、 最终由NFS共享目录来提供实际物理上的共享存储空间。

PV是集群当中的存储资源。PVC请求存储资源。也是对存储资源的一个检索(检查索引),选择一个最合适的PV来存储资源。

PV和PVC的生命周期管理:

  1. Provisioning(配置)配置两种方式选择动态还是静态PVC

  2. PVC请求request

  3. 检索。找一个合适的PV

  4. PVC和PV会binding(绑定):就是将PV分配给PVC

  5. 然后开始使用:就是pod通过PVC使用存储资源NFS

删除pod时:

  1. pod被删除

  2. PV会releasing(释放):pod解除和volume共享挂载卷的关系,删除PVC

  3. 最后recycling(回收资源):保留PV。保证下一个PVC也可以使用。

PV的状态

  1. Available:可用,没有被任何PVC绑定。

  2. Bound:绑定,PV已经绑定了PVC,绑定即使用。

  3. released:PVC已经被删除了,但是PV的存储资源还没有被集群回收

  4. Failed:表示PV的资源回收失败。而且PV不可用状态。

PVC支持的读写方式

ReadWriteOnce:简称RWO。配置文件中是全称。表示存储PV可读可写。但是只能被单个pod挂载

ReadOnlyMany:简称ROX。在配置文件中是全称。表示存储PV可用以只读的方式被多个pod挂载。

ReadWriteMany: 简称RWX。在配置文件中是全称。表示存储可以支持读写的方式被多个pod共享。

NFS:可以支持三种读写和挂载方式

hostPath:只支持ReadWriteOnce方式

SCSI:

ISCSI:不支持ReadWriteMany

环境检擦

lsscsi
#查看当前设备上的SCSI设备
iscsiadm -m session -P 3
#查看服务器是否有iscsi设备
#-m session:指定操作的会话模块,管理iscsi的会话
#-P 3:显示详细信息的级别。级别是3.显示详细信息。

集群回收PV资源的方式

  1. Retain:表示保留。pod和挂载点的数据不会被删除。默认方式。

  2. Recycle:表示回收。PV上的数据将会被删除。挂载点的数据也会被删除。

  3. Delete:表示删除。解绑时自动删除PV上的数据。本地硬盘不能使用只有云平台可以使用(AWS/EBS/GCE)。支持动态卷可用。PV不再使用(云平台自己处理)

当pod运行之后通过PVC请求到PV之后,除非pod被销毁,否则无法删除PVC

PVC和PV静态实验举例:

master01:20.0.0.32
node01:20.0.0.34
node02:20.0.0.35
k8s4主机:20.0.0.36k8s5主机:
mkdir v{1,2,3,4,5}
vim /etc/exports
/data/v1 20.0.0.0/24(rw,no_root_squash)
/data/v2 20.0.0.0/24(rw,no_root_squash)
/data/v3 20.0.0.0/24(rw,no_root_squash)
/data/v4 20.0.0.0/24(rw,no_root_squash)
/data/v5 20.0.0.0/24(rw,no_root_squash)
exportfs -arv
#发布出去
showmount -e
#在每个节点上查看到master01主节点上创建PV.yaml文件
vim pv.yaml
apiVersion: v1
kind: PersistentVolume
#PersistentVolume就是PV但是yaml文件中要用全称
metadata:name: pv001labels:name: pv001
spec:
#设定pv的参数nfs:path: /data/v1
#定义pv的挂载位置server: 20.0.0.36
#声明pv来自哪个IP地址accessModes: ["ReadWriteMany", "ReadWriteOnce"]
#ReadWriteMany表示支持多个pod挂载
#ReadWriteOnly表示只支持单个pod挂载
#支持多种挂载方式capacity:storage: 1Gi
#定义pv的大小---
apiVersion: v1
kind: PersistentVolume
metadata:name: pv002labels:name: pv002
spec:nfs:path: /data/v2server: 20.0.0.36accessModes: ["ReadWriteOnce"]capacity:storage: 2Gi---
apiVersion: v1
kind: PersistentVolume
metadata:name: pv003labels:name: pv003
spec:nfs:path: /data/v3server: 20.0.0.36accessModes: ["ReadWriteMany", "ReadWriteOnce"]capacity:storage: 2Gi---
apiVersion: v1
kind: PersistentVolume
metadata:name: pv004labels:name: pv004
spec:nfs:path: /data/v4server: 20.0.0.36accessModes: ["ReadWriteMany", "ReadWriteOnce"]capacity:storage: 4Gi---
apiVersion: v1
kind: PersistentVolume
metadata:name: pv005labels:name: pv005
spec:nfs:path: /data/v5server: 20.0.0.36accessModes: ["ReadWriteMany", "ReadWriteOnce", "ReadOnlyMany"]capacity:storage: 5Gikubectl apply -f pv.yaml
#创建PV
kubectl get pv
#查看PV状态定义一个请求向PV发起请求
vim pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
#定义这是PVC请求类型
metadata:name: mypvc
spec:
#定义参数accessModes: ["ReadWriteMany"]
#这里表示PVC期望请求的PV的读写挂载类型是什么。我希望能和PV请求到的是ReadWriteMany模式resources:requests:storage: 2Gi
#PVC期望请求PV的存储大小是2Gi
#期望的PV的读写权限模式是ReadWriteMany,并且存储大小最好是2Gi。
#最好是2G。只能比2G不能比2G小---
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: nginx2name: nginx2
spec:replicas: 3selector:matchLabels:app: nginx2template:metadata:labels:app: nginx2spec:containers:- image: nginx:1.22name: nginx2volumeMounts:- name: htmlmountPath: /usr/share/nginx/htmlvolumes:- name: htmlpersistentVolumeClaim:claimName: mypvc
#定义pvc的名称.由mypc获取PVkubectl get pv
#查看PV状态
表示请求成功到k8s
kubectl get pv
cd v3
echo 123 > index.html回到master01主机
kubectl get pod -o wide
curl nginx副本IP测试

 

PVC发起请求选择使用哪个PV的存储

PV通过挂载的方式和物理存储做映射

最终由物理设备提供存储卷

资源回收的方式实验举例:

保留策略:
kubectl delete pvc mypvc
#pod还存在无法删除PVCkubectl delete deployment nginx
#删除pod后再删除PVC即可出现released表示回收完毕
回到k8s5主机查看共享文件是否存在kubectl edit pv pv003
把claimRef字段的内容全部删除保存推测出即可
kubectl get pv---
回收策略:回到pv.yaml添加回收策略
apiVersion: v1
kind: PersistentVolume
metadata:name: pv003labels:name: pv003
spec:nfs:path: /data/v3server: 20.0.0.36accessModes: ["ReadWriteMany", "ReadWriteOnce"]persistenVolumeReclaimPolicy: Recyclecapacity:storage: 2Gikubectl apply -f pv.yaml
kubectl get pv到k8s5
echo 123 > index.html回到master01
开始删除
kubectl delete deployment nginx
kubectl delete pvc mypvc
#先删除相关联的pod再删除pvc
kubectl get pv
一段时间之后会自动变成正常状态
再回到k8s5查看资源是否被回收---
delete策略:
delete只能在云平台且支持动态卷。本地硬盘并不支持。只能使用无法删除
回到pv.yaml添加回收策略
apiVersion: v1
kind: PersistentVolume
metadata:name: pv003labels:name: pv003
spec:nfs:path: /data/v3server: 20.0.0.36accessModes: ["ReadWriteMany", "ReadWriteOnce"]persistenVolumeReclaimPolicy: Deletecapacity:storage: 2Gikubectl apply -f pv.yaml
kubectl get pv回到k8s5
echo 123 > index.html回到master01
开始删除
kubectl delete deployment nginx
kubectl delete pvc mypvc
#先删除相关联的pod再删除pvc
kubectl get pv
这时会变为Failled状态
kubectl edit pv pv003
把claimRef字段的内容全部删除保存推测出即可
kubectl get pv
PV状态恢复正常
实验完成!!!

总结

k8s中存储卷的模式:

  1. emptyDir:容器内存储卷,锁着pod被销毁,他也会被销毁。数据不保留

  2. hostPath:节点目录的存储卷,可用实现持久化存储。数据在每个节点上都有。不方便集中管理

  3. nfs:共享目录存储卷。既可以实现持久化也可也实现数据集中在一个目录。这样方便管理。

PV和PVC:

  1. PVC是一种请求。请求的是PV的存储资源。PV通过挂载的方式与硬盘空间共享资源

  2. NFS支持PVC的所有挂载方式和读写模式

  3. hostPath只支持ReadWriteOnce模式

  4. PVC是以检索的方式找到匹配的PV资源

检索挂载方式和读写模式

检索PV能提供的存储资源的大小

谁合适选谁

资源回收的三种方式:

  1. 保留:默认可用不写

  2. 回收:自动回收,节点上的数据会被删除

  3. 删除:PV会变成failed模式。此时是不可用状态。数据也会被删除。

PVC和PV之间静态请求。一旦成百个PVC负载能力将会下降,这就需要使用动态PVC

静态比较麻烦。动态PVC实现自动的匹配PV资源

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一氧化碳中毒悲剧频发:探究道合顺电化学传感器促进家庭取暖安全

1月6日,陕西省榆林市发生了一起疑似因使用煤炭炉取暖中毒事件。通报称,经公安部门现场调查,并结合医院救治情况,初步判断5人属一氧化碳中毒,其中4人抢救无效死亡,令人痛心。 一般来说,这种在日…

React入门 - 04(从编写一个简单的 TodoList 说起)

继上一节我们已经对 React组件和 ”JSX语法“有了大概的了解,这一节我们继续在 react-demo这个工程里编写代码。这一节我们来简单实现一个 TodoList来更加了解编写组件的一些细节。 1、在编辑器中打开 react-demo这个工程 2、打开 index.js文件,将组件 …

mysql复制表的几种常用方法

遇到需要拷贝一个表及其数据的情况,总结了一下几种方法 1.使用 show create table 旧表 将结果拷贝出来,将旧表名换成新表名即可. 注意:该方法仅适用于拷贝表结构,不需要同步数据的情况 show create table 旧表名2.create table 新表 like 旧表 该语句将完全拷贝旧表结构, …

LeetCode讲解篇之216. 组合总和 III

文章目录 题目描述题解思路题解代码 题目描述 题解思路 使用递归回溯算法,当选择数字num后,在去选择大于num的合法数字,计算过程中的数字和,直到选择了k次,如果数组和等于n则加入结果集 从1开始选择数字,直…

【uview2.0】Keyboard 键盘 与 CodeInput 验证码输入 结合使用 uview

https://www.uviewui.com/components/codeInput.html &#xff08;CodeInput 验证码输入&#xff09; https://www.uviewui.com/components/keyboard.html &#xff08;Keyboard 键盘&#xff09; <u-keyboard mode"number" :dotDisabled"true" :show&q…

世微AP630X地摊灯 手电筒方案 可充电多功能LED灯

1,信息来源&#xff1a;深圳市世微半导体有限公司 Augus 2,产品的特性有&#xff1a; 全集成单芯片控制 5 照明循环模式可选 0.5A/1A 固定充电电流可选 内置 MOS 1.8A 驱动电流 可外置 MOS 驱动更大电流 充电指示/低电提示/短路提示 3A 手电筒过流保护? 预设 4.22V 电…

RV1126边缘计算AI盒子,支持4-6路1080p视频,2T 算力

1 产品概述 信迈推出基于瑞芯微Rockchip RV1126架构的AI边缘计算主板&#xff0c;RV1126芯片是四核ARM Cortex-A7,1.5GHz&#xff0c; RSIC-V 200MHz CPU &#xff0c;NPU2.0Tops。AI边缘计算主板外围接口丰富&#xff0c;拥有超强扩展性&#xff0c;可广泛应用在智慧安防、工…

centos7下升级openssh9.4p1及openssl1.1.1v版本

背景&#xff1a;客户服务器扫描出一些漏洞&#xff0c;发现和版本有关&#xff0c;漏洞最高的版本是9.3p2&#xff0c;所以我们安装一个openssh9.4p1版本及openssl1.1.1v版本 虽然我们进行了镜像备份&#xff0c;为了安全先安装telnet以防止升级失败无法通过ssh连接服务器 一…

数学建模day15-时间序列分析

时间序列也称动态序列&#xff0c;是指将某种现象的指标数值按照时间顺序排列而成的数值序列。时间序列分析大致可分成三大部分&#xff0c;分别是描述过去、分析规律和预测未来&#xff0c;本讲将主要介绍时间序列分析中常用的三种模型&#xff1a;季节分解、指数平滑方法和AR…

第 5 章 栈

文章目录 5.1 栈的一个实际需求5.2 栈的介绍5.3 栈的应用场景5.4 栈的快速入门5.5 栈实现综合计算器(中缀表达式)5.6 逆波兰计算器5.7 中缀表达式转换为后缀表达式5.7.1 具体步骤如下5.7.2 举例说明5.7.3 代码实现中缀表达式转为后缀表达式 5.8 逆波兰计算器完整版5.8.1 完整版…

vue3 img图片怎么渲染

在 Vue3 中加载图片&#xff08;img&#xff09;src地址时&#xff0c;出现无法加载问题。网上很多都建议使用 require 加载相对路径&#xff0c;如下&#xff1a; <img :src"require(../assets/img/icon.jpg)"/>但是按照这种方式加载又会报错如下&#xff1a;…

设计模式之空对象模式

目录 1.简介 2.结构图 3.实例 4.优缺点 1.简介 空对象模式也是我们平时编程用的比较多的一种行为型设计模式&#xff0c;它的宗旨在解决空对象引起的异常报错问题&#xff1b;在空对象模式&#xff08;Null Object Pattern&#xff09;中&#xff0c;一个空对象取代 Null 对…

【数据库】聊聊MVCC机制与BufferPool缓存机制

上一篇文章&#xff0c;介绍了隔离级别&#xff0c;MySQL默认是使用可重复读&#xff0c;但是在可重复读的级别下&#xff0c;可能会出现幻读&#xff0c;也就是读取到另一个session添加的数据&#xff0c;那么除了配合使用间隙锁的方式&#xff0c;还使用了MVCC机制解决&#…

企业级大数据安全架构(三)修改集群节点hostname

作者&#xff1a;楼高 在后续安装FreeIPA的过程中&#xff0c;要求机器名必须包含完整的域名信息。如果之前在Ambari集群节点上的机器名不符合这个要求&#xff0c;可以按照以下步骤在Ambari上修改所有节点的机器名&#xff1a; 1.部署节点说明 本次测试是三台 ambari 节点&…

迅为RK3568开发板Android11/12/Linux编译驱动到内核

在平时的驱动开发中&#xff0c;经常需要在内核中配置某种功能&#xff0c;为了方便大家开发和学习&#xff0c;本小 节讲解如何在内核中添加驱动。具体的讲解原理讲解请参考本手册的驱动教程。 Android11 源码如果想要修改内核&#xff0c;可以运行以下命令进行修改: cd ke…

reactNative0.71版本的使用

开发环境配置 参考reactNative 官网 版本选中0.71 打包配置 1. IOS 打开项目 -> 进入ios目录->执行命令 pod install ->项目名称.xcworkspace -> 使用xcode打开->配置证书 证书配置截图如下 &#x1f4a1;tips&#xff1a;TARGETS目录下会有多个文件&#x…

计算机图形学流体模拟 blender 渲染脚本

做流体模拟的时候&#xff0c;想要复现别人的成果&#xff0c;但是别人的代码都是每帧输出 ply 格式的文件&#xff0c;渲染部分需要自己完成 看了一下&#xff0c;似乎用 blender 是最简单的&#xff0c;于是记录一下过程中用到的代码 Blender 版本 4.0 批量导入 ply 假设…

Hyperledger Fabric 通道配置文件解析

fabric 版本 v2.4.1 Fabric 网络是分布式系统&#xff0c;采用通道配置&#xff08;Channel Configuration&#xff09;来定义共享账本的各项行为。通道配置的管理对于网络功能至关重要。 通道配置一般包括通道全局配置、排序配置和应用配置等多个层级&#xff0c;这些配置都存…

在生产环境中使用uWSGI来运行Flask应用

安装uwsgi pip install uwsgi -i https://pypi.tuna.tsinghua.edu.cn/simple安装不上则使用以下命令&#xff1a; conda install -c conda-forge uwsgi 当您成功安装uwsgi后&#xff0c;您可以通过以下步骤来测试uwsgi是否安装成功&#xff1a; 创建一个Python脚本&#xff…

Oracle11.2.0.4从RMAN备份中快速恢复单个表的方法

文章目录 前言一、查询所要恢复的表所涉及的表空间二、创建用于恢复的数据库三、恢复步骤1.恢复控制文件2.修改redo日志名称3.表空间恢复4.表空间recover5.查询数据 前言 由于用户误操作导致某表中的数据错乱&#xff0c;导致业务不能正常使用&#xff0c;现需要将该表恢复到一…