目录
一、K8S的存储卷
1、概念:
2、挂载的方式:
2.1、emptyDir:
2.2、hostPath:
2.3、NFS共享存储:
二、PV和PVC:
1、概念
2、请求方式
3、静态请求流程图:
4、PV和PVC的生命周期
5、PV的状态:
6、PV的读写挂载方式:
7、回收策略:
三、PV和PVC静态请求实验:
1、默认的Retain保留策略:
2、设置Recycle回收释放策略:
3、Delete回收策略
4、总结:
一、K8S的存储卷
1、概念:
存储卷:数据卷
容器内的目录和宿主机的目录进行挂载
容器在系统上的生命周期是短暂的,delete,K8S用控制器创建的pod,delete相当于重启,容器的状态也会恢复到最初的状态
一旦回到初始状态,所有后天编辑的文件都会消失
容器和节点之间创建一个可以持久化保存容器内文件的存储卷。即使容器被销毁,删除,重启,节点上的存储卷的数据依然存在,后续也可以继续使用。可以继续将容器内目录和宿主机挂载,保存的数据继续使用
2、挂载的方式:
2.1、emptyDir:
在容器内部共享存储卷。在K8S系统中,是一个pod中多个容器共享一个存储卷目录
emptyDir卷可以使pod中的容器在这个存储卷上读取和写入,这个emptyDir是不能挂载到节点的。随着pod的生命周期结束,emptyDir也会结束,数据不会保留
实验部署:
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: nginxname: nginxspec:replicas: 1selector: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: {}
#-c进入指定容器
kubectl exec -it nginx-c669845b5-grs7s -c nginx2 bash
emptyDir说白了就是容器内部共享,重启数据就没有了
2.2、hostPath:
将容器内的挂载点和节点上的目录进行挂载
hostPath可以实现数据的持久化。
node节点在他就在,node节点一旦被销毁,数据也将丢失
注意点:
污点设置为NoExecute驱逐时,会把pod驱逐,那么pod的hostPath的文件数据还在不在?
pod被驱逐,并不是node节点被销毁,所有的数据还保留在节点上
但是前提是基于控制器创建的pod
pod被驱逐,会在其他node节点重新部署,又会在其他节点生成一个新的存储卷。数据依然可以持久化
但是emptyDir的数据被驱逐,数据会丢失
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: nginxname: nginxspec:replicas: 1selector: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/test0type: DirectoryOrCreate
#-c查看不同容器的日志
kubectl logs nginx-dir-84469899f7-ww65t -c nginx2
2.3、NFS共享存储:
在63主机上,创建nfs共享目录:
去验证是否发布:
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: nginxname: nginxspec:replicas: 1selector: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: /dataserver: 20.0.0.63
这里的server可以是共享节点的IP地址也可以是主机名,主机名要和所有K8S节点做映射
映射之后,可以用主机名共享
所有pod内的目录都和节点上的nfs共享目录形成数据卷,所有的数据文件都保存在共享目录中。增删改查对所有pod都生效
集中、方便管理
一般用hostPath和nfs,推荐用nfs
二、PV和PVC:
1、概念
PV:全称Persistent Volume持久化存储卷,描述和定义一个存储卷,PV是由运维人员来定的。
PVC:Persistent Volume Claim持久化存储的请求。PVC实际上是用来描述或者声明我希望使用什么样的PV来进行存储
PVC和PV是一一对应的关系(描述、存储(大小))
PVC来请求PV,nfs提供存储
PVC和PV都是虚拟化的概念,是K8S的抽象的虚拟的存储资源
2、请求方式
PV和PVC的请求方式有两种:静态和动态请求
PVC和PV之间的静态请求,一旦有成百个PVC,工总量太大,所有还有动态PVC
3、静态请求流程图:
PV是集群中的存储资源,PVC请求存储资源,也是对存储资源的一个检索(检查索引),选择一个最合适PV来存储资源
4、PV和PVC的生命周期
PV和PVC之间有生命周期管理:
Provisioning(配置)—PVC请求request—检索(找一个合适的PV)—PVC和PV binding(绑定)—使用—pod被删除—PV的releasing(释放,供下一个PVC使用)—recycling(回收)
配置:配置静态、动态
绑定:就是把PV分配给PVC
使用:就是pod通过PVC使用存储策略----NFS
释放:pod解除和Volume的关系,删除PVC
回收:保留PV,让下一次PVC使用
5、PV的状态:
Available:可用,而且没有被任何PVC绑定
Bound:绑定,表示PV已经绑定到了PVC,绑定就代表使用
Released:释放,PVC已经被删除了,但是PV的存储资源还没有被集群回收
Failed:表示PV资源回收失败,而且PV为不可用状态
6、PV的读写挂载方式:
ReadWriteOnce:RWO,在yaml配置文件中是全称,表示存储PV是可读可写,但是只能被单个pod挂载。
ReadOnlyMany:ROX,存储的PV可以以制度的方式被多个pod挂载
ReadWriteMany:RWX,存储可以支持读写的方式被多个pod共享
nfs:以上三种读写挂载方式都能支持
hostPath:只支持ReadWriteOnce方式
磁盘类型:
SCSI:不支持ReadWriteMany
ISCSI:不支持ReadWriteMany
查看节点的磁盘类型:
#查看iscsi设备
iscsiadm -m session -P 3
iscsiadm查看服务器是否有iscsi设备
-m session 指定操作的会话模块,管理iscsi的会话
-P 3 显示详细信息的级别,级别3就是显示详细信息
#查看scsi设备
lsscsi
7、回收策略:
整个集群回收PV资源的方式:
Retain:保留,pod和挂载点的数据不会被删除
Recycle:回收,PV上的数据被删除挂载点的数据也被删除
Delete:删除,解绑时会自动删除PV上的数据(本地硬盘不能使用,只有云平台才能使用:AWS、EBS、GCE),支持动态卷的可以使用,PV不再可用(云平台自己处理)
补充:当pod运行之后,通过PVC请求到了PV,除非pod被销毁,否则无法删除PVC
只有挂载点先解除,才能删除PVC
三、PV和PVC静态请求实验:
1、默认的Retain保留策略:
pv文件:
vim pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:name: pv001labels:name: pv001
spec:nfs:path: /data/v1server: 20.0.0.66accessModes:- ReadWriteMany- ReadWriteOncecapacity:storage: 1Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:name: pv002labels:name: pv002
spec:nfs:path: /data/v2server: 20.0.0.66accessModes:- ReadWriteOncecapacity:storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:name: pv003labels:name: pv003
spec:nfs:path: /data/v3server: 20.0.0.66accessModes:- ReadWriteMany- ReadWriteOncecapacity:storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:name: pv004labels:name: pv004
spec:nfs:path: /data/v4server: 20.0.0.66accessModes:- ReadWriteMany- ReadWriteOncecapacity:storage: 4Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:name: pv005labels:name: pv005
spec:nfs:path: /data/v5server: 20.0.0.66accessModes:- ReadWriteMany- ReadWriteOnce- ReadOnlyManycapacity:
storage: 5Gi
PVC声明式文件:
vim pvc.yaml
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: nginxname: nginxspec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- image: nginx:1.22name: nginxvolumeMounts:- name: htmlmountPath: /usr/share/nginx/htmlvolumes:- name: htmlpersistentVolumeClaim:claimName: mypvc
PVC—请求用哪个PV存储—PV和物理存储做映射(挂载)—物理设备提供存储
nfs共享目录查看文件
取消挂载:
要取消挂载,要先删除pod,再删pvc。想回到最后状态,最后修改pv配置文件
#先删除pod
kubectl delete deployment nginx#删除PVC请求
kubectl delete pvc mypvc
#kubectl get pv
#修改pv配置文件
kubectl edit pv pv003
#查看pv状态
kubectl get pv
取消挂载之后,nfs共享目录的数据也会被删除
2、设置Recycle回收释放策略:
kubectl apply -f pv.yaml
删除pod,再删pvc请求
不用修改edit
kubectl delete deployments.apps nginx
kubectl delete pvc mypvc
kubectl get pv
3、Delete回收策略
Delete不支持本地,只支持云平台
取消挂载:
先删pod,再删pvc。想回到最初状态,最后修改pvc配置文件
kubectl delete deployments.apps nginx
kubectl delete pvc mypvc
kubectl edit pv pv003
4、总结:
K8S中存储卷的模式:
emptyDir:容器内的存储卷,随着pod被销毁,emptyDir也会被销毁,数据不保留
hostPath:和节点目录的存储卷,可以实现持久化存储。数据在每个节点上都有,不方便集中管理
nfs:用的最多的模式,共享目录存储卷,既可以实现持久化,数据集中在一个目录,方便管理
PV和PVC:
PVC请求—PV的存储资源—硬盘空间(NFS)
NFS支持PVC的所有挂载方式和读写模式,最好用
hostPath:仅支持ReadWriteOnce模式
PVC是以检索的方式找到匹配的PV资源,
检索内容: 挂载方式和读写模式
检索PV能提供的存储资源的大小
谁合适选谁
保留:默认,可以不写
回收:自动回收,节点上的数据会被删除
删除:PV会变成Failed模式,不可用,数据也会被删除
静态比较麻烦,如何能自动的匹配PV资源呢?——动态PVC