当前位置: 首页 > news >正文

K8S中高级存储之PV和PVC

高级存储

PV和PVC

由于kubernetes支持的存储系统有很多,要求客户全都掌握,显然不现实。为了能够屏蔽底层存储实现的细节,方便用户使用, kubernetes引入PV和PVC两种资源对象。

  • PV(Persistent Volume)

    • PV是Kubernetes中的一个API对象,它代表集群中的一块存储,这块存储已经预先按照某种方式设置好了,并且可以被多个用户使用。PV是集群资源,由Kubernetes管理员预先配置,它们不会因Pod的终止而消失,因此被称为“持久化”。PV可以采用多种形式,例如本地存储、网络附加存储(NAS)、云存储服务等。

  • PVC(Persistent Volume Claim)

    • PVC是用户对存储的请求,它允许用户以声明式的方式请求存储资源,而无需关心存储的具体实现细节。用户定义所需的存储容量、访问模式和存储类别(如果需要),然后提交PVC请求。

image-20240523113710183

 PV(Persistent Volume)

  • PV(Persistent Volume)在Kubernetes中指的是持久化卷,它是一种存储抽象的概念,代表了集群中的一块存储,这可以是本地磁盘、网络附加存储(NAS)、或者云存储等。PV与底层存储的具体实现细节相解耦,使得Kubernetes管理员可以灵活地管理存储资源。

PV的主要特点包括
  • 独立性:PV独立于Pod存在,即使使用PV的Pod被删除,PV中的数据也不会丢失。

  • 持久性:PV在设计上用于数据的持久化存储,它们在Kubernetes集群中是长寿命的。

  • 可配置性:Kubernetes管理员可以配置PV的大小、访问模式(如ReadWriteOnce、ReadOnlyMany、ReadWriteMany)以及存储类别(StorageClass)。

  • 可重用性:PV一旦被创建,可以被多个Pod重用,只要它们的访问模式和存储需求相匹配。

  • 动态供应:通过StorageClass资源,Kubernetes可以自动创建PV以满足PVC的请求,这个过程称为动态存储供应。

 PV的生命周期
  • 创建:Kubernetes管理员根据集群的存储需求预先创建PV资源。

  • 绑定:当用户提交PVC(Persistent Volume Claim)请求时,Kubernetes会尝试找到一个匹配的PV进行绑定。

  • 使用:绑定成功后,PV可以被Pod通过PVC访问和使用。

  • 回收:当PVC被删除时,PV可以被释放并根据回收策略进行清理,以便再次使用或保持其数据。

 

PV关键配置参数
  • 存储类型

    • 定义:底层实际存储的类型,Kubernetes 支持多种存储类型,如 NFS、iSCSI、glusterFS 等,每种类型的配置都会有所不同。

    • 影响因素:不同存储类型可能支持的访问模式和回收策略不同。

  • 存储能力(capacity)

    • 定义:当前主要支持存储空间的设置(如 storage=1Gi),但未来可能会增加 IOPS、吞吐量等其他性能指标的配置。

    • 注意事项:存储能力的设置直接影响到 PV 能够提供给 Pod 的存储空间大小。

    • 访问模式(accessModes)

    • 定义:描述用户应用对存储资源的访问权限,包括:

      • ReadWriteOnce(RWO):读写权限,但只能被单个节点挂载。

      • ReadOnlyMany(ROX):只读权限,可被多个节点挂载。

      • ReadWriteMany(RWX):读写权限,可被多个节点挂载。

    • 注意事项:底层不同的存储类型可能支持的访问模式不同。

  • 回收策略(persistentVolumeReclaimPolicy)

    • 定义:当 PV 不再被使用时,对其的处理方式,包括:

      • Retain(保留):保留数据,需管理员手动清理。

      • Recycle(回收):清除 PV 中的数据。

      • Delete(删除):与 PV 相关联的后端存储完成 volume 删除操作。

    • 注意事项:底层不同的存储类型可能支持的回收策略不同。

  • 存储类别(storageClassName)

    • 定义:通过 storageClassName 参数指定一个存储类别,有助于管理和组织不同类型的存储资源。

    • 绑定规则:具有特定类别的 PV 只能与请求了该类别的 Persistent Volume Claim (PVC) 进行绑定;未设定类别的 PV 则只能与不请求任何类别的 PVC 进行绑定。

  • 状态(status)

    • 定义:PV 在生命周期中的状态,包括:

      • Available(可用):表示可用状态,尚未被任何 PVC 绑定。

      • Bound(已绑定):表示 PV 已经被 PVC 绑定。

      • Released(已释放):表示 PVC 被删除,但资源还未被集群重新声明。

      • Failed(失败):表示该 PV 的自动回收失败。

示例
  • 使用NFS作为存储,来演示PV的使用,创建3个PV,对应NFS中的3个暴露的路径

[root@k8s-master ~]# mkdir /data/pv{1..3} -p
[root@k8s-master ~]# vim /etc/exports、
[root@k8s-master ~]# cat /etc/exports
/nfstest 192.168.58.0/24(rw,no_root_squash)
/data/pv1 192.168.58.0/24(rw,no_root_squash)
/data/pv2 192.168.58.0/24(rw,no_root_squash)
/data/pv3 192.168.58.0/24(rw,no_root_squash)
[root@k8s-master ~]# exportfs -arv
exporting 192.168.58.0/24:/data/pv3
exporting 192.168.58.0/24:/data/pv2
exporting 192.168.58.0/24:/data/pv1
exporting 192.168.58.0/24:/nfstest

 

  • 创建pv配置文件

[root@k8s-master ~]# cat pv.yaml 
---
apiVersion: v1
kind: PersistentVolume
metadata:name: pv1
spec:capacity:storage: 1GiaccessModes:- ReadWriteManypersistentVolumeReclaimPolicy: Retainnfs:path: /data/pv1server: k8s-master---
apiVersion: v1
kind: PersistentVolume
metadata:name: pv2
spec:capacity:storage: 2GiaccessModes:- ReadWriteManypersistentVolumeReclaimPolicy: Retainnfs:path: /data/pv2server: k8s-master---
apiVersion: v1
kind: PersistentVolume
metadata:name: pv3
spec:capacity:storage: 3GiaccessModes:- ReadWriteManypersistentVolumeReclaimPolicy: Retainnfs:path: /data/pv3server: k8s-master
[root@k8s-master ~]# kubectl apply -f pv.yaml 
persistentvolume/pv1 created
persistentvolume/pv2 created
persistentvolume/pv3 created
[root@k8s-master ~]# kubectl get pv -w
NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
pv1    1Gi        RWX            Retain           Available                                   14s
pv2    2Gi        RWX            Retain           Available                                   14s
pv3    3Gi        RWX            Retain           Available                                   14s

当前PV的状态为available为可用状态;

PVC(Persistent Volume Claim)

PVC 的关键配置参数
  • 访问模式(accessModes)

    • 定义:描述用户应用对存储资源的访问权限。

    • 可选值

      • ReadWriteOnce:表示该卷可以被集群中的一个节点挂载为读写模式。

      • ReadOnlyMany:表示该卷可以被集群中的多个节点挂载为只读模式。

      • ReadWriteMany:表示该卷可以被集群中的多个节点同时挂载为读写模式。

    • 注意事项:不同的存储类型可能支持的访问模式不同。

  • 选择条件(selector)

    • 定义:通过 Label Selector 的设置,使 PVC 对系统中已存在的 PV 进行筛选。

    • 作用:允许 PVC 根据标签选择特定的 PV,从而实现更灵活的存储资源管理。

    • 示例matchLabels: { app: myapp } 表示 PVC 会尝试绑定标签为 { app: myapp } 的 PV。

  • 存储类别(storageClassName)

    • 定义:PVC 在定义时可以设定需要的后端存储的类别。

    • 作用:只有设置了相同 storageClassName 的 PV 才能被系统选出作为 PVC 的目标。

    • 示例storageClassName: standard 表示 PVC 要求使用名为 standard 的存储类别。

  • 资源请求(Resources)

    • 定义:PVC 中的资源请求字段用于指定 PVC 需要的最小存储空间大小。

    • 示例resources.requests.storage: 5Gi 表示 PVC 请求至少需要 5GB 的存储空间。

    • 注意事项:PVC 的资源请求必须小于或等于 PV 提供的最大存储空间,否则 PVC 无法成功绑定到 PV 上。

[root@k8s-master ~]# cat pvc.yaml 
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: pvc1namespace: test
spec:accessModes:- ReadWriteManyresources:requests:storage: 10Mi---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: pvc2namespace: test
spec:accessModes:- ReadWriteManyresources:requests:storage: 10Mi---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: pvc3namespace: test
spec:accessModes:- ReadWriteManyresources:requests:storage: 10Mi[root@k8s-master ~]# kubectl create ns test 
namespace/test created
[root@k8s-master ~]# kubectl apply -f pvc.yaml 
persistentvolumeclaim/pvc1 created
persistentvolumeclaim/pvc2 created
persistentvolumeclaim/pvc3 created
[root@k8s-master ~]# kubectl get pvc -w
^C[root@k8s-master ~]# kubectl get pvc -n test 
NAME   STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc1   Bound    pv1      1Gi        RWX                           18s
pvc2   Bound    pv2      2Gi        RWX                           18s
pvc3   Bound    pv3      3Gi        RWX                           18s
[root@k8s-master ~]# kubectl get pv -o wide
NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM       STORAGECLASS   REASON   AGE     VOLUMEMODE
pv1    1Gi        RWX            Retain           Bound    test/pvc1                           2m55s   Filesystem
pv2    2Gi        RWX            Retain           Bound    test/pvc2                           2m55s   Filesystem
pv3    3Gi        RWX            Retain           Bound    test/pvc3                           2m55s   Filesystem

 创建PVC之后PV的状态变为已绑定;

  • 创建pods.yaml, 使用pv

[root@k8s-master ~]# cat pods.yaml 
---
apiVersion: v1
kind: Pod
metadata:name: pod1namespace: test
spec:containers:- name: busyboximage: busybox:1.30command: ["/bin/sh", "-c", "while true; do echo pod1 >> /root/out.txt; sleep 10; done;"]volumeMounts:- name: volumemountPath: /root/volumes:- name: volumepersistentVolumeClaim:claimName: pvc1readOnly: false---
apiVersion: v1
kind: Pod
metadata:name: pod2namespace: test
spec:containers:- name: busyboximage: busybox:1.30command: ["/bin/sh", "-c", "while true; do echo pod2 >> /root/out.txt; sleep 10; done;"]volumeMounts:- name: volumemountPath: /root/volumes:- name: volumepersistentVolumeClaim:claimName: pvc2readOnly: false
[root@k8s-master ~]# kubectl apply -f  pods.yaml 
pod/pod1 created
pod/pod2 created
[root@k8s-master ~]# kubectl get pods -n test 
NAME   READY   STATUS              RESTARTS   AGE
pod1   0/1     ContainerCreating   0          6s
pod2   0/1     ContainerCreating   0          6s
[root@k8s-master ~]# kubectl get pods -n test  -w
NAME   READY   STATUS              RESTARTS   AGE
pod1   0/1     ContainerCreating   0          9s
pod2   0/1     ContainerCreating   0          9s
pod1   1/1     Running             0          9s
pod2   1/1     Running             0          10s
^C[root@k8s-master ~]# kubectl get pods -n test -o wide
NAME   READY   STATUS    RESTARTS   AGE   IP               NODE        NOMINATED NODE   READINESS GATES
pod1   1/1     Running   0          20s   10.244.169.129   k8s-node2   <none>           <none>
pod2   1/1     Running   0          20s   10.244.36.74     k8s-node1   <none>           <none>

"while true; do echo pod1 >> /root/out.txt; sleep 10; done;":while循环每十秒输出pod1到/root/out.txt中;

[root@k8s-master ~]#  cat /data/pv1/out.txt 
pod1
pod1
[root@k8s-master ~]# cat /data/pv2/out.txt 
pod2
pod2
pod2
[root@k8s-master ~]#  cat /data/pv1/out.txt 
pod1
pod1
pod1
pod1
pod1
pod1
pod1
pod1
pod1
pod1
pod1
pod1
pod1
pod1
pod1
pod1
pod1

相关文章:

K8S中高级存储之PV和PVC

高级存储 PV和PVC 由于kubernetes支持的存储系统有很多&#xff0c;要求客户全都掌握&#xff0c;显然不现实。为了能够屏蔽底层存储实现的细节&#xff0c;方便用户使用&#xff0c; kubernetes引入PV和PVC两种资源对象。 PV&#xff08;Persistent Volume&#xff09; PV是…...

【C语言进阶】- 动态内存管理

动态内存管理 1.1 为什么存在动态内存分配1.2 动态内存函数介绍2.1 malloc函数的使用2.2 free函数的使用2.3 calloc函数的使用2.4 realloc函数的使用3.1 常见的动态内存错误3.2 常见笔试题 1.1 为什么存在动态内存分配 我们已经掌握的内存开辟方式有&#xff1a; int val 20;…...

Python实现基于TD3(Twin Delayed Deep Deterministic Policy Gradient)算法来实时更新路径规划算法

下面是一个使用Python实现基于TD3&#xff08;Twin Delayed Deep Deterministic Policy Gradient&#xff09;算法来实时更新路径规划算法的三个参数&#xff08;sigma0&#xff0c;rho0 和 theta&#xff09;的示例代码。该算法将依据障碍物环境进行优化。 实现思路 环境定义…...

pytorch实现半监督学习

半监督学习&#xff08;Semi-Supervised Learning&#xff0c;SSL&#xff09;结合了有监督学习和无监督学习的特点&#xff0c;通常用于部分数据有标签、部分数据无标签的场景。其主要步骤如下&#xff1a; 1. 数据准备 有标签数据&#xff08;Labeled Data&#xff09;&…...

我的毕设之路:(2)系统类型的论文写法

一般先进行毕设的设计与实现&#xff0c;再在现成毕设基础上进行描述形成文档&#xff0c;那么论文也就成形了。 1 需求分析&#xff1a;毕业设计根据开题报告和要求进行需求分析和功能确定&#xff0c;区分贴合主题的主要功能和拓展功能能&#xff0c;删除偏离无关紧要的功能…...

LosslessScaling-学习版[steam价值30元的游戏无损放大/补帧工具]

LosslessScaling 链接&#xff1a;https://pan.xunlei.com/s/VOHc-yZBgwBOoqtdZAv114ZTA1?pwdxiih# 解压后运行"A-绿化-解压后运行我.cmd"...

concurrent.futures.Future对象详解:利用线程池与进程池实现异步操作

concurrent.futures.Future对象详解&#xff1a;利用线程池与进程池实现异步操作 一、前言二、使用线程池三、使用进程池四、注意事项五、结语 一、前言 在现代编程中&#xff0c;异步操作已成为提升程序性能和响应速度的关键手段。Python的concurrent.futures模块为此提供了强…...

StarRocks 安装部署

StarRocks 安装部署 StarRocks端口&#xff1a; 官方《配置检查》有服务端口详细描述&#xff1a; https://docs.starrocks.io/zh/docs/deployment/environment_configurations/ StarRocks架构&#xff1a;https://docs.starrocks.io/zh/docs/introduction/Architecture/ Sta…...

Python Matplotlib库:从入门到精通

Python Matplotlib库&#xff1a;从入门到精通 在数据分析和科学计算领域&#xff0c;可视化是一项至关重要的技能。Matplotlib作为Python中最流行的绘图库之一&#xff0c;为我们提供了强大的绘图功能。本文将带你从Matplotlib的基础开始&#xff0c;逐步掌握其高级用法&…...

线程概念、操作

一、背景知识 1、地址空间进一步理解 在父子进程对同一变量进行修改时发生写时拷贝&#xff0c;这时候拷贝的基本单位是4KB&#xff0c;会将该变量所在的页框全拷贝一份&#xff0c;这是因为修改该变量很有可能会修改其周围的变量&#xff08;局部性原理&#xff09;&#xf…...

【PySide6拓展】QSoundEffect

文章目录 【PySide6拓展】QSoundEffect 音效播放类**基本概念****什么是 QSoundEffect&#xff1f;****QSoundEffect 的特点****安装 PySide6** **如何使用 QSoundEffect&#xff1f;****1. 播放音效****示例代码&#xff1a;播放音效** **代码解析****QSoundEffect 的高级用法…...

33【脚本解析语言】

脚本语言也叫解析语言 脚本一词&#xff0c;相信很多人都听过&#xff0c;那么什么是脚本语言&#xff0c;我们在开发时有一个调试功能&#xff0c;但是发布版是需要编译执行的&#xff0c;体积比较大&#xff0c;同时这使得我们每次更新都需要重新编译&#xff0c;客户再…...

【Unity】 HTFramework框架(五十九)快速开发编辑器工具(Assembly Viewer + ILSpy)

更新日期&#xff1a;2025年1月23日。 Github源码&#xff1a;[点我获取源码] Gitee源码&#xff1a;[点我获取源码] 索引 开发编辑器工具MouseRayTarget焦点视角Collider线框Assembly Viewer搜索程序集ILSpy反编译程序集搜索GizmosElement类找到Gizmos菜单找到Gizmos窗口分析A…...

如何解决TikTok网络不稳定的问题

TikTok是目前全球最受欢迎的短视频平台之一&#xff0c;凭借其丰富多彩的内容和社交功能吸引了数以亿计的用户。然而&#xff0c;尽管TikTok在世界范围内的使用情况不断增长&#xff0c;但不少用户在使用过程中仍然会遇到网络不稳定的问题。无论是在观看视频时遇到缓冲&#xf…...

告别页面刷新!如何使用AJAX和FormData优化Web表单提交

系列文章目录 01-从零开始学 HTML&#xff1a;构建网页的基本框架与技巧 02-HTML常见文本标签解析&#xff1a;从基础到进阶的全面指南 03-HTML从入门到精通&#xff1a;链接与图像标签全解析 04-HTML 列表标签全解析&#xff1a;无序与有序列表的深度应用 05-HTML表格标签全面…...

WireShark4.4.2浏览器网络调试指南:数据统计(八)

概述 Wireshark 是一款功能强大的开源网络协议分析软件&#xff0c;被广泛应用于网络调试和数据分析。随着互联网的发展&#xff0c;以及网络安全问题日益严峻&#xff0c;了解如何使用 Wireshark进行浏览器网络调试显得尤为重要。最新的 Wireshark4.4.2 提供了更加强大的功能…...

Hypium+python鸿蒙原生自动化安装配置

Hypiumpython自动化搭建 文章目录 Python安装pip源配置HDC安装Hypium安装DevEco Testing Hypium插件安装及使用方法​​​​​插件安装工程创建区域 Python安装 推荐从官网获取3.10版本&#xff0c;其他版本可能出现兼容性问题 Python下载地址 下载64/32bitwindows安装文件&am…...

2025创业思路和方向有哪些?

创业思路和方向是决定创业成功与否的关键因素。以下是一些基于找到的参考内容的创业思路和方向&#xff0c;旨在激发创业灵感&#xff1a; 一、技术创新与融合&#xff1a; 1、智能手机与云电视结合&#xff1a;开发集成智能手机功能的云电视&#xff0c;提供通讯、娱乐一体化体…...

实验五---控制系统的稳定性分析---自动控制原理实验课

一 实验目的 1、理解控制系统稳定性的概念 2、掌握多种判定系统稳定性的原理及方法 3、掌握使用Matlab软件进行控制系统的稳定性分析 二 实验仪器 计算机&#xff0c;MATLAB仿真软件 三 实验内容及步骤 1.计算系统闭环特征根&#xff0c;判别系统稳定性&#xff1b; 2.绘制系统…...

AttributeError: can‘t set attribute ‘lines‘

报错&#xff1a; ax p3.Axes3D(fig) ax.lines [] AttributeError: cant set attribute lines 总结下来&#xff0c;解决方案应包括&#xff1a; 1. 使用ax.clear()方法清除所有内容。 2. 逐个移除lines中的元素。 3. 检查matplotlib版本&#xff0c;确保没有已知的bug。…...

Day07:缓存-数据淘汰策略

Redis的数据淘汰策略有哪些 ? &#xff08;key过期导致的&#xff09; 在redis中提供了两种数据过期删除策略 第一种是惰性删除&#xff0c;在设置该key过期时间后&#xff0c;我们不去管它&#xff0c;当需要该key时&#xff0c;我们再检查其是否过期&#xff0c;如果过期&…...

基于聚类与相关性分析对马来西亚房价数据进行分析

碎碎念&#xff1a;由于最近太忙了&#xff0c;更新的比较慢&#xff0c;提前祝大家新春快乐&#xff0c;万事如意&#xff01;本数据集的下载地址&#xff0c;读者可以自行下载。 1.项目背景 本项目旨在对马来西亚房地产市场进行初步的数据分析&#xff0c;探索各州的房产市…...

Java—工具类类使用

工具类的调用&#xff1a;工具类名.方法名 工具类的书写&#xff1a; 示例&#xff1a; 写一个遍历数组的工具类 import java.util.Arrays;public class ArrayUtil {private ArrayUtil() {} //用私有化构造方法不让外界创建关于它的对象//定义static静态方法&#xff0c;因…...

游戏开发领域 - 游戏引擎 UE 与 Unity

游戏引擎 游戏引擎是用于开发电子游戏的软件框架&#xff0c;它提供图形渲染、物理模拟、音频处理、动画系统、脚本编写等功能&#xff0c;帮助开发者高效创建电子游戏 但是&#xff0c;游戏引擎也不仅限于游戏开发&#xff0c;还广泛应用于其他领域&#xff0c;例如&#xff…...

[NVME] PMRCAP-Persistent Memory Region Capabilities

This register indicates capabilities of the Persistent Memory Region(持久内存区域) If the controller does not support the Persistent Memory Region feature, then this register shall be cleared to 0h BitsTypeResetDescription31:25RO 0hReserved24ROImpl Spec…...

Ollama windows安装

Ollama 是一个开源项目&#xff0c;专注于帮助用户本地化运行大型语言模型&#xff08;LLMs&#xff09;。它提供了一个简单易用的框架&#xff0c;让开发者和个人用户能够在自己的设备上部署和运行 LLMs&#xff0c;而无需依赖云服务或外部 API。这对于需要数据隐私、离线使用…...

vim操作简要记录

操作容易忘记&#xff0c;记录一下基本使用的 :wq保存退出 :w :q :q! :wq! i I a A 方向键 h左 j下 k上 l右 dd删除方行&#xff08;这其实是剪切行操作&#xff0c;不过一般用作删除&#xff0c;长按可删除&#xff0c;不过按.执行上一次操作删除更快&#xff09; .执行上…...

车载软件架构 --- 基于AUTOSAR软件架构的ECU开发流程小白篇

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 简单&#xff0c;单纯&#xff0c;喜欢独处&#xff0c;独来独往&#xff0c;不易合同频过着接地气的生活…...

汇编基础语法及其示例

1.汇编指令 1.1汇编指令的基本格式 <opcode>{<cond>}{s} <Rd> , <Rn> , <shifter_operand> <功能码>{<条件码>}{cpsr影响位} <目标寄存器> , <第一操作寄存器> , <第二操作数> 注&#xff1a;第一操作寄存器…...

android获取EditText内容,TextWatcher按条件触发

android获取EditText内容&#xff0c;TextWatcher按条件触发 背景&#xff1a;解决方案&#xff1a;效果&#xff1a; 背景&#xff1a; 最近在尝试用原生安卓实现仿element-ui表单校验功能&#xff0c;其中涉及到EditText组件内容的动态校验&#xff0c;初步实现功能后&#…...