容器内的目录和宿主机的目录进行挂载
容器在系统上的生命周期是短暂的,delete,k8s用控制创建的pod,delete相当于重启,容器的状态也会恢复到初识状态
一旦容器回到初始状态,所有得分后天编辑的文件都会消失
容器和所有节点之间创建一个可以持久化保存容器内文件的存储卷,即使容器被销毁,删除,重启,节点上的存储卷的数据依然存在,后续也可以继续使用,可以继续将容器内目录和宿主机进行挂载,保存的数据继续使用
容器内部共享存储卷,k8s系统中,是一个pod当中的多个容器共享一个存储卷目录
EmptyDir卷可以是pod当中容器在这个存储卷上读取和写入
EmptyDir是不能挂载到节点的,随着pod的生命周期结束,emptyDir也会结束,数据也不会保留
只能用于内部共享
演示:
进入容器:
将容器内的挂载点,和节点上的目录进行挂载,hostpath可以实现数据持久化,node节点将会被销毁,那么数据也就会丢失
污点设置为NoExecute:节点上的pod会被驱逐,文件数据在不在?
Pod被驱逐,并不是node节点被销毁,所有的数据还保留在节点上
Pod被驱逐(基于控制器创建的),会在其他节点继续部署,又会在其他节点生成一个新的存储卷,数据依然可以持久化
EmptyDir被驱逐,数据会丢失
演示
查看不同pod输出的日志
第三种
所有的pod内部的目录都和节点上的NFS共享形成数据同步,所有文件都将保存在一个目录当中,便于管理
验证
用主机名做
找不到,挂载卷因为没有映射
每个主机都做映射
HostPath和NFS是我们常用的方式,推荐使用NFS
PV:全称persistent volume持久化存储卷,描述和定义一个存储卷,PV是由我们运维人员来定的
PVC:全称persistent Volume Claim 持久化存储的请求,PVC实际上是用来描述或者声明我希望使用什么样PV来进行存储
PVC---->pv------NFS 意思就是说,PVC请求PV
PVC是发起一个请求,PVC是提供一个虚拟化的存储卷
PVC和PV都是虚拟的概念,是k8s的抽象的虚拟化的存储资源
PVC和PV之间的静态请求,一旦百个PVC怎么办,所有引申出了动态请求
PV是集群当中的存储资源,PVC请求存储资源,也是对存储资源的一个索引(检查索引),选择一个最合适的PV来存储资源
PV和PVC之间是有生命周期管理:
Provisioning(配置)------PVC请求request-----检索(找一个合适的PV)----PVC和PV(binding绑定)----使用---pod被删除-------PV的releasing(释放)-------recycling(回收)
配置:静态,动态
绑定:就是把PV分配给PVC
使用:就是pod通过PVC使用存储资源---NFS
释放:pod解除和挂载卷volume的关系,删除PVC
回收:保留PV,让下一个PVC使用
Available:可用,而且没有被任何PVC绑定
Bound:绑定,PV已经绑定了PVC,绑定即使用
Released:释放,PVC已经被删除了,但是PV的存储资源还没有被集群回收
Failed:表示PV资源回收失败,而且PV为不可用状态
ReadWriteOnce: RWO,配置文件里面是全称,存储PV可读可写,但是只能被单个pod挂载
ReadOnlyMary:ROX 存储的PV可以以只读的方式被多个pod挂载
ReadWriteMany:RWX 存储可以支持读写的方式被多个pod共享
EmptyDir:不考虑
NFS:可以支持以上三种读写和挂载方式
ISCSI:不支持ReadWriteMany
hostPath:只支持ReadWriteOnce方式
iscsiadm -m session -P 3查看服务器是否有iscsi设备
-m session:指定操作的会话模块,管理iscsi会话
-P 3:显示详细信息的级别,级别就是3,显示详细信息
集群回收PV资源的方式:
Retain保留,pod和挂载点的数据不会被删除
Recycle:回收,PV上的数据被删除,挂载点的数据也被删除
Delete:淡出,解绑时,自动删除PV上的数据。(本地硬盘不能使用,AWS,EBD,GCE)支持动态卷的可以使用,PV不再可用(云平台自己处理)
补充:当pod运行之后,通过PVC请求到了PV,除非pod被销毁,否则无法删除PVC
演示PVC静态和资源回收方式:
映射(全部)
发布
每个节点查看:
vim pv.yml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv001
labels:
name: pv001
spec:
nfs:
path: /data/v1
server: 20.0.0.74
accessModes: ["ReadWriteMany","ReadWriteOnce"]
capacity:
storage: 1Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv002
labels:
name: pv002
spec:
nfs:
path: /data/v2
server: 20.0.0.74
accessModes: ["ReadWriteOnce"]
capacity:
storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv003
labels:
name: pv003
spec:
nfs:
path: /data/v3
server: 20.0.0.74
accessModes: ["ReadWriteMany","ReadWriteOnce"]
capacity:
storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv004
labels:
name: pv004
spec:
nfs:
path: /data/v4
server: 20.0.0.74
accessModes: ["ReadWriteMany","ReadWriteOnce"]
capacity:
storage: 4Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv005
labels:
name: pv005
spec:
nfs:
path: /data/v5
server: 20.0.0.74
accessModes: ["ReadWriteMany","ReadWriteOnce"]
capacity:
storage: 5Gi
定义一个PVC请求:
vim pvc.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mypvc
spec:
accessModes: ["ReadWriteMany"]
#pvc期望请求的PV的读写挂载类型是什么
resources:
requests:
storage: 2Gi
#PVC期望请求PV的存储大小是2G。上面合起来的意思:期望读写模式:ReadWriteMany 并且大小是2G
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx:1.22
name: nginx
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
volumes:
- name: html
persistentVolumeClaim:
claimName: mypvc
选择了PV003
测试:
怎么删除PVC
删不掉,因为pod还在
怎么删呢,删除pod
处在回收状态
怎么让其回到可用状态
kubectl edit pv pv003
回到了available状态
配置回收策略
persistentVolumeReclaimPolicy: Recycle
稍微等等
也就是挂载内容被回收,也就是被删除了
persistentVolumeReclaimPolicy: Delete
先删pod,再删PVC,删除之后数据卷还在
动态卷是要删除的,这里还在,只是演示一下
怎么恢复:
k8s当中存储卷的模式:
EmptyDir:用于容器内共享,随着pod被销毁,也会被销毁,数据不保留
hostPath:节点目录的存储卷,可以实现存储化存储,数据在每个节点上都有,不方便集中管理
NFS:共享目录存储卷,既可以实现持久化,也可以数据集中在一个目录,方便管理
PV和PVC
PVC是一种请求----PV存储资源----------硬盘空间(NFS)
NFS支持PVC的所有挂载方式和读写模式
hostPath仅支持readwriteOnce方式
PVC是以检索的方式找到匹配的PV资源
检索挂载方式和读写模式:
检索PV能提供的存储资源的大小
谁合适选谁
保留:默认可以不写
回收:自动回收,节点上的数据会被删除
删除:PV会变成failed模式,不可用,数据也会被删除