k8s 中存储之 PV 持久卷 与 PVC 持久卷申请

ops/2024/10/11 2:49:44/

目录

1 PV 与 PVC 介绍

1.1 PersistentVolume(持久卷,简称PV)

1.2 PersistentVolumeClaim(持久卷声明,简称PVC)

1.3 使用了PV和PVC之后,工作可以得到进一步的细分:

2 持久卷实验配置介绍

2.1 PV 的配置介绍

2.2 PVC 的配置介绍

3 持久卷实验

3.1 创建 PV

3.2 查看 PV 资源是否被创建成功

3.3 创建 PVC 与 PV 进行绑定

3.4 创建一个pod进行测试

3.5 接下来的 pv2 与 pv3 也是相同的操作

3.6 PV 2 

3.7 PV 3


1 PV 与 PVC 介绍

前面已经学习了使用NFS提供存储,此时就要求用户会搭建NFS系统,并且会在yaml配置nfs。由于kubernetes支持的存储系统有很多,要求客户全都掌握,显然不现实。为了能够屏蔽底层存储实现的细节,方便用户使用, kubernetes引入PV和PVC两种资源对象。

PV(Persistent Volume)是持久化卷的意思,是对底层的共享存储的一种抽象。一般情况下PV由kubernetes管理员进行创建和配置,它与底层具体的共享存储技术有关,并通过插件完成与共享存储的对接。

PVC(Persistent Volume Claim)是持久卷声明的意思,是用户对于存储需求的一种声明。换句话说,PVC其实就是用户向kubernetes系统发出的一种资源需求申请。

1.1 PersistentVolume(持久卷,简称PV)

  • pv是集群内由管理员提供的网络存储的一部分。

  • PV也是集群中的一种资源。是一种volume插件,

  • 但是它的生命周期却是和使用它的Pod相互独立的。

  • PV这个API对象,捕获了诸如NFS、ISCSI、或其他云存储系统的实现细节

  • pv有两种提供方式:静态和动态

    • 静态PV:集群管理员创建多个PV,它们携带着真实存储的详细信息,它们存在于Kubernetes API中,并可用于存储使用

    • 动态PV:当管理员创建的静态PV都不匹配用户的PVC时,集群可能会尝试专门地供给volume给PVC。这种供给基于StorageClass

1.2 PersistentVolumeClaim(持久卷声明,简称PVC)

  • 是用户的一种存储请求

  • 它和Pod类似,Pod消耗Node资源,而PVC消耗PV资源

  • Pod能够请求特定的资源(如CPU和内存)。PVC能够请求指定的大小和访问的模式持久卷配置

  • PVC与PV的绑定是一对一的映射。没找到匹配的PV,那么PVC会无限期得处于unbound未绑定状态

1.3 使用了PV和PVC之后,工作可以得到进一步的细分:

2 持久卷实验配置介绍

2.1 PV 的配置介绍

PV是存储资源的抽象,下面是资源清单文件的解释:

apiVersion: v1  
kind: PersistentVolume
metadata:name: pv2
spec:nfs: # 存储类型,与底层真正存储对应capacity:  # 存储能力,目前只支持存储空间的设置storage: 2GiaccessModes:  # 访问模式storageClassName: # 存储类别persistentVolumeReclaimPolicy: # 回收策略

PV 的关键配置参数说明:

  • 存储类型

    底层实际存储的类型,kubernetes支持多种存储类型,每种存储类型的配置都有所差异

  • 存储能力(capacity)

目前只支持存储空间的设置( storage=1Gi ),不过未来可能会加入IOPS、吞吐量等指标的配置

  • 访问模式(accessModes)

    用于描述用户应用对存储资源的访问权限,访问权限包括下面几种方式:

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

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

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

    需要注意的是,底层不同的存储类型可能支持的访问模式不同

  • 回收策略(persistentVolumeReclaimPolicy)

    当PV不再被使用了之后,对其的处理方式。目前支持三种策略:

    • Retain (保留) 保留数据,需要管理员手工清理数据,当一个PV不再被任何PVC使用时(即PVC被删除或被绑定到其他PV),PV本身仍然存在,并且其上的数据不会被自动清除。管理员需要手动处理这些PV,可以重新绑定给新的PVC,或者手动删除PV。

    • Recycle(回收) 清除 PV 中的数据,效果相当于执行 rm -rf /thevolume/*

    • Delete (删除) 与 PV 相连的后端存储完成 volume 的删除操作,当然这常见于云服务商的存储服务。当一个PV不再被任何PVC使用时,PV会被自动删除,并且其上的数据也会被清除。PV一旦不再使用,就会被自动清理,减少了管理员的工作量。

    需要注意的是,底层不同的存储类型可能支持的回收策略不同

只有 NFS 和 HostPath 支持回收利用

AWS EBS,GCE PD,Azure Disk,or OpenStack Cinder卷支持删除操作。

  • 存储类别

    PV可以通过storageClassName参数指定一个存储类别

    • 具有特定类别的PV只能与请求了该类别的PVC进行绑定

    • 未设定类别的PV则只能与不请求任何类别的PVC进行绑定

  • 状态(status)

    一个 PV 的生命周期中,可能会处于4中不同的阶段:

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

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

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

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

2.2 PVC 的配置介绍

PVC是资源的申请,用来声明对存储空间、访问模式、存储类别需求信息。下面是资源清单文件:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: pvcnamespace: dev
spec:accessModes: # 访问模式selector: # 采用标签对PV选择storageClassName: # 存储类别resources: # 请求空间requests:storage: 5Gi

PVC 的关键配置参数说明:

  • 访问模式(accessModes)

用于描述用户应用对存储资源的访问权限

  • 选择条件(selector)

    通过Label Selector的设置,可使PVC对于系统中己存在的PV进行筛选

  • 存储类别(storageClassName)

    PVC在定义时可以设定需要的后端存储的类别,只有设置了该class的pv才能被系统选出

  • 资源请求(Resources )

    描述对存储资源的请求

3 持久卷实验

3.1 创建 PV

PV 资源用于在集群中管理持久性存储。PV 资源配置如下:

其实PV 主要的作用无非就是选择哪种类型的网络文件系统,如这次使用的就是NFS的文件系统。

或者说选择 回收的策略、访问的模式等等

[root@k8s-master volumes]# vim pv1-nfs.ymlapiVersion: v1 
kind: PersistentVolume  # 定义资源类型为PersistentVolume
metadata:  name: pv1  
spec:  storageClassName: my-nfs  # 指定存储类名称capacity:  # PV的容量storage: 5Gi  # PV的大小为5GiBvolumeMode: Filesystem  # 指定卷的模式为文件系统accessModes:  # PV的访问模式- ReadWriteMany  # 支持多个节点同时读写# 设置PV的回收策略为Retain(保留),这意味着当PV不再被任何PVC使用时,# PV仍然存在,并且其上的数据不会被自动清除persistentVolumeReclaimPolicy: Retain  # 使用NFS类型的卷nfs:  # 使用NFS类型的卷server: 192.168.239.50  # NFS服务器的IP地址path: /nfsdata/pv1  # 在NFS服务器上的路径[root@k8s-master volumes]# kubectl apply -f pv1-nfs.yml 

3.2 查看 PV 资源是否被创建成功

可以发现,虽然创建成功了,但他还处于 Available 的状态 ,这是未绑定的的状态但他是可用的,我们需要将 PV 与 PVC 进行绑定,最终实现的状态为 Bound

[root@k8s-master volumes]# kubectl get persistentvolume
NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   VOLUMEATTRIBUTESCLASS   REASON   AGE
pv1    5Gi        RWX            Retain           Available           my-nfs         <unset>                          13s

3.3 创建 PVC 与 PV 进行绑定

[root@k8s-master volumes]# vim pv1-nfs.yml apiVersion: v1
kind: PersistentVolume  # 定义PersistentVolume资源
metadata:name: pv1  # PV的名称
spec:storageClassName: my-nfs  # 指定存储类名称,与PVC要对应capacity:storage: 5Gi  # PV的容量大小volumeMode: Filesystem  # 卷的模式为文件系统accessModes:  # PV的访问模式- ReadWriteMany  # 支持多个节点同时读写persistentVolumeReclaimPolicy: Retain  # 设置PV的回收策略为Retain(保留)nfs:  # 使用NFS类型的卷server: 192.168.239.50  # NFS服务器的IP地址path: /nfsdata/pv1  # 在NFS服务器上的路径
# 在pv的 基础上增加以下 pvc 内容
---
apiVersion: v1
kind: PersistentVolumeClaim  # 定义PersistentVolumeClaim资源
metadata:name: pvc1  # PVC的名称  , 注意记住这个名字 ,在后面建立pod 的时候得引用PVC的名字
spec:storageClassName: my-nfs  # 指定存储类名称,与PV中的storageClassName要对应accessModes:  # PVC请求的访问模式- ReadWriteMany  # 支持多个节点同时读写resources:  # PVC请求的资源requests:storage: 1Gi  # 请求的存储容量大小 ,注意这个值不能超过PV的实际值# 声明 pvc
[root@k8s-master volumes]# kubectl apply -f pv1-nfs.yml # 查看pv 与pvc的状态是否变为Bound    
[root@k8s-master volumes]# kubectl get pv
NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM          STORAGECLASS   VOLUMEATTRIBUTESCLASS   REASON   AGE
pv1    5Gi        RWX            Retain           Bound    default/pvc1   my-nfs         <unset>                          164m[root@k8s-master volumes]# kubectl get pvc
NAME   STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
pvc1   Bound    pv1      5Gi        RWX            my-nfs         <unset>                 45s

3.4 创建一个pod进行测试

# 创建清单文件
[root@k8s-master volumes]# vim pvc1-nginx.yml apiVersion: v1
kind: Pod
metadata:name: pvc-nginx
spec:volumes:  # Pod中使用的卷列表- name: vol1  # 卷的名称persistentVolumeClaim:  # 使用PersistentVolumeClaim类型的卷claimName: pvc1  # 指定要使用的PVC的名称containers:- image: nginxname: nginxvolumeMounts:    # 容器内卷的挂载点 , 即将vol1卷挂载到以下此目录下- mountPath: /usr/share/nginx/htmlname: vol1# 声明清单文件
[root@k8s-master volumes]# kubectl apply -f pvc-nginx.yml # 查看pod是否创建成功
[root@k8s-master volumes]# kubectl get pods -o wide 
NAME                       READY   STATUS      RESTARTS   AGE     IP            NODE        NOMINATED NODE   READINESS GATES
nginx-v1-dbd4bc45b-49hhw   1/1     Running     0          4d      10.244.2.54   k8s-node2   <none>           <none>
nginx-v2-bd85b8bc4-nqpv2   1/1     Running     0          4d      10.244.1.35   k8s-node1   <none>           <none>
pvc-nginx                  1/1     Running     0          15s     10.244.2.64   k8s-node2   <none>           <none>
testpod                    0/1     Completed   0          3d12h   10.244.2.58   k8s-node2   <none>           <none># 尝试以下去访问,发现访问不成功,这是因为这是一个新的卷里面并没有东西
[root@k8s-master volumes]# curl 10.244.2.64
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.27.1</center>
</body>
</html># NFS 服务器上在指定PV中添加数据内容
[root@harbor nfsdata]# echo this is pv1 nginx > /nfsdata/pv1/index.html
[root@harbor nfsdata]# ls pv1/
index.html# 由于并没内使用 ingress 也没有使用 NodePode 来暴露 所以仅在集群内访问
[root@k8s-master volumes]# kubectl get pod pvc-nginx -o wide
NAME        READY   STATUS    RESTARTS   AGE    IP            NODE        NOMINATED NODE   READINESS GATES
pvc-nginx   1/1     Running   0          153m   10.244.2.64   k8s-node2   <none>           <none>[root@k8s-master volumes]# curl 10.244.2.64
this is pv1 nginx

3.5 接下来的 pv2 与 pv3 也是相同的操作

步骤:

创建 PV --> 声明 PV --> 查看是否正确创建 --> 创建 PVC 与 PV 进行绑定(PVC 与 PV 的类名要相同storageClassName) --> 声明PVC --> 创建一个 pod 指定PVC名称 验证是否可用

3.6 PV 2 

# 创建资源清单文件
[root@k8s-master volumes]# vim pv2-nfs.yml 
apiVersion: v1
kind: PersistentVolume
metadata:name: pv2
spec:storageClassName: my-nfs-pv2 # 与PVC 要对应capacity:storage: 5GivolumeMode: FilesystemaccessModes:- ReadOnlyManypersistentVolumeReclaimPolicy: Retainnfs:server: 192.168.239.50path: /nfsdata/pv2
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: pvc2
spec:storageClassName: my-nfs-pv2 # 与PV 中的 storageClassName 要对应accessModes:- ReadOnlyManyresources:requests:storage: 1Gi# 声明 PV PVC 
[root@k8s-master volumes]# kubectl apply -f pv2-nfs.yml 
persistentvolume/pv2 created
persistentvolumeclaim/pvc2 created[root@k8s-master volumes]# kubectl get pv
NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM          STORAGECLASS   VOLUMEATTRIBUTESCLASS   REASON   AGE
pv1    5Gi        RWX            Retain           Bound    default/pvc1   my-nfs         <unset>                          179m
pv2    5Gi        ROX            Retain           Bound    default/pvc2   my-nfs-pv2     <unset>                          2m52s[root@k8s-master volumes]# kubectl get pvc
NAME   STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
pvc1   Bound    pv1      5Gi        RWX            my-nfs         <unset>                 169m
pvc2   Bound    pv2      5Gi        ROX            my-nfs-pv2     <unset>                 2m59s[root@k8s-master volumes]# vim pvc2-nginx.yml 
apiVersion: v1
kind: Pod
metadata:name: pvc2-nginx
spec:containers:- image: nginxname: nginx-pvc2volumeMounts:- mountPath: /usr/share/nginx/htmlname: vol2volumes:- name: vol2persistentVolumeClaim:claimName: pvc2[root@k8s-master volumes]# kubectl apply -f pvc2-nginx.yml 
pod/pvc2-nginx created[root@k8s-master volumes]# kubectl get pod pvc2-nginx -o wide
NAME         READY   STATUS    RESTARTS   AGE    IP            NODE        NOMINATED NODE   READINESS GATES
pvc2-nginx   1/1     Running   0          2m4s   10.244.1.37   k8s-node1   <none>           <none># NFS服务器添加数据文件
[root@harbor nfsdata]# ls 
pv1  pv2  pv3
[root@harbor nfsdata]# echo this is pv2 nginx > /nfsdata/pv2/index.html# 测试访问
[root@k8s-master volumes]# curl 10.244.1.37 
this is pv2 nginx

3.7 PV 3

[root@k8s-master volumes]# vim pv3-nfs.yml 
apiVersion: v1
kind: PersistentVolume
metadata:name: pv3
spec:storageClassName: my-nfs-pv3 # 与PVC 要对应capacity:storage: 5GivolumeMode: FilesystemaccessModes:- ReadOnlyManypersistentVolumeReclaimPolicy: Retainnfs:server: 192.168.239.50path: /nfsdata/pv3
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: pvc3 # 名称必须与pod中引用的一致
spec:storageClassName: my-nfs-pv3 # 与PV 中的 storageClassName 要对应accessModes:- ReadOnlyManyresources:requests:storage: 1Gi[root@k8s-master volumes]# kubectl apply -f pv3-nfs.yml [root@k8s-master volumes]# kubectl get pv,pvc
NAME                   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM          STORAGECLASS   VOLUMEATTRIBUTESCLASS   REASON   AGE
persistentvolume/pv1   5Gi        RWX            Retain           Bound    default/pvc1   my-nfs         <unset>                          3h31m
persistentvolume/pv2   5Gi        ROX            Retain           Bound    default/pvc2   my-nfs-pv2     <unset>                          8m21s
persistentvolume/pv3   5Gi        ROX            Retain           Bound    default/pvc3   my-nfs-pv3     <unset>                          10sNAME                         STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
persistentvolumeclaim/pvc1   Bound    pv1      5Gi        RWX            my-nfs         <unset>                 3h20m
persistentvolumeclaim/pvc2   Bound    pv2      5Gi        ROX            my-nfs-pv2     <unset>                 8m21s
persistentvolumeclaim/pvc3   Bound    pv3      5Gi        ROX            my-nfs-pv3     <unset>                 10s
[root@k8s-master volumes]# vim pvc3-nginx.yml 
[root@k8s-master volumes]# kubectl apply -f pvc3-nginx.yml [root@k8s-master volumes]# vim pvc3-nginx.yml 
apiVersion: v1
kind: Pod
metadata:name: pvc3-nginx
spec:containers:- image: nginxname: nginx-pvc3volumeMounts:- mountPath: /usr/share/nginx/htmlname: vol3volumes:- name: vol3persistentVolumeClaim:claimName: pvc3[root@k8s-master volumes]# kubectl apply -f pvc3-nginx.yml [root@k8s-master volumes]# kubectl get pods pvc3-nginx -o wide
NAME         READY   STATUS    RESTARTS   AGE     IP            NODE        NOMINATED NODE   READINESS GATES
pvc3-nginx   1/1     Running   0          2m51s   10.244.2.65   k8s-node2   <none>           <none># NFS 增加数据文件
[root@harbor nfsdata]# echo this is pv3 nginx > /nfsdata/pv3/index.html# 访问测试
[root@k8s-master volumes]# curl 10.244.2.65
this is pv3 nginx


http://www.ppmy.cn/ops/123771.html

相关文章

等保测评:如何建立有效的网络安全监测系统

等保测评中的网络安全监测系统建立 在建立等保测评中的网络安全监测系统时&#xff0c;应遵循以下步骤和策略&#xff1a; 确定安全等级和分类&#xff1a;首先&#xff0c;需要根据信息系统的安全性要求、资产的重要性和风险程度等因素&#xff0c;确定网络系统的安全等级&…

猿人学 — 第1届第13题(解题思路附源码)

猿人学 — 第1届第13题&#xff08;解题思路附源码&#xff09; 发现在翻页过程中&#xff0c;只要中途有几秒的间隔&#xff0c;那么就会显示拉取数据失败&#xff0c;然后网页重新加载回到刚进来显示的第一页的情况 重新加载时&#xff0c;会发送一系列的请求&#xff0c;发…

【QT Qucik】C++交互:接收QML信号

在本节课中&#xff0c;我们将深入探讨如何在C中接收QML发出的信号。我们将分为几个部分&#xff0c;详细说明信号的定义、发送及其在C中的接收。 理解信号和槽机制 Qt的信号与槽机制是一种用于对象之间通信的强大工具。信号是对象在特定事件发生时发送的通知&#xff0c;而槽…

性能测试笔记2-总

安装路径&#xff1a;先装jdk,后装JMeter 安装JDK&#xff1a; 下载JDK – 安装JDK – 配置环境变量 – 验证 安装Jmeter&#xff1a; 下载Jmeter – 安装Jmeter – 配置环境变量 – 启动验证 注意点&#xff1a; 下载JDK时&#xff0c;注意电脑操作系统是32位/64位 下载…

回归分析在数据挖掘中的应用简析

一、引言 在数据驱动的时代&#xff0c;数据挖掘技术已成为从海量数据中提取有价值信息的关键工具。 回归分析&#xff0c;作为一种经典的统计学习方法&#xff0c;不仅在理论研究上有着深厚的基础&#xff0c;而且在实际 应用中也展现出强大的功能。 二、回归分析基础 2.1 回…

R语言绘制散点图

散点图是一种在直角坐标系中用数据点直观呈现两个变量之间关系、可检测异常值并探索数据分布的可视化图表。它是一种常用的数据可视化工具&#xff0c;我们通过不同的参数调整和包的使用&#xff0c;可以创建出满足各种需求的散点图。 常用绘制散点图的函数有plot()函数和ggpl…

MyBatis 数据表与实体映射的隐藏陷阱

这两天在处理一个线上问题时&#xff0c;发现Mybatis数据表和实体映射的时候会埋一个坑。这个问题看似微小&#xff0c;但却可能在关键时刻给我们带来不小的困扰。接下来&#xff0c;让我们深入剖析这个问题&#xff0c;并探究其发生的根源。 一、问题描述 我们在使用 Mybati…

Springboo通过http请求下载文件到服务器

这个方法将直接处理从URL下载数据并将其保存到文件的整个过程。下面是一个这样的方法示例&#xff1a; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.HttpURLConnection…