概述


与管理计算实例相比,管理存储是一个明显的问题。PersistentVolume子系统为用户和管理员提供了一个API,该API从如何使用存储中抽象出如何提供存储的详细信息。为此,我们引入了两个新的API资源:PersistentVolume和PersistentVolumeClaim。

PV概述


PersistentVolume (PV)是集群中由管理员提供或使用存储类动态提供的一块存储。它是集群中的资源,就像节点是集群资源一样。

PV是与Volumes类似的卷插件,但其生命周期与使用PV的任何单个Pod无关。由此API对象捕获存储的实现细节,不管是NFS、iSCSI还是特定于云提供商的存储系统。

PVC概述


PersistentVolumeClaim (PVC) 是用户对存储的请求。它类似于Pod;Pods消耗节点资源,而PVC消耗PV资源。Pods可以请求特定级别的资源(CPU和内存)。Claim可以请求特定的存储大小和访问模式(例如,它们可以挂载一次读写或多次只读)。

虽然PersistentVolumeClaims (PVC) 允许用户使用抽象的存储资源,但是用户通常需要具有不同属性(比如性能)的PersistentVolumes (PV) 来解决不同的问题。集群管理员需要能够提供各种不同的PersistentVolumes,这些卷在大小和访问模式之外还有很多不同之处,也不向用户公开这些卷是如何实现的细节。对于这些需求,有一个StorageClass资源。

volume 和 claim的生命周期


PV是集群中的资源。PVC是对这些资源的请求,并且还充当对资源的声明检查。PV和PVC之间的交互遵循以下生命周期:

供应


有两种方式配置PV:静态的或动态的。

静态配置

集群管理员创建一些PV。它们带有可供集群用户使用的实际存储的详细信息。存在于Kubernetes API中,可供使用。

动态配置

当管理员创建的静态PV没有一个与用户的PersistentVolumeClaim匹配时,集群可能会尝试动态地为PVC提供一个卷。此配置基于StorageClasses:PVC必须请求存储类,并且管理员必须已经创建并配置了该类,才能进行动态配置。声明该类为 "",可以有效地禁用其动态配置。

要启用基于存储级别的动态存储配置,集群管理员需要启用API Server上的DefaultStorageClass[准入控制器]。例如,通过确保DefaultStorageClass位于API Server组件的 --enable-admission-plugins标志,使用逗号分隔的有序值列表中,可以完成此操作。

绑定


用户创建(或者在动态配置的情况下,已经创建)具有特定存储请求量(大小)和特定访问模式的PersistentVolumeClaim。主控制器中的控制循环监视新的PV,找到匹配的PV(如果可能的话),并将它们绑定在一起。如果PV为新的PVC动态配置,那么循环始终将该PV绑定到PVC。否则,用户始终至少得到他们所要求的,但是存储量可能会超过所要求的范围。

一旦绑定,无论是如何绑定的,PersistentVolumeClaim绑定都是互斥的。PVC到PV的绑定是一对一的映射,使用ClaimRef,它是PersistentVolume和PersistentVolumeClaim之间的双向绑定。

如果不存在匹配的卷,声明(Claims)将无限期保持未绑定。随着匹配量的增加,声明将受到约束。例如,配备有许多50Gi PV的群集将与请求100Gi的PVC不匹配。当将100Gi PV添加到群集时,可以绑定PVC。

注意:静态时PVC与PV绑定时会根据storageClassName(存储类名称)和accessModes(访问模式)判断哪些PV符合绑定需求。然后再根据存储量大小判断,首先存PV储量必须大于或等于PVC声明量;其次就是PV存储量越接近PVC声明量,那么优先级就越高(PV量越小优先级越高)。

使用


Pods使用声明(claims)作为卷。集群检查声明以找到绑定卷并为Pod挂载该卷。对于支持多种访问模式的卷,用户在其声明中作为Pod中卷使用时指定所需的模式。

一旦用户拥有一个声明并且该声明被绑定,则绑定的PV就属于该用户。用户通过在Pod的卷块中包含的persistentVolumeClaim部分来调度Pods并访问其声明的PV。

持久化声明保护


“使用中的存储对象保护” :该功能的目的是确保在Pod活动时使用的PersistentVolumeClaims (PVC)和绑定到PVC的PersistentVolume (PV)不会从系统中删除,因为这可能会导致数据丢失。

如果用户删除了Pod正在使用的PVC,则不会立即删除该PVC;PVC的清除被推迟,直到任何Pod不再主动使用PVC。另外,如果管理员删除绑定到PVC的PV,则不会立即删除该PV;PV的去除被推迟,直到PV不再与PVC结合。

回收策略


当用户处理完他们的卷时,他们可以从允许回收资源的API中删除PVC对象。PersistentVolume的回收策略告诉集群在释放卷的声明后该如何处理它。目前,卷可以被保留、回收或删除。

Retain (保留)

保留回收策略允许手动回收资源。当PersistentVolumeClaim被删除时,PersistentVolume仍然存在,并且该卷被认为是“释放”的。但是,由于之前声明的数据仍然存在,因此另一个声明尚无法得到。管理员可以手动回收卷。

Delete (删除)

对于支持Delete回收策略的卷插件,删除操作会同时从Kubernetes中删除PersistentVolume对象以及外部基础架构中的关联存储资产,例如AWS EBS,GCE PD,Azure Disk或Cinder卷。动态配置的卷将继承其StorageClass的回收策略,默认为Delete。管理员应根据用户的期望配置StorageClass。

Recycle (回收)

如果基础卷插件支持,Recycle回收策略将rm -rf /thevolume/*对该卷执行基本的擦除并使其可用于新的声明。

PV示例与参数说明


PV示例


apiVersion: v1
kind: PersistentVolume
metadata:name: pv0003
spec:capacity:storage: 5GivolumeMode: FilesystemaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RecyclestorageClassName: slowmountOptions:- hard- nfsvers=4.1nfs:path: /tmpserver: 172.17.0.2

Capacity:通常,PV将具有特定的存储容量设置。当前,存储大小是可以设置或请求的唯一资源。将来的属性可能包括IOPS,吞吐量等。

volumeMode:可选参数,为Filesystem或Block。Filesystem是volumeMode省略参数时使用的默认模式。

accessModes:PersistentVolume可以通过资源提供者支持的任何方式安装在主机上。如下文表中所示,提供商将具有不同的功能,并且每个PV的访问模式都将设置为该特定卷支持的特定模式。例如,NFS可以支持多个读/写客户端,但是特定的NFS PV可能以只读方式在服务器上导出。每个PV都有自己的一组访问模式,用于描述该特定PV的功能。

访问方式为:

Capacity:通常,PV将具有特定的存储容量设置。当前,存储大小是可以设置或请求的唯一资源。将来的属性可能包括IOPS,吞吐量等。

volumeMode:可选参数,为Filesystem或Block。Filesystem是volumeMode省略参数时使用的默认模式。

accessModes:PersistentVolume可以通过资源提供者支持的任何方式安装在主机上。如下文表中所示,提供商将具有不同的功能,并且每个PV的访问模式都将设置为该特定卷支持的特定模式。例如,NFS可以支持多个读/写客户端,但是特定的NFS PV可能以只读方式在服务器上导出。每个PV都有自己的一组访问模式,用于描述该特定PV的功能。

访问方式为:

在CLI命令行中,访问模式缩写为:

1 RWO-ReadWriteOnce

2 ROX-ReadOnlyMany

3 RWX-ReadWriteMany

说明:一个卷一次只能使用一种访问模式挂载,即使它支持多种访问模式。

storageClassName:PV可以有一个类,通过将storageClassName属性设置为一个StorageClass的名称来指定这个类。特定类的PV只能绑定到请求该类的PVC。没有storageClassName的PV没有类,只能绑定到不请求特定类的PVC。

persistentVolumeReclaimPolicy:当前的回收政策是:Retain (保留)-手动回收、Recycle (回收)-基本擦除(rm -rf /thevolume/*)、Delete (删除)-删除相关的存储资产 (例如AWS EBS,GCE PD,Azure Disk或OpenStack Cinder卷)。

备注:当前,仅NFS和HostPath支持回收。AWS EBS,GCE PD,Azure Disk和Cinder卷支持删除。

PV-PVC示例


主机信息


服务器名称(hostname)

系统版本

配置

内网IP

外网IP(模拟)

部署模块

k8s-master

CentOS7.7

2C/4G/20G

172.16.1.110

10.0.0.110

k8s-master

k8s-node01

CentOS7.7

2C/4G/20G

172.16.1.111

10.0.0.111

k8s-node

k8s-node02

CentOS7.7

2C/4G/20G

172.16.1.112

10.0.0.112

k8s-node

k8s-node03

CentOS7.7

2C/2G/20G

172.16.1.113

10.0.0.113

NFS

存储使用NFS,在k8s-node03机器仅部署NFS服务,没有部署K8S

NFS服务部署


NFS服务端k8s-node03机器操作

[root@k8s-node03 ~]# mkdir -p /data/nfs1 /data/nfs2 /data/nfs3 /data/nfs4 /data/nfs5 /data/nfs6
[root@k8s-node03 ~]# chown -R nfsnobody.nfsnobody /data/
[root@k8s-node03 ~]#
[root@k8s-node03 ~]# ll /data/
total 0
drwxr-xr-x 2 nfsnobody nfsnobody 6 Jun 14 16:30 nfs1
drwxr-xr-x 2 nfsnobody nfsnobody 6 Jun 14 16:30 nfs2
drwxr-xr-x 2 nfsnobody nfsnobody 6 Jun 14 16:30 nfs3
drwxr-xr-x 2 nfsnobody nfsnobody 6 Jun 14 16:30 nfs4
drwxr-xr-x 2 nfsnobody nfsnobody 6 Jun 14 16:30 nfs5
drwxr-xr-x 2 nfsnobody nfsnobody 6 Aug 22 16:25 nfs6
[root@k8s-node03 ~]# vim /etc/exports
/data/nfs1  172.16.1.0/24(rw,sync,root_squash,all_squash)
/data/nfs2  172.16.1.0/24(rw,sync,root_squash,all_squash)
/data/nfs3  172.16.1.0/24(rw,sync,root_squash,all_squash)
/data/nfs4  172.16.1.0/24(rw,sync,root_squash,all_squash)
/data/nfs5  172.16.1.0/24(rw,sync,root_squash,all_squash)
/data/nfs6  172.16.1.0/24(rw,sync,root_squash,all_squash)
### 启动NFS服务
[root@k8s-node03 ~]# systemctl start rpcbind.service
[root@k8s-node03 ~]# systemctl start nfs.service
### 检查NFS服务 , 其中 172.16.1.113 为服务端IP
[root@k8s-node03 ~]# showmount -e 172.16.1.113
Export list for 172.16.1.113:
/data/nfs6 172.16.1.0/24
/data/nfs5 172.16.1.0/24
/data/nfs4 172.16.1.0/24
/data/nfs3 172.16.1.0/24
/data/nfs2 172.16.1.0/24
/data/nfs1 172.16.1.0/24

NFS客户端验证

在k8s-node02机器验证

# 查看rpcbind服务,默认是启动的,如果没有启动则启动并加入开机自启动
[root@k8s-node02 ~]# systemctl status rpcbind.service
# 查看NFS服务信息
[root@k8s-node02 ~]# showmount -e 172.16.1.113
………………
# 挂载,并进行读写验证
[root@k8s-node02 ~]# mount -t nfs 172.16.1.113:/data/nfs1 /mnt
# 验证完毕,去掉NFS挂载
[root@k8s-node02 ~]# umount -lf 172.16.1.113:/data/nfs1

PV部署


yaml文件

[root@k8s-master pv-pvc]# pwd
/root/k8s_practice/pv-pvc
[root@k8s-master pv-pvc]# cat pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:name: pv-nfs1
spec:capacity:storage: 1GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RecyclestorageClassName: nfsnfs:path: /data/nfs1server: 172.16.1.113
---
apiVersion: v1
kind: PersistentVolume
metadata:name: pv-nfs2
spec:capacity:storage: 3GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RecyclestorageClassName: nfsnfs:path: /data/nfs2server: 172.16.1.113
---
apiVersion: v1
kind: PersistentVolume
metadata:name: pv-nfs3
spec:capacity:storage: 5GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RecyclestorageClassName: slownfs:path: /data/nfs3server: 172.16.1.113
---
apiVersion: v1
kind: PersistentVolume
metadata:name: pv-nfs4
spec:capacity:storage: 10GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RecyclestorageClassName: nfsnfs:path: /data/nfs4server: 172.16.1.113
---
apiVersion: v1
kind: PersistentVolume
metadata:name: pv-nfs5
spec:capacity:storage: 5GiaccessModes:- ReadWriteManypersistentVolumeReclaimPolicy: RecyclestorageClassName: nfsnfs:path: /data/nfs5server: 172.16.1.113
---
apiVersion: v1
kind: PersistentVolume
metadata:name: pv-nfs6
spec:capacity:storage: 5GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RecyclestorageClassName: nfsnfs:path: /data/nfs6server: 172.16.1.113

启动PV,并查看状态

[root@k8s-master pv-pvc]# kubectl apply -f pv.yaml
persistentvolume/pv-nfs1 created
persistentvolume/pv-nfs2 created
persistentvolume/pv-nfs3 created
persistentvolume/pv-nfs4 created
persistentvolume/pv-nfs5 created
persistentvolume/pv-nfs6 created
[root@k8s-master pv-pvc]#
[root@k8s-master pv-pvc]# kubectl get pv -o wide
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE   VOLUMEMODE
pv-nfs1   1Gi        RWO            Recycle          Available           nfs                     11s   Filesystem
pv-nfs2   3Gi        RWO            Recycle          Available           nfs                     11s   Filesystem
pv-nfs3   5Gi        RWO            Recycle          Available           slow                    11s   Filesystem
pv-nfs4   10Gi       RWO            Recycle          Available           nfs                     11s   Filesystem
pv-nfs5   5Gi        RWX            Recycle          Available           nfs                     11s   Filesystem
pv-nfs6   5Gi        RWO            Recycle          Available           nfs                     11s   Filesystem

K8S之存储PV-PVC详解相关推荐

  1. k8s教程(Volume篇)-PVC详解

    文章目录 01 引言 02 PVC详解 2.1 参数配置 2.1.1 资源请求(Resources) 2.1.2 访问模式 (Access Modes) 2.1.3 存储卷模式(Volume Mode ...

  2. kubernetes系列11—PV和PVC详解

    kubernetes系列11-PV和PVC详解 原文:kubernetes系列11-PV和PVC详解 本文收录在容器技术学习系列文章总目录 1.认识PV/PVC/StorageClass 1.1 介绍 ...

  3. Kubernetes K8S之资源控制器Daemonset详解

    Kubernetes的资源控制器Daemonset详解与示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master CentOS7.7 2C/ ...

  4. k8s kubectl create命令使用详解

    k8s kubectl create命令使用详解 Create a resource by filename or stdin 摘要 Create a resource by filename or ...

  5. k8s kubectl run命令使用详解

    k8s kubectl run命令使用详解 在集群上运行指定镜像. 摘要 创建并运行一个指定的可复制的镜像. 创建一个deployment或者job来管理创建的容器. kubectl run NAME ...

  6. Android 开发 存储目录的详解

    Android 开发 存储目录的详解 简介 Android设备,有3个地方的文件存储位置,他们分别是: 内部存储空间(用户无法浏览到此目录) 外部存储空间(就是手机自身的文件管理目录,用户可以浏览) ...

  7. ceph存储原理_赠书 | Linux 开源存储全栈详解——从Ceph到容器存储

    // 留言点赞赠书我有书,你有故事么?留言说出你的存储故事留言点赞前两名,免费送此书截止日期12.27号12.30号公布名单 // 内容简介 本书致力于帮助读者形成有关Linux开源存储世界的细致的拓 ...

  8. python存储-Python数据存储之 h5py详解

    1.Python数据存储(压缩) (1)numpy.save , numpy.savez , scipy.io.savemat numpy和scipy内建的数据存储方式. (2)cPickle + g ...

  9. PV操作详解(附详细例题解析和总结)

    PV操作详解 写在前面:本文主要讲解PV操作与信息量结合,实现进程的同步与互斥 文章目录 PV操作详解 1. PV操作定义 2. 信号量的应用 3. 经典问题分析 3.1 课上例题 3.2 课下习题分 ...

  10. 分页存储存储管理方式详解

    分页存储存储管理方式详解 离散分配方式 分页储存管理方式 页面与页表 页面 物理块 逻辑地址结构 页表 快表(TLB,Translation Look aside Buffer) 一级页表的缺陷 两级 ...

最新文章

  1. 城市中的像素灯塔-前海数据中心,深圳
  2. hdu 5631 Rikka with Graph(无向图的割边)
  3. w3cschool php 调整图片尺寸,PHP_php修改上传图片尺寸的方法,本文实例讲述了php修改上传图 - phpStudy...
  4. 实操教程丨如何将一个k3s集群集成到Gitlab项目中
  5. c+++11并发编程语言,C++11并发编程:多线程std:thread
  6. libcurl curl_easy_setopt函数以及设置选项
  7. java 删除二进制内容_二进制搜索树节点删除不删除替换Java
  8. 为什么我只写微头条,粉丝一天就增加700多人?
  9. Caused by: java.net.UnknownHostException: localhost.localdomain: localhost.localdomain的问题解决...
  10. sql 连接高级语言之后查询出现乱码_还有不会用 SQL 的程序员吗?
  11. .Net环境下有关打印页面设置、打印机设置、打印预览对
  12. cmd 打开资源监视器
  13. 现在公开一个DHT网络爬虫网络爬虫供大家一起交流
  14. Unity 制作伪全息
  15. win server2016远程桌面连接问题
  16. 贴纸UI效果如何制作,4个做贴纸效果的小技巧
  17. GeoHash 的编码方法
  18. oracle rank 语法_Oracle排名函数(Rank)实例详解
  19. 金蝶云星空配置读写分离分发服务器
  20. 余额交易查询 php,深圳通余额查询的API

热门文章

  1. 【物联网竞赛-LoRa 串口模块控制与显示】
  2. 实验十二 AODV和DSR协议仿真实验
  3. 操作系统基本概念梳理(3)---处理机调度与死锁
  4. ChatGPT助力校招----面试问题分享(四)
  5. 开源云原生CI/CD框架Tekton国内部署方式
  6. amd显卡安装linux,告诉你完美安装Ubuntu 12.10最新AMD显卡驱动实战的方法及命令
  7. ./和../以及/之间的区别
  8. 3D服装设计软件marvelous designer8
  9. 租用服务器送产权是什么意思
  10. 百度员工离职总结:如何做个好员工?(都是大实话)