意义:存储卷----数据卷
容器内的目录和宿主机的目录进行挂载
容器在系统上的生命周期是短暂的,delete,k8s用控制器创建的pod,delete相当于重启,容器的状态也会回复到初始状态
一旦回到初始状态,所有的后天编辑的文件都会消失。
容器和节点之间创建一个可以持久化保存容器内文件的存储卷,即使容器被销毁,删除,重启,节点上存储卷的数据依然存在,后续也可以继续使用,继续将容器内的目录和宿主机挂载,保存的数据继续使用
1、emptyDir
容器内部共享存储卷,k8s系统中,是一个pod当中的多个容器共享一个存储卷目录
emptyDir卷可以使pod当中的容器在这个存储卷上读取和写入
emptyDir是不能挂载到节点的。随着pod生命周期结束,emptyDir也会结束,数据也不会保留
容器内部共享。LNMP
2、hostPath
将容器内的挂载点,和节点上的目录进行挂载,hostPath可以实现数据的持久。node节点被销毁,那么数据也会丢失
污点设置为:
NoExecute:节点上的pod会被驱逐,文件数据在不在?
pod被驱逐,并不是node节点被销毁。所有数据还保留在节点上
pod被驱逐 (基于控制器创建的)会在其他重新部署,又会在其他节点生成一个新的存储卷。数据依然可以持久化
emptyDir的共享数据,会丢失
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx:1.22
name: nginx1
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
#第一个name,存储的名称,可以自定义,mountpath,定义容器内的挂载目录点,和节点或者##其他容器的
共享目录
- image: nginx:1.22
name: nginx2
volumeMounts:
- name: html
mountPath: /data
#引用上一个挂载的名称,表示我将和、usr/share/nginx/html这个目录挂载,由data目录和他挂载
command: ["/bin/bash","-c", "while true; do echo $(date) >> /data/index.html; sleep 2; done"]
volumes:
- name: html
hostPath:
path: /opt/test
type: DirectoryOrCreate
3、NFS共享存储
所有的pod内的目录都和节点上的nfs共享目录形成数据,所有的数据文件都保存在共享目录当中,集中,方便管理
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx:1.22
name: nginx1
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
#第一个name,存储的名称,可以自定义,mountpath,定义容器内的挂载目录点,和节点或者##其他容器的
共享目录
- image: nginx:1.22
name: nginx2
volumeMounts:
- name: html
mountPath: /data
#引用上一个挂载的名称,表示我将和、usr/share/nginx/html这个目录挂载,由data目录和他挂载
command: ["/bin/bash","-c", "while true; do echo $(date) >> /data/index.html; sleep 2; done"]
volumes:
- name: html
nfs:
path: /data/volumes
server: harbor
#server可以是共享节点的ip地址,也可以是主机名,主机名要做映射
pvc和pv
pv:全称Persistent Volume 持久化存储卷,描述和定义一个存储卷,pv是由我们运维人员来定的
pvc:全称Persistent Volume Claim 持久化存储的请求,pvc实际上是用来描述或者声明我希望使用什么样的pv来进行存储
pvc-pv是一一对应的关系(描述,存储(大小))
pvc---->pv----->NFS
pvc和pv都是虚拟化的概念,是k8s的抽象的虚拟的存储资源
pv是集群当中的存储资源,pvc请求存储资源,也是对存储资源的一个检索 (检查索引),选择一个最合适的pv来存储资源
pv和pvc之间是有生命周期管理:
1、Provisioning(配置)-----pvc请求request-----检索(找一个合适的pv)----pvc和pv(binding 绑定)-------使用-----
pod被删除-------pv的releasing(释放)------资源回收recyling
配置:静态,动态
绑定:就是把pv分配给pvc
使用:就是pod通过pvc使用存储资源—NFS
释放:pod解除和挂载卷的关系,删除pvc
回收:保留pv,以供下一次pvc使用
pv的状态
Avaliable:可用,而且没有被任何pvc绑定
Bound:绑定,pv已经绑定了pvc,绑定即使用
released:释放,pvc已经被删除了,但是pv的存储资源还没有被集群回收
Failed:表示pv资源回收失败,而且pv为不可用状态。
ReadWriteOnce RWO,配置文件里是全称,存储pv可读可写,但是只能被单个pod挂载
ReadOnlyMany:ROX 存储pv可以以只读的方式被多个pod挂载
ReadWriteMany:RWX 存储可以支持读写的方式被多个pod共享
NFS:可以支持以上三种读写和挂载方式
SCSI
[root@master01 opt]# lsscsi
[0:0:0:0] disk VMware, VMware Virtual S 1.0 /dev/sda
[2:0:0:0] cd/dvd NECVMWar VMware IDE CDR10 1.00 /dev/sr0
ISCSI 不支持ReadWriteMany(RWX )
[root@master01 opt]# iscsiadm -m session -P 3
iscsiadm: No active sessions.
查询服务器是否有ISCSI设备 -m seesion 管理iscsi的会话 -P 3 显示详细信息的级别
hostpath:只支持RWO ,其他两个不支持
回收策略
集群回收pv资源的方式
Retain保留,pod和挂载点的数据不会被删除
Recycle:回收,pv上的数据会被删除,挂载点的数据也被删除
Delete: 删除,解绑时会自动删除pv上的数据 (本地硬盘无法使用)支持动态卷的可以使用,pv也不再可用(云平台自己处理)
补充:当pod运行之后,通过pvc请求到了pv,除非pod被销毁,否则无法删除pvc
pvc----请求用哪个pv的存储----pv和物理存储做映射 (挂载)----物理设备提供存储卷
pvc yaml文件
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv001
labels:
name: pv001
spec:
nfs:
path: /data/v1
server: 192.168.211.40
accessModes:
- ReadWriteMany
- ReadWriteOnce
capacity:
storage: 1Gi
更改回收策略
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv004
labels:
name: pv004
spec:
nfs:
path: /data/v4
server: 192.168.211.40
accessModes:
- ReadWriteMany
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle 添加这一行
capacity:
storage: 4Gi
[root@master01 opt]# kubectl apply -f pv.yaml
persistentvolume/pv001 unchanged
persistentvolume/pv002 unchanged
persistentvolume/pv003 configured *
persistentvolume/pv004 configured * 显示这个就是更改策略成功
persistentvolume/pv005 unchanged
k8s当中存储卷的模式:
emptyDir:容器内的存储卷,随着pod被销毁,也会被销毁,数据不保留
hostPath:节点目录的存储卷,可以实现持久化存储,数据在每个节点上都有,不方便集中管理
nfs:共享目录存储卷,既可以实现持久化,也可以数据集中在一个目录,方便管理
pv和pvc:
pvc请求----pv的存储资源----硬盘空间(NFS)
NFS支持pvc的所有类型挂载权限和读写方式
hostpath:仅支持ReadWriteOnce 方式
pvc是以检索的方式找到匹配的pv资源
检索挂载方式和读写模式
检索pv能提供的存储资源的大小
谁合适选谁
保留:默认可以不写
回收:自动回收,节点上的数据也会被删除
删除:pv会变成failed模式,不可用,数据也会被删除
静态比较麻烦,但是如何自动匹配pv资源? 下回分解