k8s pv(PersistentVolume) 状态含义
一、PV 状态含义
在Kubernetes中,PersistentVolume
(PV)有几种不同的状态,这些状态反映了PV的生命周期和可用性。以下是主要的PV状态及其含义:
-
Available
: 表示该PV尚未被任何PersistentVolumeClaim
(PVC)绑定,且可供使用。Kubernetes的存储类机制可能会自动将具有此状态的PV绑定到合适的PVC上,尤其是当PVC请求与PV的存储类相匹配时。 -
Bound
: 当PV被成功绑定到一个PVC上时,其状态变为Bound。这意味着PV现在专属于那个PVC,直到PVC被删除或释放。绑定后,Pod可以通过PVC访问PV提供的存储。 -
Released
: 当与PV绑定的PVC被删除,但PV的回收策略(Reclaim Policy)设置为Retain
时,PV会进入Released状态。此时,PV虽然不再被任何PVC引用,但其上的数据会被保留,等待手动回收或重新绑定。 -
Failed
: 如果在PV的生命周期中发生了某些错误,如自动绑定失败等,PV可能会进入Failed状态。 -
Pending
: 在某些情况下,如PV正等待与其他系统资源(如存储插件)的交互完成,或者等待满足特定条件(如标签选择器匹配),PV可能会处于Pending状态。这表明PV当前还不能被使用。 -
Terminating
: 当PV的回收策略设置为Delete
,并且开始执行删除流程时,PV会进入Terminating状态。这表示PV正在被Kubernetes系统清理,但尚未完全删除。
二、存储类 StorageClass(sc)
在Kubernetes中,存储类(StorageClass) 是一个核心概念,用于描述存储的类型、特性和动态供应策略。它是Kubernetes存储资源模型的一个重要组成部分,旨在提供存储资源的自动化和灵活管理,特别是在有状态应用的部署中。
2.1、存储类种类
通用型(General Purpose): 这是最基础的存储类型,适用于大部分工作负载,平衡了成本和性能。例如,EBS(Amazon Web Services的 Elastic Block Store)中的gp2
就常被用作通用存储类。
高性能(High Performance): 专为需要快速读写速度和低延迟
的应用设计,通常基于SSD等高性能介质。AWS EBS的io1
或者GCP的pd-ssd
就是高性能存储类的例子。
低成本(Low Cost): 侧重于成本效益,可能牺牲一定的性能,适合对I/O要求不高的应用场景。例如,使用旋转硬盘(HDD)的存储类,如AWS EBS的sc1
或GCP的pd-standard
。
本地存储(Local Storage): 利用节点上的直接附加存储(如NVMe SSD或HDD),提供高性能和低延迟,但不提供跨节点的持久性。Kubernetes中有如local-storage这样的存储类示例。
只读(ReadOnly): 特殊用途的存储类,用于挂载只读数据,如镜像或者不可更改的参考数据。这可能涉及到特定的存储后端配置,以确保数据不可写。
加密存储(Encrypted): 提供加密功能的存储类,确保数据在静止状态下也是安全的。大多数云提供商支持配置加密的存储类。
2.2、 动态卷供应器
Kubernetes的动态卷供应器(Dynamic Volume Provisioner)是一个核心功能,它允许**自动创建和管理PersistentVolumes(PV)**以响应PersistentVolumeClaims(PVC)的需求。这简化了存储资源的管理和配置,特别是在有状态应用的部署场景下,无需手动创建和管理PV。动态供应器根据存储类(StorageClass)的定义,与云提供商或其他存储后端集成,按需供应存储资源。
动态卷供应器的工作原理
-
用户请求: 用户通过创建PVC来请求存储资源,PVC中可以指定所需存储类的名称。
-
存储类匹配: Kubernetes检查PVC中指定的存储类,寻找与之匹配的存储类配置。
-
动态供应: 一旦找到匹配的存储类,且该类配置为动态供应,Kubernetes就会调用相应的动态供应器插件。
-
资源创建: 动态供应器插件根据存储类的参数和限制,向底层存储系统(如云存储服务、本地磁盘阵列等)发出请求,创建相应的存储资源。
-
PV注册: 创建完成后,动态供应器会在Kubernetes集群中注册一个新的PV,并将其绑定到原始的PVC上,完成存储资源的供应过程。
常见动态卷供应器
AWS EBS
: 为Amazon Web Services的Elastic Block Store(EBS)提供动态供应支持,可以按需创建GP2、IO1、ST1、SC1
等不同类型的EBS卷。
Google Persistent Disk (GPD)
: 与Google Cloud Platform的Persistent Disk集成,支持多种磁盘类型,如SSD(pd-ssd)、标准硬盘(pd-standard)等。
Azure Disk
: 针对Microsoft Azure的托管磁盘服务,允许动态创建Premium SSD、Standard SSD和Standard HDD等磁盘。
OpenStack Cinder
: 为OpenStack环境中的Cinder块存储提供动态供应能力。
Local Volume Provisioner
: 支持在Kubernetes节点上的本地磁盘上动态供应存储,适用于需要高性能或成本效益的场景,但不提供跨节点的高可用性。
Rook
: Rook是一个开源存储编排平台,特别为Ceph分布式存储系统设计了动态供应器,允许在Kubernetes中无缝集成和管理Ceph存储。
Longhorn
: 一个轻量级、云原生的分布式块存储解决方案,提供了Kubernetes的动态卷供应能力。
配置示例:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-storage
provisioner: k8s-sigs.io/nfs-subdir-external-provisioner
parameters:
archiveOnDelete: "false"
三、pv 回收策略
在Kubernetes(k8s)中,PersistentVolume (PV) 的回收策略定义了当与之关联的 PersistentVolumeClaim (PVC)
被删除时,PV 应该如何处理。回收策略是存储类(StorageClass)定义中的一个关键属性,影响着存储资源的生命周期管理。Kubernetes支持三种基本的PV回收策略:
1. Retain(保留)
- 描述:当PVC被删除时,PV的回收策略为
Retain
,则PV不会被Kubernetes自动回收或删除。其状态会变为Released
,意味着PV不再被任何PVC绑定,但仍然存在于集群中,并且保留其上的数据。 - 使用场景:适合于那些希望手动管理PV生命周期和数据的场景,或者计划将来重新使用相同PV的情况。
2. Recycle(回收)【已废弃】
- 描述:该策略曾经用于清理PV上的数据以便重用,但在Kubernetes v1.7之后已被废弃,不再推荐使用,因为它不安全且功能有限,无法处理非空目录或特定于卷插件的数据。
- 注意:尽管仍可能在一些较旧的文档或遗留集群中见到,但现代实践中不应使用
Recycle
策略。
3. Delete(删除)
- 描述:当PVC被删除,且PV的回收策略设置为
Delete
时,Kubernetes会自动删除对应的PV。如果PV是动态供应的(即通过动态卷供应器创建的),这通常意味着底层的存储资源也会被云提供商或存储系统清理。 - 使用场景:适用于大多数动态供应的存储场景,特别是当不需要保留数据,或数据有其他备份方案时。这是最常用的回收策略,因为它简化了资源管理,避免了资源泄漏。
配置回收策略
回收策略通常在创建StorageClass时指定,并通过.spec.reclaimPolicy
字段设置。例如,创建一个回收策略为Delete
的StorageClass的YAML片段如下:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2
reclaimPolicy: Delete
四、直接附加存储(Direct Attached Storage, DAS)
Linux下的直接附加存储(Direct Attached Storage, DAS)是一种传统的存储架构,其中存储设备(如硬盘驱动器、固态硬盘)直接连接到单一的计算机或服务器上,而不是通过网络共享。这种存储方式在Linux系统中广泛应用于各种场景,从个人电脑到企业级服务器均有应用。DAS的特点和组件包括:
特点
-
性能:由于数据直接在服务器内部或通过高速接口(如SATA、SAS、PCIe NVMe)传输,DAS往往能提供较低的延迟和较高的吞吐量,适合I/O密集型应用。
-
成本:相较于网络存储解决方案(如NAS或SAN),DAS的初始成本可能更低,因为不需要复杂的网络存储硬件和软件。
-
简易性:配置和管理相对简单,通常只需要操作系统层面的设置,无需复杂的网络存储配置。
-
扩展性限制:DAS直接与单个主机相连,因此扩展存储容量或共享存储资源较为困难,限制了其在大规模或高可用性环境中的应用。
组件
- 硬盘驱动器:传统机械硬盘(HDD)或固态硬盘(SSD)是最基本的存储媒介。
- 控制器:如SATA、SAS控制器或主板集成的控制器,管理硬盘与系统的通信。
- 接口:如SATA、SAS、USB、Thunderbolt、PCIe等,用于物理连接存储设备。
- RAID控制器(可选):用于配置硬盘为RAID阵列,提高数据冗余或性能。
- Linux内核存储子系统:管理存储设备的识别、配置和访问,如使用
/dev/sd*
、/dev/nvme*
等设备文件。
应用场景
- 个人电脑和工作站:直接使用内置硬盘或通过USB、Thunderbolt外接硬盘。
- 小型服务器:作为操作系统或应用程序的存储,特别是在不需要共享存储的场景。
- 数据库服务器:对于一些对I/O性能要求极高的应用,直接附加高性能SSD可以提供最优性能。
- 备份和归档:作为离线备份或长期数据存储的解决方案。
参考文档
1、https://blog.csdn.net/Tiger_lin1/article/details/132545249
2、https://www.cnblogs.com/rdchenxi/p/17113820.html
3、https://www.cnblogs.com/bitepeng/p/4142676.html
4、https://cloud.tencent.com/developer/techpedia/1594
4、https://developer.aliyun.com/article/1556480