持久卷
容器化带来的问题有哪些?
容器中的文件在磁盘上是临时存放的,这给容器中运行的重要的应用程序带来的一些问题.
问题1: 当容器崩溃或重启的时候,kubelet会以干净的状态(镜像的状态)重启容器,容器内的历史数据会丢失.
问题2:当容器被删除时(k8s没有停止容器的概念,只有创建.删除),容器内的数据也会被一起清理.
问题3:多个容器中有共享文件或目录的需求.
卷:卷是一个抽象化的存储设备
为什么要使用卷?
卷可以解决容器崩溃或重启后历史数据丢失的问题.
卷可以解决容器或Pod被删除后数据持久保存的问题.
卷可以解决在多个容器内共享数据的问题.
Pod可以使用任意数目的卷.
k8s支持的卷类型
持久卷:持久卷是集群中的存储资源,就像他的名字一样,在里面存储的数据不会随着Pod的删除而丢失.
临时卷: 有些应用程序需要额外的存储,但不会关心数据在重启后是否仍然可以使用,卷会遵从Pod的生命周期,与Pod一起创建和删除.
投射卷: 它允许您将多个现有卷源映射到同一个目录.通过将这些不同类型的卷源组合成一个统一的卷,可以更方便地管理和使用这些资源.
如何使用卷
1,首先编写一个Pod的资源对象文件
2.在Pod.spec下添加volumes字段,配置外部存储为卷
3.在Pod.spec.containers[*] 中添加volumeMounts字段,声明卷在容器中挂载的位置
注意事项:卷不能挂载到其他卷之上,也不能与其他卷由硬链接;Pod配置中的每个容器必须独立指定各个卷的挂载位置.
hostPath持久卷
hostPath卷的本质是使用本地设备,例如磁盘,分区,目录,Socket,CharDevice和BlockDevice等等.hostPath卷的可用性取决于底层节点的可用性,如果节点变得不健康,那么hostPath卷也将不可被访问.
hostPath卷里面的数据不会随着Pod的结束而消失
注意事项: 配置相同的Pod,可能在不同的节点上表现不同,因为不同节点上映射的文件内容不同.
使用hostPath卷保存日志的资源对象文件格式如下:
spec:
volumes: #卷定义
- name: logdata #卷名称
hostPath: #使用hostPath创建卷
path: /var/weblog #在节点上存放的路径
type: DirectoryorCreate #目录不存在就创建新的
containers:
- name: nginx
image: myos:nginx
columeMounts: #mount卷
- name: logdata #卷的名字
mountPath: /usr/local/nginx/logs #容器内路径
type对应类型
type类型 | 说明 |
DirectoryOrCreate | 卷映射对象是一个目录,如果不存在就创建它 |
Directory | 卷映射对象是一个目录,且必须存在 |
FileOrCreate | 卷映射对象是一个文件,如果不存在就创建它 |
File | 卷映射对象是一个文件,且必须存在 |
Socket | 卷映射对象是一个Socket套接字,且必须存在 |
CharDevice | 卷映射对象是一个字符设备,且必须存在 |
BlockDevice | 卷映射对象是一个块设备,且必须存在 |
NFS卷
NFS存储
k8s中允许将nfs存储以卷的方式挂载到你的Pod中
在删除Pod时,nfs存储卷会被卸载(umount),而不是被删除.nfs卷可以在不同节点的Pod之间共享数据.
NFS卷的用途
NFS最大的功能就是在不同节点的不同Pod中共享读写数据.本地NFS的客户端可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样.