PV和PVC

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

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

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

PV

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

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

关键配置参数

PV的关键配置参数说明:

  • 存储类型:底层实际存储的类型,k8s支持多种存储类型,每种存储类型的配置都有所差异
  • 存储能力(capacity):目前只支持存储空间的设置(storage=1Gi),不过未来可能会加入IOPS、吞吐量等指标的配置
  • 访问模式(accessModes):用于描述用户应用对存储资源的访问权限,访问权限包括下面几种方式:
  1. ReadWriteOnce(RWO):读写权限,但是只能被单个节点挂载
  2. ReadOnlyMany(ROX):只读权限,可以被多个节点挂载
  3. ReadWriteMany(RWX):读写权限,可以被多个节点挂载

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

  • 回收策略(persistentVolumeReclaimPolicy):当PV不再被使用了之后,对其的处理方式。目前支持三种策略:
  1. Retain(保留):保留数据,需要管理员手动清理数据
  2. Recycle(回收):清除PV中的数据,效果相当于执行 rm -rf /thevolume/*
  3. Delete(删除):与PV相连的后端存储完成volume的删除操作,当然这常见于云服务商的存储服务

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

  • 存储类别:PV可以通过storageClassName参数指定一个存储类别
  1. 具有特定类别的PV只能与请求了该类别的PVC进行绑定
  2. 未设定类别的PV只能与不请求任何类别的PVC进行绑定
  • 状态(status):一个PV的生命周期中,可能会处于4种不同的阶段:
  1. Available(可用):表示可用状态,还未被任何PVC绑定
  2. Bound(已绑定):表示PV已经被PVC绑定
  3. Released(已释放):表示PVC被删除,但是资源还未被集群重新声明
  4. Failed(失败):表示该PV的自动回收失败

实验

使用NFS作为存储,演示PV的使用,创建3个PV,对应NFS中的3个暴露的路径。

准备NFS环境

#创建目录
[root@master ~]# mkdir /root/data/{pv1,pv2,pv3} -pv
mkdir: 已创建目录 "/root/data/pv1"
mkdir: 已创建目录 "/root/data/pv2"
mkdir: 已创建目录 "/root/data/pv3" #暴露服务
[root@master ~]# vim /etc/exports
[root@master ~]# more /etc/exports
/root/data/nfs 你master虚拟机的IP地址前9位.0/24(rw,no_root_squash)
/root/data/pv1 你master虚拟机的IP地址前9位.0/24(rw,no_root_squash)
/root/data/pv2 你master虚拟机的IP地址前9位.0/24(rw,no_root_squash)
/root/data/pv3 你master虚拟机的IP地址前9位.0/24(rw,no_root_squash) #重启服务
[root@master ~]# systemctl restart nfs

创建pv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
name: pv1
spec:
capacity: #存储能力,目前只支持存储空间的设置
storage: 1Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
nfs:
path: /root/data/pv1
server: 192.168.145.131 --- apiVersion: v1
kind: PersistentVolume
metadata:
name: pv2
spec:
capacity:
storage: 2Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
nfs:
path: /root/data/pv2
server: 192.168.145.131 --- apiVersion: v1
kind: PersistentVolume
metadata:
name: pv3
spec:
capacity:
storage: 3Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
nfs:
path: /root/data/pv3
server: 192.168.145.131

使用配置文件

[root@master ~]# vim pv.yaml
[root@master ~]# kubectl create -f pv.yaml
persistentvolume/pv1 created
persistentvolume/pv2 created
persistentvolume/pv3 created
[root@master ~]# kubectl get pv -o wide
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE VOLUMEMODE
pv1 1Gi RWX Retain Available 82s Filesystem
pv2 2Gi RWX Retain Available 82s Filesystem
pv3 3Gi RWX Retain Available 81s Filesystem

PVC

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

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

关键配置参数

  • 访问模式(accessModes):用于描述用户应用对存储资源的访问权限
  • 选择条件(selector):通过Label Selector的设置,可使PVC对于系统中已存在的PV进行筛选
  • 存储类别(storageClassName):PVC在定义时可以设定需要的后端存储的类别,只有设置了该class的pv才能被系统选出
  • 资源请求(Resources):描述对存储资源的请求

实验

创建pvc.yaml,申请pv

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc1
namespace: dev
spec:
accessModes:
- ReadWriteMany
resources: #请求空间
requests:
storage: 1Gi --- apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc2
namespace: dev
spec:
accessModes:
- ReadWriteMany
resources: #请求空间
requests:
storage: 1Gi --- apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc3
namespace: dev
spec:
accessModes:
- ReadWriteMany
resources: #请求空间
requests:
storage: 5Gi

使用配置文件

[root@master ~]# vim pvc.yaml
[root@master ~]# kubectl create -f pvc.yaml
persistentvolumeclaim/pvc1 created
persistentvolumeclaim/pvc2 created
persistentvolumeclaim/pvc3 created #查看pvc
[root@master ~]# kubectl get pvc -n dev
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pvc1 Bound pv1 1Gi RWX 10s
pvc2 Bound pv2 2Gi RWX 9s
pvc3 Pending 9s #查看pv
[root@master ~]# kubectl get pv -o wide
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE VOLUMEMODE
pv1 1Gi RWX Retain Bound dev/pvc1 19m Filesystem
pv2 2Gi RWX Retain Bound dev/pvc2 19m Filesystem
pv3 3Gi RWX Retain Available 19m Filesystem

创建pods.yaml,使用pv

apiVersion: v1
kind: Pod
metadata:
name: pod1
namespace: dev
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: dev
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@master ~]# vim pods.yaml
[root@master ~]# kubectl create -f pods.yaml
pod/pod1 created
pod/pod2 created
[root@master ~]# kubectl get pod -n dev
NAME READY STATUS RESTARTS AGE
pod1 1/1 Running 0 99s
pod2 1/1 Running 0 99s

查看挂载状况

#查看pv1
[root@master ~]# ls /root/data/pv1
out.txt
[root@master ~]# tail -f /root/data/pv1/out.txt
pod1
pod1
pod1
pod1
pod1
pod1 #查看pv2
[root@master ~]# ls /root/data/pv2
out.txt
[root@master ~]# tail -f /root/data/pv2/out.txt
pod2
pod2
pod2
pod2
pod2

删除pv和pvc

[root@master ~]# kubectl delete -f pods.yaml
pod "pod1" deleted
pod "pod2" deleted
[root@master ~]# kubectl delete -f pvc.yaml
persistentvolumeclaim "pvc1" deleted
persistentvolumeclaim "pvc2" deleted
persistentvolumeclaim "pvc3" deleted

查看pv状态,可以发现pv1和pv2已被释放

[root@master ~]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv1 1Gi RWX Retain Released dev/pvc1 24h
pv2 2Gi RWX Retain Released dev/pvc2 24h
pv3 3Gi RWX Retain Available 24h

生命周期

PVC和PV是一一对应的,PV和PVC之间的相互作用遵循以下生命周期:

  • 资源供应:管理员手动创建底层存储和PV
  • 资源绑定:用户创建PVC,k8s负责根据PVC的声明去寻找PV,并绑定

  在用户定义好PVC之后,系统将根据PVC对存储资源的请求在已存在的PV种选择一个满足条件的

  1. 一旦找到,就将该PV与用户定义的PVC进行绑定,用户的应用就可以使用这个PVC了
  2. 如果找不到,PVC则会无限处于Pending状态,直到等到系统管理员创建了一个符合其要求的PV

  PV一旦绑定到某个PVC上,就会被这个PVC独占,不能再与其他PVC进行绑定了

  • 资源使用:用户可在pod中像volume一样使用pvc

  Pod使用volume的定义,将pvc挂载到容器内的某个路径进行使用

  • 资源释放:用户删除pvc来释放pv

  当存储资源使用完毕之后,用户可以删除pvc,与该pvc绑定的pv将会被标记为“已释放”,但还不能立刻与其他PVC进行绑定。通过之前PVC写入的数据可能还被留在存储设备上,只有在清除之后该PV才    能再次使用

  • 资源回收:k8s根据pv设置的回收策略进行资源的回收

  对于pv,管理员可以设定回收策略,用于设置与之绑定的pvc释放资源之后如何处理遗留数据的问题。只有PV的存储空间完成回收,才能供新的PVC绑定和使用

k8s之数据存储-高级存储的更多相关文章

  1. Windows Azure Virtual Machine (26) 使用高级存储(SSD)和DS系列VM

    <Windows Azure Platform 系列文章目录> Update: 2016-11-3,如果大家在使用Linux VM,使用FIO进行IOPS测试的时候,请使用以下命令: su ...

  2. 玩转Windows Azure存储服务——高级存储

    在上一篇我们把Windows Azure的存储服务用作网盘,本篇我们继续挖掘Windows Azure的存储服务——高级存储.高级存储自然要比普通存储高大上的,因为高级存储是SSD存储!其吞吐量和IO ...

  3. 利用Azure高级存储搭建高性能Linux服务器(2)

    我们首先来测试随机写的IOPS,可以看到随机写的IOPS可以达到,顺序写的IOPS可以达到: $ sudo fio -filename=/data/testfile -direct=1 -iodept ...

  4. 利用Azure高级存储搭建高性能Linux服务器(1)

    目前Azure针对虚拟机提供两种类型的存储,一种是标准存储,基于HDD的,一种是高性能存储Premium Storage(在下文中简称PS),基于SSD的.针对用户高性能,低延迟,I/O密集型的应用, ...

  5. mysql 数据表操作 存储引擎介绍

    一 什么是存储引擎? 存储引擎就是表的类型. mysql中建立的库===>文件夹 库中建立的表===>文件 现实生活中我们用来存储数据的文件有不同的类型,每种文件类型对应各自不同的处理机制 ...

  6. ios开发之数据的持久化存储机制

    IOS中数据的持久化保存这块内容,类似于Android中文件的几种常见的存储方式. 对于数据的持久化存储,ios中一般提供了4种不同的机制. 1.属性列表 2.对象归档 3.数据库存储(SQLite3 ...

  7. 云方案,依托H3C彩虹云存储架构,结合UIA统一认证系统,实现了用户数据的集中存储和管理

    客户的声音 资料云项目在迷你云基础上二次开发,通过使用云存储技术及文件秒传技术,对文件进行统一存储与管理,以达到节约文件管理成本.存储成本目的:通过有效的文件版本控制机制,以达到风险管控的目的:通过多 ...

  8. 把mmapv1存储引擎存储的mongodb3.0数据库数据复制到WiredTiger存储引擎的mongodb3.2中

    mongodb3.0在mmapv1的存储引擎基础上添加了一个新的存储引擎WiredTiger.但是3.0的默认存储引擎依旧是mmapv1,因此我们项目之前也就用的默认方式. 但是mongodb更新实在 ...

  9. 区块链 + 大数据:EOS存储

    谈到区块链的存储,我们很容易联想到它的链式存储结构,然而区块链从比特币发展到今日当红的EOS,技术形态已经演化了10年之久.目前的EOS的存储除了确认结构的链式存储以外,在状态存储方面有了很大的进步, ...

随机推荐

  1. 如何筛选CRM客户系统无效数据

    企业将各个渠道获得的大量数据导入CRM系统之后,要如何筛选CRM客户系统无效数据?销售人员应该将更多的时间用于发掘潜在客户,而不是浪费时间来检索CRM数据.Zoho CRM能够呈现最有价值的客户,让销 ...

  2. centos 8 chown命令详解

    chown命令简介 chown将指定文件的拥有者改为指定的用户或组,用户可以是用户名或者用户ID:组可以是组名或者组ID: 文件是以空格分开的要改变权限的文件列表,支持通配符. 系统管理员经常使用ch ...

  3. Defense:MS08067漏洞攻防渗透实验

    实验环境 Windows XP SP3 IP:172.16.211.129 百度网盘:https://pan.baidu.com/s/1dbBGdkM6aDzXcKajV47zBw     靶机环境 ...

  4. http、tcp和socket简单理解

    1.Http属于应用层,主要解决如何包装数据. 2.Tcp属于传输层,主要解决数据如何在网络上传输. 3.Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API) ...

  5. 虚拟局域网VLAN简介

    VLAN 1.根据端口划分VLAN 2.根据MAC地址划分VLAN 3.根据网络层划分VLAN 4. IP组播作为VLAN VLAN优点 1.减少移动和改变的代价 2.虚拟工作组 3.限制广播包 4. ...

  6. C语言:交换两个变量的值

    #include <stdio.h> int main() { int a,b; //方法一:借助第三个变量 int t; a=1,b=2; t=a; a=b; b=t; printf(& ...

  7. C语言:最大公约数和最小公倍数

    #include <stdio.h> int main() { int a,b,c,m,t; printf("请输入两个数:\n"); scanf("%d%d ...

  8. python 遍历文件夹中所有文件

    '''使用walk方法递归遍历目录文件,walk方法会返回一个三元组,分别是root.dirs和files. 其中root是当前正在遍历的目录路径:dirs是一个列表,包含当前正在遍历的目录下所有的子 ...

  9. 【LeetCode】933.最近的请求次数

    933.最近的请求次数 知识点:队列: 题目描述 写一个 RecentCounter 类来计算特定时间范围内最近的请求. 请你实现 RecentCounter 类: RecentCounter() 初 ...

  10. PO封装设计模式 -- App移动端测试

    前言: 一.App_Po 封装 (用互联网上随便一个app进行) base 存放的是页面基础类,后续的类需继承基础类 common 存放的是公共部分,测试固件分离部分,新增截图功能部分 Data 存放 ...