跳转至

kubernetes 持久化存储卷

存储卷介绍

pod 有生命周期,生命周期结束后 pod 里的数据会消失(如配置文件,业务数据等)。

解决: 我们需要将数据与pod分离,将数据放在专门的存储卷上

pod 在 k8s 集群的节点中是可以调度的, 如果 pod 挂了被调度到另一个节点,那么数据和 pod 的联系会中断。

解决: 所以我们需要与集群节点分离的存储系统才能实现数据持久化

简单来说: volume提供了在容器上挂载外部存储的能力

存储卷的分类

kubernetes 支持的存储卷类型非常丰富,使用下面的命令查看:

kubectl explain pod.spec.volumes 参考: https://kubernetes.io/docs/concepts/storage/

kubernetes 支持的存储卷列表如下:

进行简单的分类:

- 本地存储卷 
    - emptyDir    pod删除,数据也会被清除, 用于数据的临时存储
    - hostPath     宿主机目录映射(本地存储卷)
- 网络存储卷
    - NAS类           nfs等
    - SAN类           iscsi,FC等
    - 分布式存储   glusterfs,cephfs,rbd,cinder等
    - 云存储           aws,azurefile等

存储卷的选择

市面上的存储产品种类繁多, 但按应用角度主要分为三类:

  • 文件存储 如:nfs,glusterfs,cephfs等
  • 优点: 数据共享(多pod挂载可以同读同写)
  • 缺点: 性能较差
  • 块存储 如: iscsi,rbd等
  • 优点: 性能相对于文件存储好
  • 缺点: 不能实现数据共享(部分)
  • 对象存储 如: ceph对象存储
  • 优点: 性能好, 数据共享
  • 缺点: 使用方式特殊,支持较少

面对kubernetes支持的形形色色的存储卷,如何选择成了难题。在选择存储时,我们要抓住核心需求:

  • 数据是否需要持久性
  • 数据可靠性 如存储集群节点是否有单点故障,数据是否有副本等
  • 性能
  • 扩展性 如是否能方便扩容,应对数据增长的需求
  • 运维难度 存储的运维难度是比较高的,尽量选择稳定的开源方案或商业产品
  • 成本

总之, 存储的选择是需要考虑很多因素的, 熟悉各类存储产品, 了解它们的优缺点,结合自身需求才能选择合适自己的。

image-20240509144149243

下面是一个用于选择 Kubernetes 存储的流程图,帮助你根据不同的需求和场景选择合适的存储类型。

graph LR
    classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
    classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px

    A([开始]):::startend --> B{是否需要持久化存储?}:::decision
    B -->|否| C[使用EmptyDir<br>适用于容器内临时存储,Pod删除数据丢失]:::process
    B -->|是| D{是否需要跨节点共享存储?}:::decision
    D -->|是| E{共享模式及性能需求}:::decision
    D -->|否| F{性能要求如何?}:::decision
    F -->|高| G[选择本地PV或块存储<br>如EBS/PD/RBD,适用于单节点高性能读写]:::process
    F -->|中| H[选择网络块存储]:::process
    F -->|低| I[选择文件存储<br>如CephFS/GlusterFS,适用于多节点文件共享且延迟敏感场景]:::process
    E -->|多节点读写 - 高吞吐| J[对象存储<br>如S3/MinIO,适合海量非结构化数据存储]:::process
    E -->|多节点读写 - 低延迟| K[文件存储<br>如CephFS/GlusterFS,适用于多节点文件共享且对延迟敏感场景]:::process
    E -->|动态扩展| L[CSI兼容存储<br>方便存储资源动态管理,适合集群规模可变场景]:::process
    C --> M([结束]):::startend
    G --> M
    H --> M
    I --> M
    J --> M
    K --> M
    L --> M