容器应用应当根据应用系统的特点,综合考虑容器应用对存储类型、存储性能及数据高可用等方面的要求,选择最适合的存储资源类型。常见的存储资源应用场景包括三类:将存储挂载在外部宿主机上、将存储放置于容器内部和使用外部共享存储。下面对每种应用场景的优缺点、Volume 类型选择、适用场景进行分析和说明。
一、将存储挂载在外部宿主机上
(1)优点:数据不会因为容器销毁而丢失,可永久保存;存储性能与直接在物理机上使用相当,没有磁盘1/0的额外损耗。
(2)缺点:容器实例使用宿主机存储目录,多实例的应用在同一台宿主机上的目录配置变得复杂,要求各实例对存储的使用互不干扰;如图1所示。
(3)Volume 类型的选择:使用hostPath类型的Volume,将宿主机目录挂载到容器内。使用local类型的PV。
(4)适用场景:适合有状态(Stateful)类型的容器应用,以及对磁盘 1/0 性能要求非常高的应用,例如数据库类的应用,包括 MySQL、MongoDB、Cassandra 等;
二、将存储放置于容器内部
(1)优点:配置简单易于容器实例的水平扩展;存储性能也与直接在物理机上启动应用相当,几乎没有磁盘 1/0 的额外损耗。
(2)缺点:由于容器本身的特性,在容器被销毁或删除之后,容器内部的存储也会一并被销毁,数据持久化保存比较困难;同时,在业务逻辑上要求每个容器实例存储的文件相互没有关联。如图2所示。
(3)Volume 类型的选择:使用 emptyDir 类型的 Volume,可供一个 Pod 内的多个容器共享。
(4)适用场景:适合无状态容器应用,在系统运行过程中产生的临时文件可以被保存在容器的存储空间中。如有需要保存的日志记录,则可以使用Pod 内的临时存储,供另一个Sidecar容器进行文件处理。
三、使用外部共享存储
(1)优点:配置简单易于容器实例的水平扩展。
(2)缺点:由于共享存储多是网络存储的,所以在进行文件读写时都要经过网络传输,存储性能比直接在物理机上使用差很多。如图3所示。
(3)Volume 类型选择:使用 PV 或 StorageClass 类型的 Volume。
(4)适用场景:适合有状态类型的容器应用,以及对磁盘 1/0 性能要求不是很高的应用,例如小型数据库类的应用。这类应用如果有水平扩展的需求,则可以考虑使用 Kubernetes的StatefulSet来部署应用和存储。