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: 1Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  nfs:
    path: /data/pv1
    server: k8s-master

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv2
spec:
  capacity:
    storage: 2Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  nfs:
    path: /data/pv2
    server: k8s-master

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv3
spec:
  capacity:
    storage: 3Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  nfs:
    path: /data/pv3
    server: 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: pvc1
  namespace: test
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 10Mi

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc2
  namespace: test
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 10Mi

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc3
  namespace: test
spec:
  accessModes:
  - ReadWriteMany
  resources:
    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: pod1
  namespace: test
spec:
  containers:
  - name: busybox
    image: busybox:1.30
    command: ["/bin/sh", "-c", "while true; do echo pod1 >> /root/out.txt; sleep 10; done;"]
    volumeMounts:
    - name: volume
      mountPath: /root/
  volumes:
  - name: volume
    persistentVolumeClaim:
      claimName: pvc1
      readOnly: false

---
apiVersion: v1
kind: Pod
metadata:
  name: pod2
  namespace: test
spec:
  containers:
  - name: busybox
    image: busybox:1.30
    command: ["/bin/sh", "-c", "while true; do echo pod2 >> /root/out.txt; sleep 10; done;"]
    volumeMounts:
    - name: volume
      mountPath: /root/
  volumes:
  - name: volume
    persistentVolumeClaim:
      claimName: pvc2
      readOnly: 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/961647.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IVD设备-GB4793.1 安规理解笔记

IVD设备-GB4793.1 安规理解笔记 参考国标文档 GB4793.1接地电阻试验试验通过的标准 耐压试验试验通过的标准 浮地危险带电部分与可触及导电零部件之间耐压试验通过的标准 参考国标文档 GB4793.1 接地电阻试验 图1GB 4793.1-2007标准 附录F.2 ⌘根据F.1要求内容是关保护接地电…

“AI视频智能分析系统:让每一帧视频都充满智慧

嘿&#xff0c;大家好&#xff01;今天咱们来聊聊一个特别厉害的东西——AI视频智能分析系统。想象一下&#xff0c;如果你有一个超级聪明的“视频助手”&#xff0c;它不仅能自动识别视频中的各种元素&#xff0c;还能根据内容生成详细的分析报告&#xff0c;是不是感觉特别酷…

002-基于Halcon的图像几何变换

本节将简要介绍Halcon中有关图像几何变换的基本算子及其应用&#xff0c;主要涉及五种常见的二维几何变换形式&#xff1a;平移、镜像、旋转、错切和放缩。这几种变换可归结为一类更高级更抽象的空间变换类型&#xff0c;即仿射变换&#xff08;Affine transformation&#xff…

七、深入了解SpringBoot的配置文件

一、配置端口号 通过配置文件application.properties配置修改端口号 修改 application.properties 文件 #端口号修改成 9090 server.port9090运行结果&#xff0c;观察日志 二、配置文件格式 Spring Boot 配置⽂件有以下三种&#xff1a; • application.properties • ap…

【Kubernetes】Pod生命周期、初始化容器、主容器

一、Pod生命周期 Pod从创建到终止退出的时间范围称为Pod生命周期。 1、生命周期重要流程 创建基础容器&#xff08;pause container&#xff09;初始化容器&#xff08;init-X Containers&#xff09;主容器&#xff08;container&#xff09;启动后的钩子(post-start)启动探…

网络爬虫学习:应用selenium获取Edge浏览器版本号,自动下载对应版本msedgedriver,确保Edge浏览器顺利打开。

一、前言 我从24年11月份开始学习网络爬虫应用开发&#xff0c;经过2个来月的努力&#xff0c;于1月下旬完成了开发一款网络爬虫软件的学习目标。这里对本次学习及应用开发进行一下回顾总结。 前几天我已经发了一篇日志&#xff08;网络爬虫学习&#xff1a;应用selenium从搜…

python学opencv|读取图像(四十九)原理探究:使用cv2.bitwise()系列函数实现图像按位运算

【0】基础定义 按位与运算&#xff1a;两个等长度二进制数上下对齐&#xff0c;全1取1&#xff0c;其余取0。 按位或运算&#xff1a;两个等长度二进制数上下对齐&#xff0c;有1取1&#xff0c;其余取0。 按位异或运算&#xff1a; 两个等长度二进制数上下对齐&#xff0c;相…

U盘打开提示格式化:深度解析与数据恢复全攻略

在数字化时代&#xff0c;U盘作为便捷的数据存储和传输工具&#xff0c;广泛应用于各个领域。然而&#xff0c;当我们满怀期待地插入U盘&#xff0c;却遭遇“U盘打开提示格式化”的尴尬局面时&#xff0c;那份焦虑与无助感油然而生。本文将全面剖析U盘打开提示格式化的原因、应…

将5分钟安装Thingsboard 脚本升级到 3.9

稍微花了一点时间&#xff0c;将5分钟安装Thingsboard 脚本升级到最新版本 3.9。 [rootlab5 work]# cat one-thingsboard.shell echo "test on RHEL 8.10 " source /work/java/install-java.shell source /work/thingsboard/thingsboard-rpm.shell source /work/po…

【新春不断更】题海拾贝:P1878 舞蹈课

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《题海拾贝》 欢迎点赞&#xff0c;关注&#xff01; 1、题…

Windows 程序设计6:错误码的查看

文章目录 前言一、说明二、使用GetLastError找到错误的原因三、使用错误码的宏总结 前言 Windows 程序设计6&#xff1a;错误码的查看。 一、说明 有时写的代码单纯看是没有问题的&#xff0c;但是执行起来就会崩溃。因此要养成判断函数执行是否成功的习惯&#xff0c;除非这…

[STM32 - 野火] - - - 固件库学习笔记 - - -十三.高级定时器

一、高级定时器简介 高级定时器的简介在前面一章已经介绍过&#xff0c;可以点击下面链接了解&#xff0c;在这里进行一些补充。 [STM32 - 野火] - - - 固件库学习笔记 - - -十二.基本定时器 1.1 功能简介 1、高级定时器可以向上/向下/两边计数&#xff0c;还独有一个重复计…

安装zsh并美化

0 Zsh 是一种功能强大的 shell&#xff0c;通常用于替代默认的 Bash shell。它为命令行提供了更多的功能&#xff0c;例如自动补全、强大的模式匹配和主题支持等。 Oh My Zsh 是用于管理 Zsh 配置的框架。 powerlevel10k是样式&#xff0c;通过p10k configure脚本可以调节自己…

Hive:复杂数据类型之Map函数

Map函数 是Hive里面的一种复杂数据类型, 用于存储键值对集合。Map中的键和值可以是基础类型或复合类型&#xff0c;这使得Map在处理需要关联存储信息的数据时非常有用。 定义map时,需声明2个属性: key 和 value , map中是 key value 组成一个元素 key-value, key必须为原始类…

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

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

Sklearn 中的逻辑回归

逻辑回归的数学模型 基本模型 逻辑回归主要用于处理二分类问题。二分类问题对于模型的输出包含 0 和 1&#xff0c;是一个不连续的值。分类问题的结果一般不能由线性函数求出。这里就需要一个特别的函数来求解&#xff0c;这里引入一个新的函数 Sigmoid 函数&#xff0c;也成…

【Rust自学】14.6. 安装二进制crate

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 14.6.1. 从cratea.io安装二进制crate 通过cargo_install命令可以从crates.io安装二进制crate。 这并不是为了替换系统包&#xff0c;它应…

Vue 组件开发:构建高效可复用的前端界面要素

1 引言 在现代 Web 开发中,构建高效且可复用的前端界面要素是提升开发效率和用户体验的关键。Vue.js 作为一种轻量级且功能强大的前端框架,提供了丰富的工具和机制,帮助开发者快速构建高质量的应用程序。通过合理设计和封装 Vue 组件,我们可以实现组件的高效复用,提高开发…

Qt Ribbon使用实例

采用SARibbon创建简单的ribbon界面 实例代码如下所示&#xff1a; 1、头文件&#xff1a; #pragma once #include <SARibbonBar.h> #include "SARibbonMainWindow.h" class QTextEdit; class SAProjectDemo1 : public SARibbonMainWindow { Q_OBJECT pub…

微服务入门(go)

微服务入门&#xff08;go&#xff09; 和单体服务对比&#xff1a;里面的服务仅仅用于某个特定的业务 一、领域驱动设计&#xff08;DDD&#xff09; 基本概念 领域和子域 领域&#xff1a;有范围的界限&#xff08;边界&#xff09; 子域&#xff1a;划分的小范围 核心域…