因为每个容器都有自己独立的文件系统,默认是无法共享的。Kubernetes使用存储卷来管理文件系统。卷不是Kubernetes的顶级资源,而是Pod的一部分。Pod中的容器通过卷来共享数据。
卷有很多种,下边介绍几个简单的:
emptyDir,适用用Pod中多个容器共享数据,生命周期和Pod相同,用于临时存储。
gitRepo,通过检出Git仓库的内容来初始化的卷。本质上还是一个emptyDir
hostPath,将节点上的目录挂在到Pod中,这个是持久性的,但是只能节点上访问,因此一般使用hostPath卷的Pod会使用节点选择器选择固定的节点运行。
使用网络存储,一些集群的基础设施会提供网络化的存储,比如集群运行在GCE上,可以使用GCE持久磁盘;如果运行在AWS EC2上,可以使用awsElasticBlockStorage卷;如果运行在Azure上可以使用azureDisk卷。这些都是持久化存储。
上述方法都需要Pod的制作者理解存储的实现,Kubernetes提供了一种将将存储和Pod解耦的技术,这就是PV和PVC。运维人员和底层存储打交道,预先创建一些持久卷(PV);存储的使用者无需知道存储的底层细节,只需要描述所需存的存储的大小和权限等要求,也就是创建一个持久卷声明(PVC),Kubernetes会自动找到适当的持久卷并将其绑定到声明。因为一个PV只能绑定一个PVC,因此很容易造成浪费。Kubernetes又引入了一个StorageClass的资源,用来动态的创建持久卷,能更充分利用存储空间。运维人员先创建多个StorageClass,存储使用者在PVC声明中指定StorageClass类型,以及存储大小,StorageClass根据PVC动态的创建PV。