kubernetes 中的 Volume

370 阅读3分钟

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

Volume

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

A00784D4-9D6B-4091-B78E-16834F743338

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

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

CD52FF8E-EFFE-4519-AAD8-073BE55E97E5

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

2AECAABF-FE93-4F51-9716-CDBB334BE549

2AECAABF-FE93-4F51-9716-CDBB334BE549

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