应用程序存在有状态与无状态之分。对于有状态的应用,数据持久化是必然之需。Docker提供支持配置容器使用存储据卷将数据存储到主机文件系统或网络文件系统中。相应地,Kubernetes提供了存储卷Volume来让Pod保存数据。注意Volume是Pod级别的资源,Pod内的所有容器共享存储卷。

存储卷类型
Kubernetes支持的网络存储卷非常丰富,可分为临时存储卷、本地存储、网络存储与特殊存储卷。
1. 临时存储卷emptyDir
临时存储卷主要指emptyDir。它是Pod对象生命周期中的一个临时目录,在Pod对象启动时创建,Pod移除时删除,主要用于存储一些临时数据。
2. 本地存储卷hostPath
hostPath是将工作节点上某文件系统的目录或文件挂载到Pod中的一种存储卷。它可独立于Pod的生命周期,具有持久性。但如果Pod意外停止后,被调度到别的节点,那么就无法使用以前的数据。
3. 网络存储卷
临时存储卷与本地存储卷都不具有完全持久化的能力,要想完全解决持久化需使用网络存储卷。Kubenetes支持的网络存储卷非常的丰富,包括
nfs
fc
iscsi
RBD
GlusterFS
awsElasticBlockStore
azureDisk
cinder
awsElasticBlockStore
还有一些其他的类型可参见官方文档。
4. 特殊存储卷
Secret与ConfigMap是两种特殊的卷类型。Secret用于向Pod传递敏感信息,如密码、私钥、证书文件等。ConfigMap用于向Pod注入非敏感数据。
存储卷的使用
在Pod中通过指定下面的字段来使用存储卷:
spec.volumes:通过此字段提供指定的存储卷
spec.containers.volumeMounts:通过此字段将存储卷挂接到容器中
PV与PVC
直接使用前面提到的存储卷,用户需了解存储系统的细节才能完成相关的配置。例如,NFS存储卷的server与path字段的配置是服务器地址与共享目录路径。这就向使用者暴露了存储系统的很多细节,同时作为开发者,可能对持久化存储的配置一窍不通,不会编写对应的Volume对象。
为此,Kubernetes引入了一组叫Persistent Volume Claim(PVC) 与Persistent Volume(PV)的API对象,大大降低了用户声明和使用持久化Voume的门槛。
PV是集群管理员配置提供的某种存储系统上的一段存储空间。PV支持多种网络存储系统,如前面提到的NFS、RBD等。PV是集群级别的资源,不属于任何命名空间,用户对PV资源的使用通过Persistent Volume Claim(PVC)提出声明来完成绑定,是PV资源的消费者。Pod、PVC、PV之间的关系如下图所示:

PV与PVC使用案例
有了PV与PVC,使用存储卷会比较方便。首先,由集群管理员创建PV对象,定义持久化存储数据卷。如下,定义了一个NFS类型的PV,填入对应上server信息、容量、访问权限以及storageClassName。
apiVersion: v1kind: PersistentVolumemetadata:name: nfsspec:storageClassName: manualcapacity:storage: 1GiaccessModes:- ReadWriteManynfs:server: 10.232.9.4path: "/data"
然后,由开发人员声明一个PVC对象:
apiVersion: v1kind: PersistentVolumeClaimmetadata:name: nfsspec:accessModes:- ReadWriteManystorageClassName: manualresources:requests:storage: 1Gi
用户创建的PVC要真正被容器使用起来,必须与符合条件的PV绑定起来。这里要进行检查才能绑定:
PV与PVC的spec字段,存储大小必须满足要求;
PV与PVC的storageClassName必须一样
在成功将PV与PVC进行绑定之后,Pod就能够向使用emptyDir等常规类型的Volume一样,在自己的yaml文件中声明使用这个PVC就可以了,如下:
apiVersion: v1kind: Podmetadata:labels:role: web-frontendspec:containers:- name: webimage: nginxports:- name: webcontainerPort: 80volumeMounts:- name: nfsmountPath: "/usr/share/nginx/html"volumes:- name: nfspersistentVolumeClaim:claimName: nfs
小结
本文简单介绍了一下Kubernetes的存储卷,用于解决有状态服务存储数据问题,其实现方式包括了临时存储、节点存储、网络存储、特殊存储。要想从根本上解决集群存储问题需使用网络存储卷。同时,为了降低使用成本,Kubernetes提供了PV与PVC方式。PVC可以看做面向对象编程中的接口,PV是具体实现。




