k8s的volume
一、volume介绍
volume是Pod中能够呗多个容器访问的共享目录。Kubernetes的Volume概念、用途和目的与Docker的Volume比较类似,但两者不能等价。首先,Kubernetes中的Volume定义在Pod上,然后被一个Pod里的多个容器挂载到具体的文件目录下;其次,Kubernetes中的Volume与Pod的生命周期相同,但与容器的生命周期不相关,当容器中止或者启动时,Volume中的数据也不会丢失。Kubernetes支持多种类型的Volume,例如GlusterFS、Ceph等先进的分布式文件存储。Volume的使用也比较简单,在大多数情况下,先在Pod上声明一个Volume,然后在容器里引用Volume并Mount到容器里某个目录上
总结来说:
为了保证数据的持久性,必须保证数据在外部存储不在docker容器中,为了实现数据的持久性存储,在宿主机和容器内做映射,可以保证在容器的生命周期结束,数据依旧实现持久性存储。但是在k8s中,由于pod分布在各个不同的节点之上,并不能实现不同节点之间持久性数据的共享,并且,在节点故障时,可能会导致数据的永久性丢失。为此,k8s就引入了外部存储卷的功能
k8s volume支持的类型
kubectl explain pod.spec.volumes
常用分类
emptyDir(临时目录):pod删除,数据也会被清除,这种存储成为emptyDIr,用于数据的临时存储
hostPath(宿主机目录映射):可以持久化,但不可以跨主机
本地的SAN(ISCSI,FC)、NAS(nfs,cifs,http)存储
分布式存储(glusterfs,rbd,cephfs)
云存储(EBS,Azure,Disk)
总结:
k8s要使用存储卷,需要2步:
1.在pod定义volume,并指明关联到那个存储设备
2.在容器使用volume mount进行挂载
二、emptyDir存储卷
一个emptyDir第一次创建是在一个pod被指定到具体node的时候,并且会一直存在pod的生命周期当中,正如它的名字一样,它初始化是一个空目录,pod中的容器都可以读写这个目录,这个目录可以被挂到各个容器相同或者不相同的路劲下。当一个pod因为任何原因被一尺的时候,这些数据会被永久删除。注意:一个容器崩溃了不会导致数据的丢失,因为容器的崩溃并不移除pod。
emptyDir