当前位置: 首页 > 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。…...

3步颠覆文献管理:让Zotero格式修复效率提升10倍的实战指南

3步颠覆文献管理&#xff1a;让Zotero格式修复效率提升10倍的实战指南 【免费下载链接】zotero-format-metadata Linter for Zotero. A plugin for Zotero to format item metadata. Shortcut to set title rich text; set journal abbreviations, university places, and item…...

别再买错千元投影! 哈趣Q1Pro藏看越级体验

当下的智能投影市场正经历着深度的“去伪存真”变革&#xff0c;行业洗牌加速的同时&#xff0c;也让消费者的选购变得愈发谨慎。洛图科技数据显示&#xff0c;2025年国内智能投影市场整体销量下滑&#xff0c;其中低端投影成为调整重灾区&#xff0c;0-499元价位段销量同比大跌…...

忍者像素绘卷效果实测:同一Prompt下不同步数对像素锐度影响对比分析

忍者像素绘卷效果实测&#xff1a;同一Prompt下不同步数对像素锐度影响对比分析 1. 测试背景与目的 忍者像素绘卷作为一款基于Z-Image-Turbo深度优化的图像生成工具&#xff0c;其独特的16-Bit复古游戏美学风格吸引了大量创作者。在实际使用中&#xff0c;我们发现"描绘…...

5步精通Trilium中文版:构建高效个人知识管理系统

5步精通Trilium中文版&#xff1a;构建高效个人知识管理系统 【免费下载链接】trilium-translation Translation for Trilium Notes. Trilium Notes 中文适配, 体验优化 项目地址: https://gitcode.com/gh_mirrors/tr/trilium-translation 认识Trilium&#xff1a;重新定…...

手把手教你编译运行openHiTLS社区的FrodoKEM源码(附完整环境配置)

从零构建FrodoKEM开发环境&#xff1a;openHiTLS社区源码实战指南 当量子计算机从理论走向现实&#xff0c;传统加密算法正面临前所未有的挑战。FrodoKEM作为后量子密码学领域的明星算法&#xff0c;以其坚实的数学基础和简洁的实现逻辑&#xff0c;成为开发者探索抗量子加密技…...

Lingyuxiu MXJ LoRA开源镜像指南:从下载到生成的完整开箱即用流程

Lingyuxiu MXJ LoRA开源镜像指南&#xff1a;从下载到生成的完整开箱即用流程 1. 项目简介 Lingyuxiu MXJ LoRA 是一款专门为生成唯美真人风格人像而设计的轻量级AI图像生成系统。这个项目最大的特点就是针对人像摄影进行了深度优化&#xff0c;能够生成五官精致、光影柔和、…...

消息防撤回方案:RevokeMsgPatcher的通讯内容保护实践

消息防撤回方案&#xff1a;RevokeMsgPatcher的通讯内容保护实践 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁&#xff08;我已经看到了&#xff0c;撤回也没用了&#xff09; 项目地址: https://gitcode.com…...

数据库优化:高效查询GUID的技巧

在日常的数据库操作中,如何高效地查询数据是一个永恒的话题。特别是当我们处理大型数据集和需要在文本字段中查找特定模式(如GUID)时,查询效率显得尤为关键。今天,我将分享一种优化查询GUID的方法,帮助你从长达数小时的查询时间中解脱出来。 背景 假设我们有一个数据库…...

蓝桥杯备赛:Floyd、Bellman-Ford、Dijkstra,三大最短路算法到底怎么选?(附场景对比与代码模板)

蓝桥杯竞赛&#xff1a;Floyd、Bellman-Ford、Dijkstra三大最短路算法实战指南 在算法竞赛的战场上&#xff0c;最短路问题就像是一道必考题&#xff0c;而Floyd、Bellman-Ford和Dijkstra这三大算法则是解题的利器。但很多选手在面对具体问题时常常陷入选择困难&#xff1a;该用…...

单片机:从核心原理到智能应用实战

1. 单片机&#xff1a;智能时代的微型大脑 想象一下清晨醒来&#xff0c;窗帘自动拉开&#xff0c;咖啡机开始工作&#xff0c;室内温度始终保持在最舒适的状态——这些看似简单的智能场景背后&#xff0c;都藏着一个不起眼却至关重要的核心部件&#xff1a;单片机。这块比硬币…...