K8S之存储PV-PVC详解
概述
与管理计算实例相比,管理存储是一个明显的问题。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详解相关推荐
- k8s教程(Volume篇)-PVC详解
文章目录 01 引言 02 PVC详解 2.1 参数配置 2.1.1 资源请求(Resources) 2.1.2 访问模式 (Access Modes) 2.1.3 存储卷模式(Volume Mode ...
- kubernetes系列11—PV和PVC详解
kubernetes系列11-PV和PVC详解 原文:kubernetes系列11-PV和PVC详解 本文收录在容器技术学习系列文章总目录 1.认识PV/PVC/StorageClass 1.1 介绍 ...
- Kubernetes K8S之资源控制器Daemonset详解
Kubernetes的资源控制器Daemonset详解与示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master CentOS7.7 2C/ ...
- k8s kubectl create命令使用详解
k8s kubectl create命令使用详解 Create a resource by filename or stdin 摘要 Create a resource by filename or ...
- k8s kubectl run命令使用详解
k8s kubectl run命令使用详解 在集群上运行指定镜像. 摘要 创建并运行一个指定的可复制的镜像. 创建一个deployment或者job来管理创建的容器. kubectl run NAME ...
- Android 开发 存储目录的详解
Android 开发 存储目录的详解 简介 Android设备,有3个地方的文件存储位置,他们分别是: 内部存储空间(用户无法浏览到此目录) 外部存储空间(就是手机自身的文件管理目录,用户可以浏览) ...
- ceph存储原理_赠书 | Linux 开源存储全栈详解——从Ceph到容器存储
// 留言点赞赠书我有书,你有故事么?留言说出你的存储故事留言点赞前两名,免费送此书截止日期12.27号12.30号公布名单 // 内容简介 本书致力于帮助读者形成有关Linux开源存储世界的细致的拓 ...
- python存储-Python数据存储之 h5py详解
1.Python数据存储(压缩) (1)numpy.save , numpy.savez , scipy.io.savemat numpy和scipy内建的数据存储方式. (2)cPickle + g ...
- PV操作详解(附详细例题解析和总结)
PV操作详解 写在前面:本文主要讲解PV操作与信息量结合,实现进程的同步与互斥 文章目录 PV操作详解 1. PV操作定义 2. 信号量的应用 3. 经典问题分析 3.1 课上例题 3.2 课下习题分 ...
- 分页存储存储管理方式详解
分页存储存储管理方式详解 离散分配方式 分页储存管理方式 页面与页表 页面 物理块 逻辑地址结构 页表 快表(TLB,Translation Look aside Buffer) 一级页表的缺陷 两级 ...
最新文章
- 城市中的像素灯塔-前海数据中心,深圳
- hdu 5631 Rikka with Graph(无向图的割边)
- w3cschool php 调整图片尺寸,PHP_php修改上传图片尺寸的方法,本文实例讲述了php修改上传图 - phpStudy...
- 实操教程丨如何将一个k3s集群集成到Gitlab项目中
- c+++11并发编程语言,C++11并发编程:多线程std:thread
- libcurl curl_easy_setopt函数以及设置选项
- java 删除二进制内容_二进制搜索树节点删除不删除替换Java
- 为什么我只写微头条,粉丝一天就增加700多人?
- Caused by: java.net.UnknownHostException: localhost.localdomain: localhost.localdomain的问题解决...
- sql 连接高级语言之后查询出现乱码_还有不会用 SQL 的程序员吗?
- .Net环境下有关打印页面设置、打印机设置、打印预览对
- cmd 打开资源监视器
- 现在公开一个DHT网络爬虫网络爬虫供大家一起交流
- Unity 制作伪全息
- win server2016远程桌面连接问题
- 贴纸UI效果如何制作,4个做贴纸效果的小技巧
- GeoHash 的编码方法
- oracle rank 语法_Oracle排名函数(Rank)实例详解
- 金蝶云星空配置读写分离分发服务器
- 余额交易查询 php,深圳通余额查询的API
热门文章
- 【物联网竞赛-LoRa 串口模块控制与显示】
- 实验十二 AODV和DSR协议仿真实验
- 操作系统基本概念梳理(3)---处理机调度与死锁
- ChatGPT助力校招----面试问题分享(四)
- 开源云原生CI/CD框架Tekton国内部署方式
- amd显卡安装linux,告诉你完美安装Ubuntu 12.10最新AMD显卡驱动实战的方法及命令
- ./和../以及/之间的区别
- 3D服装设计软件marvelous designer8
- 租用服务器送产权是什么意思
- 百度员工离职总结:如何做个好员工?(都是大实话)