Volume: 数据卷
kubernetes Pod中多个容器访问的共享目录。volume被定义在pod上,被这个pod的多个容器挂载到相同或不同的路径下。volume的生命周期与pod的生命周期相同,pod内的容器停止和重启时一般不会影响volume中的数据。所以一般volume被用于持久化pod产生的数据。
volume类型有多种本次介绍常用的两种:
emptyDir
emptyDir的生命周期与所属的pod相同。
pod删除时,其emptyDir中的数据也会被删除。
emptyDir类型的volume在pod分配到node上时被创建,kubernetes会在node上自动分配一个目录,因此无需指定宿主机node上对应的目录文件。
适用场合:emptyDir Volume主要用于某些应用程序无需永久保存的临时目录,多个容器的共享目录等。
示例:
1、编写yaml文件(运行两个容器)
kind: Pod
apiVersion: v1
metadata:
name: producer-consumer
spec:
containers:
- name: producer
image: busybox
imagePullPolicy: IfNotPresent
volumeMounts:
- mountPath: /producer_dir
name: shared-volume
args:
- /bin/sh
- -c
- echo "hello world" > /producer_dir/hello.txt ; sleep 30000
- name: consumer
image: busybox
imagePullPolicy: IfNotPresent
volumeMounts:
- mountPath: /consumer_dir
name: shared-volume
args:
- /bin/sh
- -c
- cat /consumer_dir/hello.txt ;sleep 30000
volumes:
- name: shared-volume
emptyDir: {}
2、验证:
第二个容器,可以查看到刚创建的文件,即:多个容器的共享目录
docker inspect e8fdb49412e0
查看到本地路径,有刚在容器创建的文件
删除pod
本地目录也被清除
hostPath卷
将主机节点的文件系统中的文件或目录挂载到集群中。
相对于emtpyDir来说,hostPath就等于运行容器是使用的命令:
docker run -v /host/path:/container/path
除了path属性之外,用户还可以指定type:
空 空字符串(默认),挂载hostPath卷之前不会执行任何检查
DirectoryOrCreate 如果指定的位置没有目录,将创建空目录,权限755,与kubelet具有相同的所有权
Directory 指定的位置必须存在目录
FileOrCreate 如果指定的位置没有文件,将创建空文件,权限644,与kubelet具有相同的所有权
File 指定的位置必须存在文件
Socket 指定的位置必须存在Unix套接字
CharDevice 指定的位置必须存在字符设备
BlockDevice 指定的路径下必须存在块设备
//这里没有创建新的yaml文件,直接将emptyDir.yaml文件的volumes字段更改为:hostPath.
[root@node01 volume]# mkdir /data/hostPath -p
---省略部分同上---
volumes:
- name: shared-volume
hostPath:
path: "/data/hostPath"
type: Directory
特殊存储卷
NFS卷:
为什么用它?解决单个node宕机,本机的挂载目录也随之不可用,在其他node新建pod,也没有数据的问题。
怎么用? 将目录挂载到远端一台NFS服务器,node宕机,其他节点新建的pod,也可使用数据,数据不会丢失!
PV与PVC:
PV(Persistent Volume) 持久化卷,是对底层的共享存储的一种抽象。PV由kubernetes管理员进行创建和配置,它与底层具体的共享存储技术有关,并通过插件完成与共享存储的对接。
PVC(Persistent Volume Claim) 是持久卷声明,是用户对于存储需求的一种声明。其实就是用户向kubernetes系统发出的一种资源需求申请。
示例:这里将NFS服务部署在master节点上,需要在master节点上提前规划好共享的目录
创建流程四步骤:创建pv - pvc - pod
1、部署NFS服务
yum install nfs-utils rpcbind -y
[root@master ~]# mkdir /nfsdata
[root@master ~]# vim /etc/exports
/nfsdata *(rw,sync,no_root_squash)
[root@master ~]# systemctl start rpcbind
[root@master ~]# systemctl enable rpcbind
[root@master ~]# systemctl start nfs-server
[root@master ~]# systemctl enable nfs-server
2、创建pv1.yaml文件
kind: PersistentVolume
apiVersion: v1
metadata:
name: pv1
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
storageClassName: nfs
nfs:
path: /nfsdata
server: 172.16.0.168
重要参数释义:
capacity最大容量:目前只支持存储空间大小的设置( storage=1Gi )
accessModes访问模式:底层不同的存储类型可能支持的访问模式不同
ReadWriteOnce(RWO):读写权限,但是只能被单个节点挂载
ReadOnlyMany(ROX): 只读权限,可以被多个节点挂载
ReadWriteMany(RWX):读写权限,可以被多个节点挂载
persistentVolumeReclaimPolicy持久卷回收策略:
Retain (保留) 保留数据,需要管理员手工清理数据
Recycle(回收) 清除 PV 中的数据,效果相当于执行 rm -rf /thevolume/*
Delete (删除) 与 PV 相连的后端存储完成 volume 的删除操作,当然这常见于云服务商的存储服务
storageClassName存储类别:
具有特定类别的PV只能与请求了该类别的PVC进行绑定
未设定类别的PV则只能与不请求任何类别的PVC进行绑定
使用命令生成pv:
kubectl apply -f pv1.yaml
3、创建一个PVC,向刚才的PV申请使用空间
pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: pvc1
spec:
accessModes:
- ReadWriteOnce
storageClassName: nfs
resources:
requests:
storage: 1Gi
4、创建一个Pod,来使用上述PVC
kind: Pod
apiVersion: v1
metadata:
name: pod1
spec:
containers:
- name: pod1
image: busybox
imagePullPolicy: IfNotPresent
args:
- /bin/sh
- -c
- sleep 30000
volumeMounts:
- mountPath: "/data"
name: mydata
volumes:
- name: mydata
persistentVolumeClaim:
claimName: pvc1
命令执行三个yaml文件:
kubectl apply -f pod.yaml
验证:注意看status变化
在NFS服务器(即master)创建测试文件
进入容器(node1)查看到,刚创建的文件