kubernetes中的Volume

我们都知道,容器是一个短暂的不稳定的存在(随时可能挂掉),挂掉之后里面的所有数据都没了,但是我们会有很多数据是需要一直存下来(持久化)的,那怎么办呢?思路很简单,把容器里面的数据存到一个可以持久化的地方(比如s3上)。

Volume

为了解决上面这个问题,kubernetes提供了Volume。一个Volume其实就是由一个存储中间件锁支持的一个directory,具体是什么存储中间件是由Volume的类型确定的。

A00784D4-9D6B-4091-B78E-16834F743338

如上图,在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就是一个通过网络挂载到集群上的存储。

73BBB017-7870-4014-88E4-67B1AE5BC73F

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绑定在一起:

CD52FF8E-EFFE-4519-AAD8-073BE55E97E5

当bind成功之后,这个PVC就可以在Pod里面使用了:

2AECAABF-FE93-4F51-9716-CDBB334BE549

当一个用户结束使用之后,绑定的PV就可以被归还(release)了,就可以重新被申明(reclaimed)和使用了。