21、架构-持久化存储

1、Kubernetes存储设计

Kubernetes在存储设计上秉承声明式API和资源抽象的理念,用户通过声明存储需求,Kubernetes负责调度和管理实际的存储资源。以下是Kubernetes存储设计中的核心概念和机制。

Mount和Volume

在Kubernetes中,Volume和Mount是实现持久化存储的基础概念。

  • Mount:将存储设备挂载到容器的文件系统中,使得容器可以访问和使用该存储设备。Mount是容器访问外部存储的入口。

  • Volume:用于描述一个存储单元,可以是持久性的(PersistentVolume,PV)或临时性的(如emptyDir、configMap)。Volume在Kubernetes中被定义为一种抽象,使得不同类型的存储设备(如本地磁盘、NFS、云存储等)能够被统一管理。

    在Kubernetes中,每个Pod可以声明多个Volume,并将其挂载到容器内的指定路径。这些Volume在Pod生命周期内保持一致,即使Pod中的容器重启,Volume的数据也不会丢失 。

静态存储分配

静态存储分配模式下,管理员提前创建并配置存储资源,用户通过声明来请求这些预先分配的资源。

  • PersistentVolume(PV):PV是集群中的一块存储资源,独立于具体的Pod。管理员通过YAML文件定义PV的属性,包括存储容量、访问模式(如ReadWriteOnce、ReadOnlyMany、ReadWriteMany)和存储类型(如NFS、iSCSI、AWS EBS)。

  • PersistentVolumeClaim(PVC):PVC是用户对存储资源的请求,类似于Pod对计算资源的请求。用户通过PVC声明需要的存储容量和访问模式,Kubernetes根据PVC匹配合适的PV。如果找到匹配的PV,Kubernetes会将其绑定到PVC,用户的Pod可以通过PVC访问对应的存储资源 。

静态分配模式适用于小规模集群和预先确定的存储需求,但在大规模动态环境中,手工管理PV和PVC会变得复杂且低效。

动态存储分配

动态存储分配通过自动化机制为用户提供灵活的存储资源,适应大规模集群的需求。

  • StorageClass:StorageClass定义了存储资源的类别和属性,是动态分配PV的模板。管理员通过StorageClass指定存储类型、配置参数和Provisioner(负责实际创建存储的插件)。

  • 动态分配流程:当用户创建PVC时,可以指定StorageClass,Kubernetes根据PVC和StorageClass的配置自动创建PV并绑定PVC。这种方式减少了管理员的手工操作,提高了存储管理的效率和灵活性 。

动态分配使得Kubernetes能够根据需求自动调度和分配存储资源,满足应用的动态变化和扩展需求。

2、容器存储与生态

Kubernetes的存储生态系统支持多种存储插件和接口,提供灵活多样的存储解决方案,以满足不同应用场景的需求。以下是Kubernetes存储架构及其主要组件和扩展机制。

Kubernetes存储架构

Kubernetes存储架构由多个组件协同工作,确保存储资源的高效管理和可靠访问。

  • PV控制器:负责监控和管理PV的生命周期,包括创建、绑定和删除。

  • PVC控制器:处理PVC的创建和绑定请求,确保PVC与合适的PV匹配。

  • Volume管理器:在节点上管理Volume的挂载和卸载操作,确保容器能够访问所需的存储设备 。

这些组件共同保证了Kubernetes存储的自动化管理和可靠性,使用户能够专注于应用本身而无需担心底层存储的细节。

FlexVolume与CSI

Kubernetes支持两种主要的存储扩展机制:FlexVolume和CSI(Container Storage Interface)。

  • FlexVolume:FlexVolume是一种Kubernetes早期的存储扩展机制,通过可执行文件实现存储操作。它支持多种存储后端,但由于实现方式较为简单,功能有限,FlexVolume逐渐被CSI所取代 。

  • CSI(Container Storage Interface):CSI是Kubernetes的标准存储接口,通过定义统一的API,使得任何存储供应商都可以为Kubernetes开发存储插件。CSI插件可以动态加载,支持更灵活的存储管理和扩展。CSI的引入使得Kubernetes的存储生态更加开放和多样化 。

从In-Tree到Out-of-Tree

最初,Kubernetes将存储驱动集成在核心代码中(In-Tree),以快速支持各种存储系统。然而,这种方式导致核心代码庞大且难以维护。为了提高灵活性和安全性,Kubernetes开始迁移到Out-of-Tree模式,通过CSI插件实现存储驱动的扩展。

  • In-Tree驱动:内置于Kubernetes核心代码中的存储驱动,直接由Kubernetes管理。
  • Out-of-Tree驱动:通过CSI接口实现的存储驱动,独立于Kubernetes核心代码,由外部插件管理和更新。

这种迁移使得Kubernetes能够更灵活地添加和修改存储驱动,减少了核心代码的复杂性,提高了系统的可靠性和安全性 。

容器插件生态

Kubernetes的容器存储生态系统已经形成了丰富的插件环境,支持多种存储类型和实现。

  • 块存储:适用于高性能、低延迟的应用场景,如数据库和虚拟机磁盘。常见插件包括AWS EBS、GCE PD、vSphere等。

  • 文件存储:适用于需要共享访问的场景,如日志和配置文件。常见插件包括NFS、GlusterFS、CephFS等。

  • 对象存储:适用于大规模、非结构化数据存储,如备份和媒体文件。常见插件包括Amazon S3、OpenStack Swift、MinIO等 。

这些插件通过CSI接口实现,用户可以根据实际需求选择合适的存储方案,构建高效可靠的容器存储系统。

总结

持久化存储是容器化应用的重要组成部分。Kubernetes通过静态和动态存储分配机制、丰富的存储插件生态系统,提供了强大的持久化存储支持。无论是块存储、文件存储还是对象存储,Kubernetes都能通过灵活的存储架构和扩展机制,满足不同应用场景的需求,确保数据的可靠性和持久性。Kubernetes的存储设计不仅提升了存储管理的效率和灵活性,还为云原生应用的发展提供了坚实的基础。

相关推荐
没书读了3 分钟前
ssm框架-spring-spring声明式事务
java·数据库·spring
求积分不加C9 分钟前
-bash: ./kafka-topics.sh: No such file or directory--解决方案
分布式·kafka
nathan052911 分钟前
javaer快速上手kafka
分布式·kafka
小二·11 分钟前
java基础面试题笔记(基础篇)
java·笔记·python
开心工作室_kaic34 分钟前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
懒洋洋大魔王35 分钟前
RocketMQ的使⽤
java·rocketmq·java-rocketmq
武子康40 分钟前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud
qq_17448285751 小时前
springboot基于微信小程序的旧衣回收系统的设计与实现
spring boot·后端·微信小程序
转世成为计算机大神1 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式
qq_327342732 小时前
Java实现离线身份证号码OCR识别
java·开发语言