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

K8S存储卷和数据卷

目录

三种存储方式

 查看同一容器不同副本的log

 emptyDir

​编辑 hostPath

 NFS共享存储

PVC和PV

 Pv和pvc之间是有生命周期管理的

Pv的状态有四种

支持的读写方式有几种

回收策略

资源回收


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

容器在系统上的生命周期是短暂的,delete,k8s用控制器创建的pod,delete相当于重启,容器的状态也会恢复到初始状态,一旦回到初始状态,所有的后天编辑的文件都会消失

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

三种存储方式

emptyDir

作用:

容器内部共享存储卷,k8s系统中,是一个pod当中的多个容器共享一个存储卷目录emptyDir卷可以是pod当中容器在这个存储卷上读取和写入

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

所以emptyDir就是用来容器内部的共享,lnmp

hostPath

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

面试题:污点设置为NoExecute:节点上的pod会被驱逐,文件数据在不在?

1.Pod被驱逐,并不是node节点被销毁,所有数据还保留在节点上

2.Pod被驱逐(基于控制器创建的)会在其他节点部署,并且会在其他节点上生成一个新的存储卷,数据依然可以持久化

3.EmptyDir的共享数据,会丢失

NFS共享存储

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

 查看同一容器不同副本的log

[root@master01 k8s.yaml]# kubectl logs nginx-c85454d4d-4m6p2 -c nginx1
[root@master01 k8s.yaml]# kubectl logs nginx-c85454d4d-4m6p2 -c nginx2

 emptyDir

apiVersion: apps/v1
kind: Deployment
metadata:name: nginxlabels:app: nginx
spec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- image: nginx:1.22name: nginx1volumeMounts:- name: htmlmountPath: /usr/share/nginx/html/
#第一个name,存储的名称,可以自定义,mountpath,定义容器内的挂载目录点,和节点或者##其他容器的共享目录- image: nginx:1.22name: nginx2volumeMounts:- name: htmlmountPath: /data/
#引用上一个挂载的名称,表示我将和、usr/share/nginx/html这个目录挂载,由data目录和他挂载command: ["/bin/bash","-c", "while true; do echo $(date) >> /data/index.html; sleep 2; done"]
#每隔两秒打印一下当前时间volumes:- name: htmlemptyDir: {}

 hostPath

apiVersion: apps/v1
kind: Deployment
metadata:name: nginxlabels:app: nginx
spec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- image: nginx:1.22name: nginx1volumeMounts:- name: htmlmountPath: /usr/share/nginx/html
#第一个name,存储的名称,可以自定义,mountpath,定义容器内的挂载目录点,和节点或者##其>他容器的共享目录- image: nginx:1.22name: nginx2volumeMounts:- name: htmlmountPath: /data
#引用上一个挂载的名称,表示我将和、usr/share/nginx/html这个目录挂载,由data目录和他挂载command: ["/bin/bash","-c", "while true; do echo $(date) >> /data/index.html; sleep 2; done"]volumes:- name: htmlhostPath:path: /opt/test1type: DirectoryOrCreate
#如果没有/opt/test1就直接创建
# /usr/share/nginx/html, /data ,/opt/test1 ,三者是一体的,在节点上的目录里创建或者修改文件都会改变容器内的文件,不同节点上除了index.html是一样的,其他不一样

 

 NFS共享存储

[root@k8s4 ~]# vim /etc/exports
/data/volumes 192.168.233.0/24(rw,no_root_squash)
[root@k8s4 ~]# cd /data/
[root@k8s4 data]# mkdir volumes
[root@k8s4 data]# chmod 777 volumes
[root@k8s4 data]# systemctl restart rpcbind
Job for rpcbind.service failed because the control process exited with error code. See
#报错之后的操作
[root@k8s4 data]# netstat -antp | grep rpcbind
[root@k8s4 sbin]# kill -9 5513
[root@k8s4 sbin]# systemctl restart rpcbind
[root@k8s4 sbin]# systemctl restart nfs
[root@k8s4 sbin]# showmount -e
Export list for k8s4:
/data/volumes 192.168.233.0/24
#到master01操作
[root@master01 k8s.yaml]# showmount -e 192.168.233.84
Export list for 192.168.233.84:
/data/volumes 192.168.233.0/24
[root@master01 k8s.yaml]# vim e.yamlapiVersion: apps/v1
kind: Deployment
metadata:name: nginxlabels:app: nginx
spec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- image: nginx:1.22name: nginx1volumeMounts:- name: htmlmountPath: /usr/share/nginx/html
#第一个name,存储的名称,可以自定义,mountpath,定义容器内的挂载目录点,和节点或者##其>他容器的共享目录- image: nginx:1.22name: nginx2volumeMounts:- name: htmlmountPath: /data
#引用上一个挂载的名称,表示我将和、usr/share/nginx/html这个目录挂载,由data目录和他挂载command: ["/bin/bash","-c", "while true; do echo $(date) >> /data/index.html; sleep 2; done"]volumes:- name: htmlnfs:path: /data/volumesserver: 192.168.233.84
#这里的server可以是ip地址也可以用主机名来替代 如k8s ,主机名要到/etc/hosts做映射,所有的节点都必须>要做

删除 kubectl delete -f test1.yaml 
删除掉基于test1.yaml创建的pod,yaml文件不会被删除

PVC和PV

Pv

全称Persistent Volume

持久化存储卷,描述和定义一个存储卷,pv是由运维人员来定的

Pvc

persistent Volume Claim

持久化存储的请求,pvc ---pv ---?NFS,pvc实际上是用来描述或者声明我希望使用什么样的pv来进行存储

Pvc-pv是一一对应的关系(描述,比如希望存储的(大小,名字))

Pvc和pv都是u你话的概念,是k8s的抽象的虚拟的存储资源

Pvc和pv之间静态请求,一旦成百个pvc怎么办,所以还有动态pvc

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

 Pv和pvc之间是有生命周期管理的

Provisioning(配置)---pvc请求request---检索(找一个合适的pv)----pvc和pv(binding绑定)----使用---pod被删除---pv的资源releasing(释放)----recycling(回收)

配置:静态,动态

绑定:就是把pv分配给pvc

使用:就是pod通过pvc使用存储资源

释放:pod接触和挂载卷volume的关系,删除pvc

回收:保留pv,以供下一个pvc使用

Pv的状态有四种

Available

可用,而且没有被任何pvc绑定

Bound

绑定,pv已经绑定了pvc,绑定即使用

Released

释放,pvc已经被删除了,但是pv的存储资源还没有被集群回收

Failed

表示pv的回收失败,而且pv为不可用状态

支持的读写方式有几种

ReadWriteOnce

简写是RWO,配置文件里面要写全称,表示存储pv可读可写,但是只能被单个pod挂载

ReadOnlyMany

ROX,存储的pv可以以只读的方式被多个pod挂载

ReadWriteMany

RWX,存储可以支持读写的方式被多个pod共享

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

HostPath:只支持ROX方式

有个特殊的地方我们一般用的scsi,iscsi不支持ROX方式

回收策略

                                      集群回收pv资源的方式有三种

Retain

默认策略,保留,pod和挂载点的数据不会被删除

Recycle

回收,pv上的数据会被删除,挂载点的数据也被删除

Delete

删除,解绑时会自动删除pv上的数据,本地卷硬板不能使用,AWS,EBS,GCE,支持动态卷的可以使用,pv不再可用(云平台自己处理)

补充:当pod运行之后,通过pvc请求到了pv,除非pod被销毁,否则无法删除pvc

Pvc---请求用哪个pv的存储---pv和物理存储做映射(挂载)---物理设备提供存储卷

[root@master01 ~]# iscsiadm -m session -P 3
iscsiadm: No active sessions.#检查环境
#Iscsiadm:查看服务器是否有iscsi设备
#-m session:表示指定操作的会话模块,管理iscsi的会话
#-P 3:显示详细信息的级别,级别就是3,显示详细信息
[root@k8s4 data]# vim /etc/exports
/data/volumes 192.168.233.0/24(rw,no_root_squash)
/data/v1 192.168.233.0/24(rw,no_root_squash)
/data/v2 192.168.233.0/24(rw,no_root_squash)
/data/v3 192.168.233.0/24(rw,no_root_squash)
/data/v4 192.168.233.0/24(rw,no_root_squash)
/data/v5 192.168.233.0/24(rw,no_root_squash)
[root@k8s4 data]# mkdir v{1..5}
[root@k8s4 data]# netstat -antp | grep rpcbind
[root@k8s4 data]# systemctl restart rpcbind
[root@k8s4 data]# systemctl restart nfs
[root@k8s4 data]# showmount -e
[root@k8s4 data]# exportfs -arv
[root@master01 ~]# showmount -e 192.168.233.84[root@master01 k8s.yaml]# vim pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:name: pv001labels:name: pv001
spec:nfs:path: /data/v1server: 192.168.233.84accessModes: ["ReadWriteMany","ReadWriteOnce"]capacity:storage: 1Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:name: pv002labels:name: pv002
spec:nfs:path: /data/v2server: 192.168.233.84accessModes: ["ReadWriteOnce"]capacity:storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:name: pv003labels:name: pv003
spec:nfs:path: /data/v3server: 192.168.233.84accessModes: ["ReadWriteMany","ReadWriteOnce"]capacity:storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:name: pv004labels:name: pv004
spec:nfs:path: /data/v4server: 192.168.233.84accessModes: ["ReadWriteMany","ReadWriteOnce"]capacity:storage: 4Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:name: pv005labels:name: pv005
spec:nfs:path: /data/v5server: 192.168.233.84accessModes: ["ReadWriteMany","ReadWriteOnce","ReadOnlyMany"]capacity:storage: 5Gi[root@master01 k8s.yaml]# vim pvc.yamlapiVersion: v1
kind: PersistentVolumeClaim
metadata:name: mypvc
spec:accessModes: ["ReadWriteMany"]
#pvc期望请求的pv的读写挂载类型是什么resources:requests:storage: 2Gi
#pvc期望请求pv的存储大小是2G,期望的pv类型是readwritemany,大小2g,优先等于2g再大于,不能小于
---
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: nginxname: nginx
spec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- image: nginx:1.22name: nginx1volumeMounts:- name: htmlmountPath: /usr/share/nginx/htmlvolumes:- name: htmlpersistentVolumeClaim:claimName: mypvc
#定义pvc的名称.由mypc获取PV[root@master01 k8s.yaml]# kubectl get pv
#查看PV状态
[root@k8s4 data]# cd v3/
[root@k8s4 v3]# ls
[root@k8s4 v3]# echo 123 > index.html
[root@k8s4 v3]# ls
index.html
[root@k8s4 v3]# cat index.html
123
[root@master01 k8s.yaml]# kubectl get pv
NAME            CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM                    STORAGECLASS   REASON   AGE
nginx-html-pv   1Gi        RWO            Retain           Bound       default/nginx-html-pvc                           2d12h
pv001           1Gi        RWO,RWX        Retain           Available                                                    34m
pv002           2Gi        RWO            Retain           Available                                                    34m
pv003           2Gi        RWO,RWX        Retain           Bound       default/mypvc                                    34m
pv004           4Gi        RWO,RWX        Retain           Available                                                    34m
pv005           5Gi        RWO,ROX,RWX    Retain           Available                                                    34m
[root@master01 k8s.yaml]# kubectl get pod -o wide
NAME                     READY   STATUS    RESTARTS   AGE     IP            NODE       NOMINATED NODE   READINESS GATES
nginx-796bbddb88-8bj4q   1/1     Running   0          3m14s   10.244.1.71   node01     <none>           <none>
nginx-796bbddb88-csp5d   1/1     Running   0          3m13s   10.244.0.53   master01   <none>           <none>
nginx-796bbddb88-q9bbk   1/1     Running   0          10m     10.244.2.68   node02     <none>           <none>
[root@master01 k8s.yaml]# curl 10.244.1.71
123
[root@master01 k8s.yaml]# curl 10.244.0.53
123
[root@master01 k8s.yaml]# curl 10.244.2.68
123#PVC发起请求选择使用哪个PV的存储,PV通过挂载的方式和物理存储做映射,最终由物理设备提供存储卷

资源回收

[root@master01 k8s.yaml]# kubectl get pv
[root@master01 k8s.yaml]# kubectl delete deployments.apps nginx
要先删除pod再删除pvc
[root@master01 k8s.yaml]# kubectl delete pvc mypvc
[root@master01 k8s.yaml]# kubectl get pv
NAME            CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM                    STORAGECLASS   REASON   AGE
nginx-html-pv   1Gi        RWO            Retain           Bound       default/nginx-html-pvc                           2d12h
pv001           1Gi        RWO,RWX        Retain           Available                                                    50m
pv002           2Gi        RWO            Retain           Available                                                    50m
pv003           2Gi        RWO,RWX        Retain           Released    default/mypvc                                    50m
pv004           4Gi        RWO,RWX        Retain           Available                                                    50m
pv005           5Gi        RWO,ROX,RWX    Retain           Available                                                    50m
# Released,表示已经回收完毕
#到k8s4看一下文件是否还存在
[root@k8s4 v3]# cat index.html
123
#还在
[root@master01 k8s.yaml]# kubectl edit pv pv003
persistentvolume/pv003 edited
#将Released    default/mypvc  恢复到Available 需要删除字段的如下图回收释放
[root@master01 k8s.yaml]# vim pv.yamlapiVersion: v1
kind: PersistentVolume
metadata:name: pv001labels:name: pv001
spec:nfs:path: /data/v1server: 192.168.233.84accessModes: ["ReadWriteMany","ReadWriteOnce"]capacity:storage: 1Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:name: pv002labels:name: pv002
spec:nfs:path: /data/v2server: 192.168.233.84accessModes: ["ReadWriteOnce"]capacity:storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:name: pv003labels:name: pv003
spec:nfs:path: /data/v3server: 192.168.233.84accessModes: ["ReadWriteMany","ReadWriteOnce"]persistentVolumeReclaimPolicy: Recycle
#回收资源并释放,也就是不保留文件capacity:storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:name: pv004labels:name: pv004
spec:nfs:path: /data/v4server: 192.168.233.84accessModes: ["ReadWriteMany","ReadWriteOnce"]persistentVolumeReclaimPolicy: Recyclecapacity:storage: 4Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:name: pv005labels:name: pv005
spec:nfs:path: /data/v5server: 192.168.233.84accessModes: ["ReadWriteMany","ReadWriteOnce","ReadOnlyMany"]capacity:storage: 5Gi[root@master01 k8s.yaml]# vim pvc.yamlapiVersion: v1
kind: PersistentVolumeClaim
metadata:name: mypvc
spec:accessModes: ["ReadWriteMany"]
#pvc期望请求的pv的读写挂载类型是什么resources:requests:storage: 2Gi
#pvc期望请求pv的存储大小是2G,期望的pv类型是readwritemany,大小2g,优先等于2g再大于,不能小于
---
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: nginxname: nginx
spec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- image: nginx:1.22name: nginx1volumeMounts:- name: htmlmountPath: /usr/share/nginx/htmlvolumes:- name: htmlpersistentVolumeClaim:claimName: mypvckubectl 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当中的模式

emptyDir:用于容器内存储卷,随着pod的销毁,数据不保留

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

Nfs:共享目录存储卷,可以实现持久化,数据集中在一个目录,方便管理

Pv和pvc

Pvc请求---pv的存储资源---真正存储的空间还是硬盘空间(NFS)

Nfs支持pvc的所有挂载方式和读写模式

hostPath仅支持ReadWriteOnce方式

Pvc是以检索的方式找到匹配的pv资源

检索挂载方式和读写模式

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

谁合适选谁

保留:默认可以不写

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

删除: pv会变成failed模式,不可用,数据也会被删除

静态比较麻烦,如何能自动的匹配pv资源,需要用到动态pvc

相关文章:

  • 常见类型的yaml文件如何编写?--kind: Job|CronJob
  • C 语言关于sizeof() 和 strlen()区别?
  • Java的输入和输出处理(二)字符篇
  • Java使用IText生产PDF时,中文标点符号出现在行首的问题处理
  • 第二证券:股指维持震荡格局 关注光伏设备等板块
  • B-树和B+树的特性,以及B+树在数据库中的应用
  • RESTful API使用它构建 web 应用程序
  • Mysql与Redis如何保证数据一致性问题
  • 找出字符串中第一个匹配项的下标(Leetcode28)
  • docker 容器添加指定网络地址
  • 坑记(HttpInputMessage)
  • 哪一款台灯适合孩子能用?分享适合孩子使用的护眼台灯
  • 分享一个实现侧滑菜单的Flutter页面所遇到的问题与解决思路
  • P4学习(二) 阅读《P4: Programming Protocol-Independent Packet Processors》论文
  • 小白入门基础 - spring Boot 入门
  • [译]如何构建服务器端web组件,为何要构建?
  • 【刷算法】从上往下打印二叉树
  • JavaScript创建对象的四种方式
  • python3 使用 asyncio 代替线程
  • Python爬虫--- 1.3 BS4库的解析器
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 面试总结JavaScript篇
  • 如何编写一个可升级的智能合约
  • 一个完整Java Web项目背后的密码
  • 字符串匹配基础上
  • RDS-Mysql 物理备份恢复到本地数据库上
  • scrapy中间件源码分析及常用中间件大全
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ​什么是bug?bug的源头在哪里?
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (九)One-Wire总线-DS18B20
  • (一)u-boot-nand.bin的下载
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (转)Linq学习笔记
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .dwp和.webpart的区别
  • .htaccess配置重写url引擎
  • .net CHARTING图表控件下载地址
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .NET MVC第五章、模型绑定获取表单数据
  • .NET 使用 XPath 来读写 XML 文件
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .NET建议使用的大小写命名原则
  • .net通用权限框架B/S (三)--MODEL层(2)
  • @EnableConfigurationProperties注解使用
  • [20171102]视图v$session中process字段含义
  • [ACM] hdu 1201 18岁生日
  • [C#]DataTable常用操作总结【转】
  • [C#]OpenCvSharp使用帧差法或者三帧差法检测移动物体
  • [C++] Windows中字符串函数的种类
  • [Effective C++读书笔记]0012_复制对象时勿忘其每一部分