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

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是…...

SVG 矩形:深入理解与实际应用

SVG 矩形&#xff1a;深入理解与实际应用 引言 SVG&#xff08;可缩放矢量图形&#xff09;是一种基于可扩展标记语言的图形矢量格式&#xff0c;用于在网页上创建矢量图形。SVG矩形是SVG图形中的一种基本形状&#xff0c;它允许用户在网页上绘制不同大小和颜色的矩形。本文将…...

高效学习方法分享

高效学习方法分享 引言 在信息高速发展的今天&#xff0c;学习已经成为每个人不可或缺的一部分。你是否曾感到学习的疲惫&#xff0c;信息的爆炸让你无从下手&#xff1f;今天&#xff0c;我们将探讨几种高效的学习方法&#xff0c;帮助你从中找到适合自己的学习之道。关于学…...

Linux---架构概览

一、Linux 架构分层的深度解析 1. 用户空间&#xff08;User Space&#xff09; 用户空间是应用程序运行的环境&#xff0c;与内核空间隔离&#xff0c;确保系统稳定性。 应用程序层&#xff1a; 用户程序&#xff1a;如 edge、vim&#xff0c;通过调用标准库&#xff08;如 …...

2501,20个窗口常用操作

窗口是屏幕上的一个矩形区域.窗口分为3种:覆盖窗口,弹窗和子窗口.每个窗口都有由系统绘画的"非客户区"和应用绘画的"客户区". 在MFC中,CWnd类为各种窗口提供了基类. 1,通过窗柄取得CWnd指针 可调用Cwnd::FromHandle函数,通过窗柄取得Cwnd指针. void CD…...

[论文总结] 深度学习在农业领域应用论文笔记14

当下&#xff0c;深度学习在农业领域的研究热度持续攀升&#xff0c;相关论文发表量呈现出迅猛增长的态势。但繁荣背后&#xff0c;质量却不尽人意。相当一部分论文内容空洞无物&#xff0c;缺乏能够落地转化的实际价值&#xff0c;“凑数” 的痕迹十分明显。在农业信息化领域的…...

蓝桥杯例题一

不管遇到多大的困难&#xff0c;我们都要坚持下去。每一次挫折都是我们成长的机会&#xff0c;每一次失败都是我们前进的动力。路漫漫其修远兮&#xff0c;吾将上下而求索。只有不断努力奋斗&#xff0c;才能追逐到自己的梦想。不要害怕失败&#xff0c;害怕的是不敢去尝试。只…...

WPF基础 | 深入 WPF 事件机制:路由事件与自定义事件处理

WPF基础 | 深入 WPF 事件机制&#xff1a;路由事件与自定义事件处理 一、前言二、WPF 事件基础概念2.1 事件的定义与本质2.2 常见的 WPF 事件类型 三、路由事件3.1 路由事件的概念与原理3.2 路由事件的三个阶段3.3 路由事件的标识与注册3.4 常见的路由事件示例 四、自定义事件处…...

C++封装红黑树实现mymap和myset和模拟实现详解

文章目录 map和set的封装map和set的底层 map和set的模拟实现insertiterator实现的思路operatoroperator- -operator[ ] map和set的封装 介绍map和set的底层实现 map和set的底层 一份模版实例化出key的rb_tree和pair<k,v>的rb_tree rb_tree的Key和Value不是我们之前传统意…...

洛谷P11464 支配剧场

支配剧场 题目背景 May all the beauty be blessed. 题目描述 布洛妮娅和符华在寻找琪亚娜的途中&#xff0c;被支配之律者困在了支配剧场的高塔回廊之中。布洛妮娅敏锐地发现&#xff0c;虚无回廊是由一些支配之律者生成的积木构成的&#xff0c;只要击碎其中一些积木&#…...

自动化数据备份与恢复:让数据安全无忧

友友们好! 我的新专栏《Python进阶》正式启动啦!这是一个专为那些渴望提升Python技能的朋友们量身打造的专栏,无论你是已经有一定基础的开发者,还是希望深入挖掘Python潜力的爱好者,这里都将是你不可错过的宝藏。 在这个专栏中,你将会找到: ● 深入解析:每一篇文章都将…...

如何用matlab画一条蛇

文章目录 源代码运行结果代码说明结果 源代码 % 画蛇的代码 % 2025-01-28/Ver1 % 清空环境 clc; clear; close all;% 定义蛇的身体坐标 t linspace(0, 4*pi, 100); % 参数化变量 x t; % x坐标 y sin(t) 0.5 * sin(3*t); % y坐标&#xff0c;形成更复…...

DVC - 数据版本和机器学习实验的命令行工具和 VS Code 扩展

文章目录 一、关于 DVC二、快速启动三、DVC的工作原理四、VS代码扩展五、安装Snapcraft&#xff08;Linux&#xff09;Chocolatey (Windows)Brew (mac OS)Anaconda (Any platform)PyPI&#xff08;Python&#xff09;Package (Platform-specific)Ubuntu / Debian (deb)Fedora /…...

理解神经网络:Brain.js 背后的核心思想

温馨提示 这篇文章篇幅较长,主要是为后续内容做铺垫和说明。如果你觉得文字太多,可以: 先收藏,等后面文章遇到不懂的地方再回来查阅。直接跳读,重点关注加粗或高亮的部分。放心,这种“文字轰炸”不会常有的,哈哈~ 感谢你的耐心阅读!😊 欢迎来到 brain.js 的学习之旅!…...

Maui学习笔记- SQLite简单使用案例02添加详情页

我们继续上一个案例&#xff0c;实现一个可以修改当前用户信息功能。 当用户点击某个信息时&#xff0c;跳转到信息详情页&#xff0c;然后可以点击编辑按钮导航到编辑页面。 创建项目 我们首先在ViewModels目录下创建UserDetailViewModel。 实现从详情信息页面导航到编辑页面…...

typescript 简介

可选链操作符 可选链操作符( ?. ) 允许读取位于连接对象链深处的属性的值&#xff0c;而不必明确验证链中的每个引用是否有效。?. 操作符的功能类似于 . 链式操作符&#xff0c;不同之处在于&#xff0c;在引用为空(nullish ) (null 或者 undefined) 的情况下不会引起错误&a…...

selenium定位网页元素

1、概述 在使用 Selenium 进行自动化测试时&#xff0c;定位网页元素是核心功能之一。Selenium 提供了多种定位方法&#xff0c;每种方法都有其适用场景和特点。以下是通过 id、linkText、partialLinkText、name、tagName、xpath、className 和 cssSelector 定位元素的…...

Autogen_core 测试代码:test_cache_store.py

目录 原始代码测试代码代码中用到的typing注解 原始代码 from typing import Dict, Generic, Optional, Protocol, TypeVarT TypeVar("T")class CacheStore(Protocol, Generic[T]):"""This protocol defines the basic interface for store/cache o…...

变压器的漏感

测量变压器漏感的时候需要将次级绕组短路&#xff1a; 测量变压器初级线圈的电感方法很简单&#xff0c;直接用LCR测量就可&#xff0c;无需像测量漏感那样将次级绕组短接&#xff1a;...

【新春特辑】2025年春节技术展望:蛇年里的科技创新与趋势预测

&#x1f525;【新春特辑】2025年春节技术展望&#xff1a;蛇年里的科技创新与趋势预测 &#x1f4c5; 发布日期&#xff1a;2025年01月29日&#xff08;大年初一&#xff09; 在这个辞旧迎新的美好时刻&#xff0c;我们迎来了充满希望的2025年&#xff0c;也是十二生肖中的蛇…...

cursor软件的chat和composer分别是什么

Cursor 是一款基于人工智能的代码编辑器&#xff0c;集成了类似 ChatGPT 的功能&#xff0c;旨在帮助开发者更高效地编写代码。以下是 Cursor 中 Chat 和 Composer 的具体功能&#xff1a; 1. Chat Cursor 中的 Chat 是一个基于 AI 的聊天功能&#xff0c;类似于 ChatGPT&…...

从ChatGPT热潮看智算崛起

2025年1月7日&#xff0c;科智咨询发布《2025年IDC产业七大发展趋势》&#xff0c;其中提到“ChatGPT开启生成式AI热潮&#xff0c;智能算力需求暴涨&#xff0c;算力供给结构发生转变”。 【图片来源于网络&#xff0c;侵删】 为何会以ChatGPT发布为节点呢&#xff1f;咱们一起…...

攻克 AI 幻觉难题

当下&#xff0c;AI 已经成为我们生活中不可或缺的一部分。无论是智能语音助手&#xff0c;还是对话式的AI模型&#xff0c;它们凭借强大的算法和海量的数据&#xff0c;为我们答疑解惑、出谋划策。 然而&#xff0c;小编今天向AI提问&#xff1a;上山打老虎。他却回答&#x…...

格式化时间的插件

1.安装dayjs包 npm i dayjs 2.组件中的应用...

自创《艺术人生》浅析

艺术是生活的馈赠&#xff0c;艺术是苦痛的呻吟。 笔记模板由python脚本于2025-01-29 00:01:11创建&#xff0c;本篇笔记适合喜欢写诗读诗诵诗的coder翻阅。 【学习的细节是欢悦的历程】 博客的核心价值&#xff1a;在于输出思考与经验&#xff0c;而不仅仅是知识的简单复述。 …...

【Python-办公自动化】实现自动化输出json数据类型的分析报告和正逆转换

分析报告 import json from pprint import pprint, PrettyPrinterdef analyze_energy_data(file_path):"""能源数据分析与结构查看函数参数:file_path (str): JSON文件路径功能:1. 加载并解析JSON数据2. 显示数据结构概览3. 交互式结构探索"""…...

防御保护第一次实验:安全策略配置

一、实验拓扑 二、实验要求 三、需求分析 1.创建两个vlan 2.在ENSP中配置基于时间的ACL实现对于办公区PC访问OA Server的时间限制&#xff08;工作日早8到晚6&#xff09;。 3.通过配置基于MAC地址的ACL来实现对于生产区PC访问Web Server的限制&#xff08;除PC3外不能访问&am…...

【Pytest】生成html报告中,中文乱码问题解决方案

链接上一篇文章:https://blog.csdn.net/u013080870/article/details/145369926?spm1001.2014.3001.5502 中文乱码问题&#xff0c;python3&#xff0c;Python3.7后&#xff0c;还一个文件就是result.py 因为中文可以在内容中&#xff0c;也可能在文件名&#xff0c;类名&…...

【ollama通过命令行启动后如何在网页端查看运行】

ollama通过命令行启动后如何在网页端查看运行 http://localhost:11434/...

Android createScaledBitmap与Canvas通过RectF drawBitmap生成马赛克/高斯模糊(毛玻璃)对比,Kotlin

Android createScaledBitmap与Canvas通过RectF drawBitmap生成马赛克/高斯模糊&#xff08;毛玻璃&#xff09;对比&#xff0c;Kotlin import android.graphics.Bitmap import android.graphics.BitmapFactory import android.graphics.Canvas import android.graphics.RectF …...