K8s数据存储之详解(Detailed Explanation of K8s Data Storage)

server/2025/1/15 12:51:49/

K8s数据存储相关概念详解(临时存储,节点存储,网络存储,PV/PVC)

本篇文章分享一下存储卷和数据持久化的相关概念:

  • 存储卷概述

  • 临时存储卷(Ephemeral Volumes

  • 节点存储卷(Node-local Volumes

  • 网络存储卷(Network Volumes

  • 持久存储卷(Persistent Volumes

  • 图片

1. 存储卷概述

存储卷(Volume) 是一个抽象层,是定义在Pod资源之上,表示可以被容器挂载的存储资源。每个容器都可以通过卷来持久化或共享数据。存储卷的生命周期由 Pod 控制,Pod 被销毁时,相关的卷也会被销毁(除非是持久化存储卷)。

Kubernetes 中的存储卷有以下几个关键特性:

  • 生命周期:与 Pod 生命周期相同。Pod 启动时,存储卷被挂载到容器中,Pod 销毁时,存储卷也随之销毁(但对于持久化存储卷,存储内容会被保留)。

  • 数据共享:多个容器可以挂载同一个存储卷,从而实现数据共享和互操作。

  • 支持多种存储后端:Kubernetes 支持多种存储类型,包括本地磁盘、NFS、云存储、分布式存储等。

存储卷类型:

  • 临时存储卷

  • 节点存储卷

  • 网络存储卷

  • 持久存储卷

2. 临时存储卷

临时存储卷是与 Pod 生命周期紧密绑定的,它们在 Pod 启动时创建,并在 Pod 被销毁时删除。临时存储卷适用于容器运行时的短期数据存储需求。例如,容器内部的缓存数据或其他不需要持久化的数据。

常见的临时存储卷:

  • emptyDir:在 Pod 启动时创建,Pod 被删除时删除,适合用于容器间的临时数据交换。例如,可以用它来在多个容器之间共享数据。

  •  configMap:用于存储配置文件,将配置数据挂载为文件供容器访问。可以动态更新配置。

  • secret:用于存储敏感数据(如密码、API 密钥等),并提供加密存储和访问的能力。

  • downwardAPI:允许容器访问有关 Pod 和容器的元数据,如 Pod 名称、Pod IP 等信息。

emptyDir:配置参考

apiVersion: v1
kind: Pod
metadata:name: emptydir-example
spec:containers:- name: nginximage: nginxvolumeMounts:   - mountPath: /dataname: data-volumevolumes:- name: data-volumeemptyDir: {}

特点:

  • 数据会在 Pod 销毁时丢失。

  • 不具有持久化能力,不适用于需要持久化数据的应用场景。

3. 节点存储卷

hostPath类型的存储卷是指与某个节点直接关联的存储资源,通常用于存储与特定节点相关的数据。。它们的生命周期依赖于节点,Pod 可以使用节点存储卷进行高效的本地存储。

hostPath存储卷将主机文件系统上的某个目录挂载到 Pod 中,可以使用本地节点的磁盘资源。这种类型的存储卷适用于测试环境、存储日志文件或共享存储等。 

hostPath卷:配置参考

apiVersion: v1
kind: Pod
metadata:name: hostpath-example
spec:containers:- name: nginximage: nginxvolumeMounts:   # 定义存储卷挂载列表- mountPath: /var/log   # 容器的挂载目录name: varlogreadOnly: true  # 可选字段,默认falsevolumes:   # 定义存储卷列表- name: varloghostPath:path: /var/log   # 主机上目录位置type: Directory  # 此字段可选

常见的hostPath卷类型type

类型说明
""空字符串(默认)用于向后兼容,这意味着在安装 hostPath 卷之前不会执行任何检查。
DirectoryOrCreate路径上什么都不存在,那么将根据需要创建空目录,权限设置为 0755
Directory路径上必须存在的目录
FileOrCreate路径上什么都不存在,那么将在那里根据需要创建空文件,权限设置为 0644
File路径上必须存在的文件

特点:

  • 具有持久化能力,但仅限固定节点。

  • 适合需要在特定节点上存储数据的场景,daemonset控制器。

  • 存储卷只能在节点本地使用,无法跨节点共享(缺点)。

  • hostPath 卷的使用需要谨慎,因为它会与节点的文件系统直接交互,可能引发数据一致性和安全性问题。

4. 网络存储卷

网络存储卷是指通过网络协议将远程存储系统挂载到 Kubernetes 集群中的存储卷。它们适用于跨节点共享数据的场景,通常需要支持多 Pod 或多节点的并发访问。

常见的网络存储卷类型:

  • NFS(Network File System):通过 NFS 协议共享文件系统,多个 Pod 可以共享同一个存储卷,适用于文件存储、共享文件等场景。

  • GlusterFS:一个开源的分布式文件系统,支持高可用性和横向扩展,适用于大规模的文件存储。

  • CephFS:Ceph 的分布式文件系统,支持高可用、高性能和数据冗余,适合大规模存储系统。

    温馨提示:

  • GlusterFS在v1.25 版本中被弃用,然后在 v1.26 版本中被完全移除。

  • Ceph RBD在v1.28 版本中被弃用,并在 v1.31 版本中被完全移除。

  • NFS存储仍然支持,后期可能进入大量支持云存储阶段

4.1 NFS卷:配置参考

前提:有可用的NFS服务器并配置相应的挂载目录。

apiVersion: v1
kind: Pod
metadata:name: nfs-pod
spec:containers:- name: redisimage: redisvolumeMounts:- mountPath: /data # 挂载到容器的路径name: nfs-volumevolumes:- name: nfs-volumenfs:server: <nfs-server-ip>  # NFS服务器IPpath: /data/redis    # nfs服务器的共享路径readOnly: true   # 可选,默认为false

4.2 RBD存储卷:配置参考

前提:在Kubernetes集群外存在一个Cepht RBD存储集群,网络与集群互通。

apiVersion v1
kind: Pod
metadata:name: rbd-pod
spec:containers:- name: redisimage: redisports:- containerPort: 6379name: redisportvolumeMounts:- mountPath: /dataname: reids-rdb-volvolumes:- name: redis-rbd-volrbd:monitors:- '10.0.0.105':6789- '10.0.0.106':6789- '10.0.0.107':6789pool: k8s-rbdimage: redisfsType: xfsreadOnly: falseuser: adminsecretRef:name: ceph-secret

字段说明:

  • monitors:Ceph 存储监视器

  • image: rados image 的名称

  • pool: rados 存储名称,默认为 RBD。

  • user: rados 用户名,默认为 admin。

  • secretRef:RBD 用户认证时使用的保存有相应认证信息的 Secret 对象

  • readOnly:是否以只读的方式进行访问,默认为false。

  • fsType:要挂载的存储卷的文件系统类型,如 ext4、xfs、ntfs 等,默认为 ext4。

网络存储卷特点:

  • 支持跨节点的文件共享。

  • 适用于多容器共享数据的场景。

  • 性能可能受到网络带宽和延迟的影响。

5. 持久存储卷

持久存储卷(Persistent Volumes,简称 PV)与普通的临时存储卷不同,PV 设计用于持久化存储,在 Pod 的生命周期之外仍然存在,适用于需要长期存储的数据,如数据库、日志文件、缓存、重要的配置文件等。

持久化存储卷(PV)有两种形式:

  • 静态 PV:管理员手动预先创建并配置 PV,它绑定到一个具体的存储资源(如 NFS、iSCSI、云存储等)。PV 的生命周期与 Pod 无关,即便 Pod 被销毁,PV 中的数据仍然保留。PV 的生命周期与 Pod 无关,即便 Pod 被销毁,PV 中的数据仍然保留。

  • 动态 PV:通过 StorageClass 进行动态创建。管理员通过 StorageClass 定义存储的类型和参数,Kubernetes 会根据 PVC 请求动态创建相应的 PV。

5.1. PV 和 PVC 的关系

PV和PVC通过声明式的方式实现存储的管理:

  • PV:集群层面资源,不受namespace限制。通常与物理存储或云存储后端绑定。每个 PV 定义了存储容量、访问模式、存储类型(如 NFS、Ceph、EBS)等属性。

  • PVC:是对 PV 的请求。PVC 声明了存储需求(例如容量、访问模式等),Kubernetes 会根据 PVC 来匹配并绑定到合适的 PV。

用户通过 PVC 请求存储,Kubernetes 会自动将 PVC 和 PV 绑定。PVC 提供了对存储资源的抽象,应用程序无需关心具体的存储实现。

PV配置参考:

apiVersion: v1
kind: PersistentVolume
metadata:name: nfs-pv
spec:capacity:storage: 10GivolumeMode: FilesystemaccessModes:- ReadWriteManypersistentVolumeReclaimPolicy: RetainstorageClassName: nfs-storage-classnfs:path: /data/nfsserver: <nfs-server-ip>

PVC配置参考:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: nfs-pvc
spec:accessModes:- ReadWriteManyresources:requests:storage: 10GistorageClassName: nfs-storage-class

5.2. PV/PVC的生命周期

其实PV 的生命周期和 PVC 的生命周期是分开的,PV 的生命周期与 Pod 无关,即便 Pod 被销毁,PV 中的数据仍然保留。

PV和PVC的整体的生命周期:

图片

5.2.1. PV 的生命周期

创建完成的PV资源可能处于下面四种状态的其中一种,代表着PV资源生命周期的各个阶段

  • 可用状态(Available):当 PV 被创建时,它处于Available状态。此时,PV 可以绑定到 PVC。

  • 已绑定状态(Bound):当 PVC 与 PV 绑定时,PV 会进入Bound状态。此时,PVC 和 PV 之间存在绑定关系,存储已经被分配给 Pod。

  • 回收状态(Released):当 PVC 被删除时,PV 进入Released状态,但存储本身仍然存在,资源尚未被集群回收。

  • 失败(Falied):因自动回收资源失败而处于的故障状态,此时,PV不可用

5.2.2. PVC 的生命周期

  • Pending 状态:PVC 创建后处于 Pending 状态,表示系统正在寻找合适的 PV 来满足 PVC 的请求。

  • Bound 状态:当 PVC 与 PV 成功绑定后,PVC 会进入 Bound 状态,表示存储已经分配给 PVC。

  • Deleted 状态:当 PVC 被删除时,绑定的 PV 进入 Released 状态,存储资源的回收与否取决于 PV 的 ReclaimPolicy

5.2.3. 回收策略

ReclaimPolicy 决定了当 PVC 删除时,PV 的处理方式。常见的回收策略有:

  • Retain:保留 PV,存储资源不会被删除,数据仍然保留,需要管理员手动清理。

  • Delete:删除 PV,相关的存储资源会被删除

  • Recycle:将 PV 中的数据清除(已废弃,不推荐使用)。

5.3. PV 的访问模式

  • ReadWriteOnce (RWO):PV 可以被单个节点的一个 Pod 以读写模式访问。

  • ReadOnlyMany (ROX):多个 Pod 可以以只读模式同时访问 PV。通常用于只读文件共享存储。

  • ReadWriteMany (RWX):多个 Pod 可以以读写模式同时访问 PV。通常用于支持并发读写的网络文件系统(如 NFS、GlusterFS、CephFS)等存储后端。

5.4. 动态存储卷

动态存储卷 是通过 StorageClass 结合 PVC 实现的。

当用户创建 PVC 时,Kubernetes 根据指定的 StorageClass 动态创建相应的 PV,而无需管理员手动创建 PV。

动态存储卷使得存储管理更加灵活和自动化。

StorageClass配置参考:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: fast-storage
provisioner: kubernetes.io/aws-ebs
parameters:type: gp2fsType: ext4

StorageClass 参数解释:

  • provisioner:指定存储后端供应器。

  • parameters:可以定义与存储类型相关的参数,

总结:持久化存储特点:

  • 数据在 Pod 销毁时依然存在,数据能够跨 Pod 和节点持久化。。

  • 支持多种存储后端,包括云存储、本地存储和分布式文件系统。

  • 提供高可用性和冗余机制,保证数据的持久性和容错能力。

  • 易于备份、恢复和扩展,支持弹性和跨平台迁移。


http://www.ppmy.cn/server/158561.html

相关文章

SSE部署后无法连接问题解决

1. 问题现象 通过域名访问 https://api-uat.sfxs.com/sse/subscribe?tokenBearer%20eyJUxMiJ9.eyJhY2NvdW50IjoiYWRtaWZ0NvZGUiOiIwMDEiLCJyb2xidXNlcm5hbWUiOiLotoXnuqfnrqHnkIblkZgifQ.tlz9N61Y4 一直无法正常连接 2. 问题解决 nginx.conf进行配置 server {location /ss…

面向科研狗的服务器运维——服务器搭建维护到排障

系列文章目录 写在前面&#xff1a;某高校的苦逼计算机博士生。因为之前在高性能计算国家重点实验室做工程师&#xff0c;也负责了当时的超算节点的部分运维工作&#xff0c;所以现在也承担了组里的服务器运维工作。 文章目录 系列文章目录前言一、pandas是什么&#xff1f;…

16. C语言 字符串详解

本章目录: 前言C 字符串的基础概念字符串的定义字符串的内存表示 常见的字符串操作函数示例代码 深入探讨字符串长度计算strlen 与 sizeof 的区别 字符串操作的注意事项**1. 字符数组的大小**2. 字符数组和字符指针的区别3. 使用安全函数 字符串的遍历与格式化输出**遍历字符串…

LabVIEW水位监控系统

LabVIEW开发智能水位监控系统通过集成先进的传感技术与控制算法&#xff0c;为工业液体存储提供精确的水位调控&#xff0c;保证了生产过程的连续性与安全性。 项目背景 在化工和饮料生产等行业中&#xff0c;水位控制的准确性对保证生产安全和提高产品质量至关重要。传统的水…

初识C++(二)

六、引用 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空间&#xff0c;它和它引用的变量共用同一块内存空间。 通俗地讲&#xff0c;可以理解为一个人能够拥有多个称呼&#xff0c;这些所有的称呼都是表示这一…

基于单片机的智能花卉浇水系统的设计与实现

摘要&#xff1a; 随着人们生活水平的不断提高&#xff0c;生活节奏也越来越快。人们经常忽视办公室或者家居的花卉&#xff0c;忘记浇水。本文设计了一种基于单片机的智能浇水系统。目的是解决养殖花卉的人忘记浇水的问题。本系统以单片机AT89S52为控制芯片&#xff0c;能够按…

Jmeter命令行生成html图形化报告失败反而生成temp文件问题解决

Jmeter生成html报告命令&#xff1a; jmeter -n -t 脚本文件名 -l 日志文件名 -e -o 目录名 出现这一问题的原因有二&#xff1a; JDK版本不对&#xff0c;我原先使用JDK17&#xff0c;后来使用JDK1.8版本就解决了打开 jmeter.properties 文件&#xff08;在Jmeter根目录的bi…

【Go】Go并发编程基础详解

1. 操作系统发展历程 1.1 进程概念 进程是程序的一次运行过程&#xff0c;进程这个概念是比较抽象的&#xff0c;从来就没有标准统一的定义&#xff0c;进程主要包含三部分要素&#xff1a;程序、数据、进程控制块 程序&#xff1a;用于描述进程要完成的功能&#xff0c;是控…