我们都知道,容器是一个短暂的不稳定的存在(随时可能挂掉),挂掉之后里面的所有数据都没了,但是我们会有很多数据是需要一直存下来(持久化)的,那怎么办呢?思路很简单,把容器里面的数据存到一个可以持久化的地方(比如s3上)。
Volume
为了解决上面这个问题,kubernetes提供了Volume。一个Volume其实就是由一个存储中间件锁支持的一个directory,具体是什么存储中间件是由Volume的类型确定的。
如上图,在k8s里面,一个Volume会attach到一个Pod上,我们之前也有说过在Pod里面网络和存储是共享的,所以这个Volume可以被Pod中所有的container所共享。一个Volume和Pod的生命周期是一样的,不过却比containers要更长,这样可以使得数据可以在容器之间共享。
Volume Types
一个mount到Pod里面的directory是由底层的Volume Type支持的,Volume Type决定了这个directory的属性,比如大小,内容等等。下面列举一部分的Volume Type:
emptyDir
顾名思义,这就是一个“空的”Volume。这个空的Volume会在Pod被调度到node上的时候被创建。这种类型的Volume的生命周期和Pod一样,如果Pod挂了,那么这种Volume里面的所有数据也就没了。
hostPath
同样顾名思义,这就是把主机上的某个path映射到pod里面,如果Pod挂了,数据还在host上,不过如果host挂了,数据也就没了。
gcePersistentDisk
顾名思义,强耦合gce,不多说了。
awsElasticBlockStore
同上
nfs
通过nfs,我们可以mount一个nfs share到pod里。
iscsi
同上
secret
我们可以用这个type来把我们放在secret里面的那些比如密码呀token呀之类的信息挂载到pod上,让应用可以使用。
persistentVolumeClaim
这个是最重要的一种,也是最常用的一种,我们可以把一个Persistent Volume(PV)
挂载到Pod里面,通过persistentVolumeClaim(PVC)
。
Persistent Volumes
在传统的IT环境中,一般存储是由系统管理员来管理的,终端用户只是获得如何去使用的指导,但是不用管底层到底存储是怎么管理的。
在容器世界里面,也是一样的。Kubernetes有一个叫做Persistent Volumes的子系统,管理员通过Persistent Volume API向其中添加和管理Persistent Volume,然后用户使用Persistent Volume Claim API来使用。
一个PV就是一个通过网络挂载到集群上的存储。
PV可以通过StorageClass这个resource被静态地创建,也可以动态地被添加。一个StorageClass包含了预定义好的创建PV的初始化器和参数。
一些支持使用PV进行管理的Volume Types是:
- GCEPersistentDisk
- AWSElasticBlockStore
- AzureFile
- NFS
- iSCSI
- CephFS
- Cinder
- etc.
Persistent Volume Claims
一个Persistent Volume Claim(PVC)就是一个用户想要使用storage的请求。用户通过指定比如大小、访问权限等来申请PV资源,当有一个合适的资源(PV)被找到的时候,就会和PVC绑定在一起:
当bind成功之后,这个PVC就可以在Pod里面使用了:
当一个用户结束使用之后,绑定的PV就可以被归还(release)了,就可以重新被申明(reclaimed)和使用了。