目录
一 含义
查看支持的存储卷类型
emptyDir存储卷
1.1 特点
1.2 用途
1.3部署
二、hostPath存储卷
一 含义
容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题。首先,当容器崩溃时,kubelet 会重启它,但是容器中的文件将丢失——容器以干净的状态(镜像最初的状态)重新启动。其次,在Pod中同时运行多个容器时,这些容器之间通常需要共享文件。Kubernetes 中的Volume抽象就很好的解决了这些问题。Pod中的容器通过Pause容器共Volume。
查看支持的存储卷类型
kubectl explain pod.spec.volumes
常用的有:emptyDir、hostPath、nfs、persistentVolumeClaim
emptyDir存储卷
当Pod被分配给节点时,首先创建emptyDir卷,并且只要该Pod在该节点上运行,该卷就会存在。正如卷的名字所述,它最初是空的。Pod 中的容器可以读取和写入emptyDir卷中的相同文件,尽管该卷可以挂载到每个容器中的相同或不同路径上。当出于任何原因从节点中删除 Pod 时,emptyDir中的数据将被永久删除。(将数据卷挂载到容器里面,如果容器被删除,则里面的数据也会被永久删除)
1.1 特点
- 临时性存储:
emptyDir 提供的存储是临时的,其生命周期与所属的 Pod 相关。
当 Pod 被删除时,emptyDir 中的数据也会被清除,因此不适合用于持久化存储。
- Pod 内容器之间的共享:
emptyDir 在同一个 Pod 中的所有容器之间共享,容器可以读写其中的数据。pod里面的容器挂载数据卷里面的内容都是一致的。
1.2 用途
适用于需要在同一个 Pod 中的多个容器之间进行临时数据交换或共享的场景。
例如,可以用于容器间的缓存共享、临时文件存储等用途。
1.3部署
apiVersion: v1
kind: Pod
metadata:name: pod-emptydirnamespace: defaultlabels:app: myapp
spec:containers:- name: myappimage: soscscs/myapp:v1imagePullPolicy: IfNotPresentports:- name: httpcontainerPort: 80#定义容器挂载内容volumeMounts:#使用的存储卷名称,如果跟下面volume字段name值相同,则表示使用volume的这个存储卷- name: html#挂载至容器中哪个目录mountPath: /usr/share/nginx/html/- name: busyboximage: busybox:latestimagePullPolicy: IfNotPresentvolumeMounts:- name: html#在容器内定义挂载存储名称和挂载路径mountPath: /data/command: ['/bin/sh','-c','while true;do echo $(date) >> /data/index.html;sleep 2;done']#定义存储卷volumes:#定义存储卷名称 - name: html#定义存储卷类型emptyDir: {}
kubectl apply -f pod-emptydir.yamlkubectl get pods -o wide
随后,利用同样的方法去查看 busybox容器里面
两个容器里面的内容是一致的,两个数据目录里面的内容是同步的
在上面定义了2个容器,其中一个容器是输入日期到index.html中,然后验证访问nginx的html是否可以获取日期。以验证两个容器之间挂载的emptyDir实现共享。
因为emptydir是临时存在的:
删除之前创建的pod 随后,再重新apply -f 生成新的yaml文件和新的pod
随后,再进入查看里面的内容是否发生改变
删除pod
随后,进行重新创建pod
随后,再进入pod容器里面查看数据 是否能保存 之前的数据丢失
二、hostPath存储卷 (只能在单个节点进行存储)
例如 在node01上面创建目录,并且写入内容,随后将此目录共享到pod容器里面
补充:在yaml文件里面 主要hostpath有以下几种类型:
查看hostPath中必须要写的类型
apiVersion: v1
kind: Pod
metadata:name: pod01namespace: default
spec:containers:- name: myappimage: soscscs/myapp:v1#定义容器挂载内容volumeMounts:#使用的存储卷名称,如果跟下面volume字段name值相同,则表示使用volume的这个存储卷- name: html#挂载至容器中哪个目录mountPath: /usr/share/nginx/html#读写挂载方式,默认为读写模式falsereadOnly: false#volumes字段定义了paues容器关联的宿主机或分布式文件系统存储卷volumes:#存储卷名称- name: html#路径,为宿主机存储路径hostPath:#在宿主机上目录的路径path: /data/pod/volume1#定义类型,这表示如果宿主机没有此目录则会自动创建type: DirectoryOrCreate
因为挂载到node01上面,所以在node01上面操作
去node01里面的/data/pod/volume1 如果没有的情况下,会自动创建,并且写入数据
随后,去容器里面进行查看,node节点跟pod容器共享数据成功
删除pod,再重建,验证是否依旧可以访问原来的内容
kubectl delete -f pod-hostpath.yaml
kubectl apply -f pod-hostpath.yaml
删除pod,再重建,指定到node02节点,验证是否依旧可以访问原来的内容
随后,进入到node02节点上
在自己节点本身是可以可读可写的,而容器里面是只能读,不能写
举例说明
进入到容器里面
并且hostpath指定的是一个节点,不能实现跨主机数据持久化,在node02上面的是this is node01 而指定调度到node02时,指定的是this is node02 不能实现跨主机数据持久化
hostpath:可以实现持久化存储,使用node节点的目录或文件挂载到容器,但是存储空间会受到node节点单机限制,node节点故障数据会丢失,pod跨节点不能共享数据
hostPath特点
2.3 用途
三、nfs共享存储卷
nfs:可以实现持久化存储,使用nfs将存储设备空间挂载到容器中,pod可以跨node节点共享数据
3.2用途
3.3部署
准备一台新的机器去下载nfs
随后,去node节点上面查看是否有共享数据
node1:
node2:
随后,将nfs上的主机名修改为stor01
并且在node节点上面添加映射 node1 node2一起操作
master节点操作
在nfs服务器上创建index.html
master节点操作
将nfs的共享目录挂载到容器里面,随后容器跟共享目录的数据一致,可读可写。
假设如果要指定容器在node01上,因为刚刚没有指定的情况下是指定在node02上的
apiVersion: v1
kind: Pod
metadata:name: pod-vol-nfsnamespace: default
spec:nodeName: node01containers:- name: myappimage: soscscs/myapp:v1volumeMounts:- name: htmlmountPath: /usr/share/nginx/htmlvolumes:- name: htmlnfs:path: /opt/k8sserver: stor01
~
随后,删除并重新建立yaml文件
表示,nfs可以跨主机保存数据