kubernetes数据持久化PV PVC深入分析详解

目录
  • 1. 什么是PV,PVC?
    • 1.1 什么是PV
    • 1.2 什么是PVC?
  • 2. PV资源实践
    • 2.1 PV配置字段详解
    • 2.2 HostPath PV示例
    • 2.3 NFS PV示例
  • 3. PVC资源实践
    • 3.1 PVC配置清单详解
    • 3.2 hostPath-PVC示例
    • 3.3 NFS-PV-PVC实践之准备NFS共享存储
    • 3.4 准备NFS-PVC
      • 3.4.1准备Pod并使用PVC
      • 3.4.2 测试数据持久性

1. 什么是PV,PVC?

1.1 什么是PV

官方文档地址: https://kubernetes.io/zh-cn/docs/concepts/storage/persistent-volumes/

PresistentVolume(PV)是指集群管理员配置提供的某存储系统上的一段存储空间,它是对底层共享存储的抽象,将共享存储作为一种可由用户申请使用的资源,实现"存储消费"机制,通过存储插件,PV支持使用多种网络存储等多种后端存储系统,例如,NFS、CephFS、RBD。PV是集群级别的资源,不属于任何名称空间,用户对PV资源的使用需要通过PersistentVolumeClaim(PVC)提供的使用申请来完成绑定,PVC是PV资源的消费者,它向PV申请特定大小的空间及访问模式(rw或ro)从而创建出PVC存储卷。然后再由Pod资源通过PersistentVolumeClaim存储卷关联使用。

1.2 什么是PVC?

PersistentVolumeClaim,PVC是存储卷类型的资源,它通过申请占用某个PersistentVolume而创建,它与PV是一对一的关系,用户无须关心其底层实现细节,申请时,用户只需要指定目标空间的大小,访问模式,PV标签选择器和StorageClass等相关信息即可。

2. PV资源实践

2.1 PV配置字段详解

PresistentVolume Spec支持如下几个通用字段,用于定义PV的容量,访问模式和回收策。

1.Capacity: PV的容量

2.volumeMode: 卷类型,用于指定此卷可被用作文件系统还是裸格式的块设备,默认为Filesystem。

3.accessMode: PV的访问模式参考官方

  • 1.ReadWriteOnce: 仅可被单个节点读写挂载;命令行中简写RWO。
  • 2.ReadOnlyMany: 仅可被多个节点同时只读挂在;命令行简写ROX。
  • 3.ReadyWriteMany: 可被多个节点同时读写挂载;命令行中简写RWX。

4.persistentVolumeReclaimPolicy: PV空间的处理机制,可用类型为Retain(默认)、Recycle或Delete。

  • 1.Retain: 保持不动,由管理员手动回收。
  • 2.Recycle: 空间回收,即删除存储卷下的所有文件(包括子目录和隐藏文件rm -rf /thevolume/*),目前仅NFS和hostpath支持此功能。
  • 3.Delete: 删除存储卷,诸如 AWS EBS、GCE PD、Azure Disk 或 OpenStack Cinder 卷这类关联存储资产也被删除。

5.storageClassName: 当前PV所属的StorageClass的名称,默认为空,即不属于任何StorageClass。

6.mountOptions: 挂载选项组成的列表,如ro,soft和hard等。

2.2 HostPath PV示例

[root@kn-server-master01-13 pv]# cat hostpath-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-volume-001
spec:
  storageClassName: "host-storage"   资源类型的标识
  persistentVolumeReclaimPolicy: "Retain"  回收策略默认为Retain
  capacity:    定义空间
    storage: 1Gi  定义空间大小
  accessModes:    访问模式
    - ReadWriteOnce  访问模式为仅被单个节点读写挂载,单路读写
  hostPath:     临时存储在哪个地方
    path: "/mnt/data"
[root@kn-server-master01-13 pv]# kubectl get pv
NAME            CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
pv-volume-001   1Gi        RWO            Retain           Available           host-storage            4m36s

2.3 NFS PV示例

[root@kn-server-master01-13 pv]# cat nfs-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
  labels:     标签
    release: nfs-redis
spec:
  storageClassName: "nfs-storage"  资源类型表示
  persistentVolumeReclaimPolicy: "Recycle"  回收策略为Recycle相当rm -rf /
  capacity:
    storage: 0.5Gi
  accessModes:
  - ReadWriteMany
  nfs:
    server: 10.0.0.15
    path: /data/redis
[root@kn-server-master01-13 pv]# kubectl get pv
NAME            CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM             STORAGECLASS   REASON   AGE
nfs-pv          512Mi      RWX            Recycle          Available                     nfs-storage             62m
pv-volume-001   1Gi        RWO            Retain           Bound       default/001-pvc   host-storage            160m

3. PVC资源实践

3.1 PVC配置清单详解

PersistentVolumeClaim,PVC是存储卷类型的资源,它通过申请占用某个PersistentVolume而创建,它与PV是一对一的关系,用户无须关心其底层实现细节, 申请时,用户只需要指定目标空间的大小,访问模式,PV标签选择器和StorageClass等相关信息即可。

PVC的Spec字段可嵌套字段如下,

  • accessMode: 当前PVC的访问模式,其可用模式与PV相同。
  • resource当前PVC存储卷需要占用的资源的最大和最小值。
  • selector绑定时对PV应用的标签选择器,matchlabels或者匹配表达式matchEx-pressions用于挑选要绑定的PV,如果同时指定来两种挑选机制,则必须同时满足两种选择机制的PV才能被选出。
  • storageClassName: 所依赖的存储卷的名称。
  • volumeName: 用于直接制定要绑定的PV的卷名。

3.2 hostPath-PVC示例

[root@kn-server-master01-13 pv]# cat hostpath-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: 001-pvc
spec:
  storageClassName: "host-storage"  和PV的storageclassname须一致,否则无法识别。
  accessModes:
    - ReadWriteOnce
  resources:     pvc的资源限定仅指其空间大小。
    requests:
      storage: 0.9Gi  大小为0.9Gi;
[root@kn-server-master01-13 pv]#  kubectl apply -f hostpath-pvc.yaml
Available: 可用状态的自由资源,尚未被绑定PVC。
Bound: 已经绑定至某个PVC。
Released: 绑定的PVC已经被删除,但资源尚被集群回收。
Failed: 因自动回收资源失败而处于的故障状态。
[root@kn-server-master01-13 pv]# kubectl get pv pv-volume-001
NAME            CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM             STORAGECLASS   REASON   AGE
pv-volume-001   1Gi        RWO            Retain           Bound    default/001-pvc   host-storage            33m
[root@kn-server-master01-13 pv]# kubectl describe pv pv-volume-001
Name:            pv-volume-001
Labels:          <none>
Annotations:     pv.kubernetes.io/bound-by-controller: yes
Finalizers:      [kubernetes.io/pv-protection]
StorageClass:    host-storage
Status:          Bound
Claim:           default/001-pvc
Reclaim Policy:  Retain
Access Modes:    RWO
VolumeMode:      Filesystem
Capacity:        1Gi
Node Affinity:   <none>
Message:
Source:
    Type:          HostPath (bare host directory volume)
    Path:          /mnt/data
    HostPathType:
Events:            <none>
[root@kn-server-master01-13 pv]# kubectl describe pvc 001-pvc
Name:          001-pvc
Namespace:     default
StorageClass:  host-storage
Status:        Bound   已绑定
Volume:        pv-volume-001
Labels:        <none>
Annotations:   pv.kubernetes.io/bind-completed: yes
               pv.kubernetes.io/bound-by-controller: yes
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:      1Gi
Access Modes:  RWO
VolumeMode:    Filesystem
Used By:       <none>
Events:        <none>

3.3 NFS-PV-PVC实践之准备NFS共享存储

NFS即是网络文件系统,它是一种分布式文件系统协议,kubernetes中的NFS存储卷用于将某些事先存在的NFS服务器导出(export)的存储空间挂载到Pod中以供容器使用,与临时存储不同的是,NFS存储卷在Pod对象终止后仅仅是被卸载而非删除,NFS是文件系统级共享服务,它支持同时存在多路挂载,定义NFS存储卷时,常用如下字段。

server nfs服务器的地址或者主机名,必须字段。

pathnfs服务器导出(共享)的文件系统路径,必须字段。

readOnly是否以只读方式挂载,默认为false。

生产环境建议使用Ceph、azureDisk等公有云存储。

[root@kn-server-node02-15 ~]# yum install nfs-utils -y
[root@kn-server-node02-15 ~]# cat /etc/exports
/nfs/data5/ 10.0.0.0/24(rw,no_root_squash)
/data/redis 10.0.0.0/24
10.0.0.0/24  pod访问nfs服务会将源IP修改为节点IP,允许所有节点访问NFS服务
(ro,no_root_squash)访问NFS-SERVER共享目录的用户如果是root,它对共享目录有root权限
准备数据共享目录
[root@kn-server-node02-15 ~]# mkdir /data/redis -p
[root@kn-server-node02-15 ~]# systemctl enable nfs-server
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
服务端配置
各个工作节点安装nfs-utils
ubuntu安装: sudo apt-get install nfs-common 。
centos安装nfs-utils
[root@kn-server-master01-13 pv]# showmount -e 10.0.0.15
Export list for 10.0.0.15:
/data/redis 10.0.0.0/24
master节点和node节点都需要安装
[root@kn-server-node01-14 ~]# showmount -e 10.0.0.15
Export list for 10.0.0.15:
/data/redis 10.0.0.0/24

3.4 准备NFS-PVC

[root@kn-server-master01-13 pv]# cat nfs-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
  labels:    首先标签须匹配,不然无法匹配,也可以称为强行绑定。
    release: nfs-redis
spec:
  storageClassName: "nfs-storage"  须同属一个
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 0.5Gi  指定大小。
[root@kn-server-master01-13 pv]# kubectl apply -f nfs-pvc.yaml
persistentvolumeclaim/nfs-pvc created
显示已为绑定状态。
[root@kn-server-master01-13 pv]# kubectl get pv,pvc
NAME                             CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM             STORAGECLASS   REASON   AGE
persistentvolume/nfs-pv          512Mi      RWX            Recycle          Bound    default/nfs-pvc   nfs-storage             78m
persistentvolume/pv-volume-001   1Gi        RWO            Retain           Bound    default/001-pvc   host-storage            175m
NAME                            STATUS   VOLUME          CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/001-pvc   Bound    pv-volume-001   1Gi        RWO            host-storage   143m
persistentvolumeclaim/nfs-pvc   Bound    nfs-pv          512Mi      RWX            nfs-storage    6s
通过describe来查看
[root@kn-server-master01-13 pv]# kubectl describe pv nfs-pv
Name:            nfs-pv
Labels:          release=nfs-redis   所属标签
Annotations:     pv.kubernetes.io/bound-by-controller: yes
Finalizers:      [kubernetes.io/pv-protection]
StorageClass:    nfs-storage    storageclass名称
Status:          Bound   绑定状态
Claim:           default/nfs-pvc   名称空间
Reclaim Policy:  Recycle  回收策略
Access Modes:    RWX    访问模式
VolumeMode:      Filesystem
Capacity:        512Mi  大小
Node Affinity:   <none>
Message:
Source:
    Type:      NFS (an NFS mount that lasts the lifetime of a pod)
    Server:    10.0.0.15  来自那个nfs服务器
    Path:      /data/redis   共享的数据目录
    ReadOnly:  false
Events:        <none>

3.4.1准备Pod并使用PVC

[root@kn-server-master01-13 pv]# cat pod-redis.yaml
apiVersion: v1
kind: Pod
metadata:
  name: redis
spec:
  containers:
  - name: redis
    image: redis
    volumeMounts:
    - name: redis-data
      mountPath: /data
  volumes:
  - name: redis-data
    persistentVolumeClaim:
      claimName: nfs-pvc
[root@kn-server-master01-13 pv]# kubectl describe pods redis
Containers:
  redis:
    Container ID:   docker://d82061a1a86f56432e9956fc46bc810e577a0d89b91894e266e883bef68f5d9d
    Image:          redis
    Image ID:       docker-pullable://redis@sha256:db485f2e245b5b3329fdc7eff4eb00f913e09d8feb9ca720788059fdc2ed8339
    Port:           &lt;none&gt;
    Host Port:      &lt;none&gt;
    State:          Running
      Started:      Sun, 27 Nov 2022 21:57:34 +0800
    Ready:          True
    Restart Count:  0
    Environment:    &lt;none&gt;
    Mounts:
      /data from redis-data (rw)   已经挂载
[root@kn-server-master01-13 pv]# kubectl describe pvc nfs-pvc
Name:          nfs-pvc
Namespace:     default
StorageClass:  nfs-storage
Status:        Bound
Volume:        nfs-pv
Labels:        release=nfs-redis
Annotations:   pv.kubernetes.io/bind-completed: yes
               pv.kubernetes.io/bound-by-controller: yes
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:      512Mi
Access Modes:  RWX
VolumeMode:    Filesystem
Used By:       redis  这里可以看到是redis这个Pod正在使用这个PVC
Events:        &lt;none&gt;

3.4.2 测试数据持久性

[root@kn-server-master01-13 pv]# redis-cli -h 192.168.1.86
192.168.1.86:6379> set key haitang
OK
192.168.1.86:6379> get key
"haitang"
192.168.1.86:6379> bgsave
Background saving started
192.168.1.86:6379> exit
可以看到数据是写到nfs-server了
[root@kn-server-node02-15 redis]# ll
总用量 4
-rw-r--r-- 1 polkitd input 110 11月 27 22:14 dump.rdb
删除Pod后,数据是不会丢失的。
[root@kn-server-master01-13 pv]# kubectl delete pods redis
pod "redis" deleted
数据是还在的。
[root@kn-server-node02-15 redis]# ll
总用量 4
-rw-r--r-- 1 polkitd input 110 11月 27 22:20 dump.rdb

以上就是kubernetes数据持久化PV PVC深入分析详解的详细内容,更多关于kubernetes数据持久化PV PVC的资料请关注我们其它相关文章!

(0)

相关推荐

  • Kubernetes存储系统数据持久化管理详解

    目录 引言 安装存储系统 PV PVC StorageClass 安装NFS Provisioner 使用StorageClass 总结 引言 Kubernetes为了能更好的支持有状态应用的数据存储问题,除了基本的HostPath和EmptyDir提供的数据持久化方案之外,还提供了PV,PVC和StorageClass资源对象来对存储进行管理. PV的全称是Persistent Volume(持久化卷),是对底层数据存储的抽象,PV由管理员创建.维护以及配置,它和底层的数据存储实现方法有关,比

  • Visitor设计模式及发送pod创建请求实现详解

    目录 确立目标 visitor design pattern Visitor Chained VisitorList EagerVisitorList DecoratedVisitor ContinueOnErrorVisitor FlattenListVisitor FilteredVisitor Implements StreamVisitor FileVisitor URLVisitor KustomizeVisitor 发送创建Pod请求的实现细节 send request RESTfu

  • kubernetes数据持久化StorageClass动态供给实现详解

    目录 正文 基于NFS实现动态供应 准备NFS服务端的共享目录 安装NFS-Server驱动. 部署NFS-Provisioner 创建StorageClass 创建PVC,自动关联PV 创建Pod,测试数据是否持久. 正文 存储类的好处之一便是支持PV的动态供给,它甚至可以直接被视作为PV的创建模版,用户用到持久性存储时,需要通过创建PVC来绑定匹配的PV,此类操作需求较大,或者当管理员手动创建的PV无法满足PVC的所有需求时,系统按PVC的需求标准动态创建适配的PV会为存储管理带来极大的灵活

  • Kubernetes controller manager运行机制源码解析

    目录 Run StartControllers ReplicaSet ReplicaSetController syncReplicaSet Summary Run 确立目标 理解 kube-controller-manager 的运行机制 从主函数找到run函数,代码较长,这里精简了一下 func Run(c *config.CompletedConfig, stopCh <-chan struct{}) error { // configz 模块,在kube-scheduler分析中已经了解

  • Kubernetes Informer数据存储Index与Pod分配流程解析

    目录 确立目标 Process 查看消费的过程 Index 掌握Index数据结构 distribute 信息的分发distribute 理解一个pod的被调度的大致流程 Scheduler SchedulingQueue scheduleOne ScheduleResult 调度计算结果 Assume 初步推算 Bind 实际绑定 Update To Etcd Summary 确立目标 理解Informer的数据存储方式 大致理解Pod的分配流程 理解Informer的数据存储方式 代码在k8

  • Kubernetes ApiServer三大server权限与数据存储解析

    目录 确立目标 Run Three Servers KubeAPIServer GenericConfig Authentication Authorization Admission GenericAPIServer的初始化 New GenericServer NewAPIServerHandler installAPI Apiserver InstallLegacyAPI Create Pod Pod数据的保存 RESTCreateStrategy Storage Storage Imple

  • Kubernetes scheduler启动监控资源变化解析

    目录 确立目标 run Scheduler NodeName Informer Shared Informer PodInformer Reflect Summary 确立目标 理解kube-scheduler启动的流程 了解Informer是如何从kube-apiserver监听资源变化的情况 理解kube-scheduler启动的流程 代码在cmd/kube-scheduler run // kube-scheduler 类似于kube-apiserver,是个常驻进程,查看其对应的Run函

  • kubernetes数据持久化PV PVC深入分析详解

    目录 1. 什么是PV,PVC? 1.1 什么是PV 1.2 什么是PVC? 2. PV资源实践 2.1 PV配置字段详解 2.2 HostPath PV示例 2.3 NFS PV示例 3. PVC资源实践 3.1 PVC配置清单详解 3.2 hostPath-PVC示例 3.3 NFS-PV-PVC实践之准备NFS共享存储 3.4 准备NFS-PVC 3.4.1准备Pod并使用PVC 3.4.2 测试数据持久性 1. 什么是PV,PVC? 1.1 什么是PV 官方文档地址: https://k

  • 基于MyBatis的数据持久化框架的使用详解

    目录 一.MyBatis是什么 1.1.概述 1.2.什么是持久化 1.3.什么是ORM 1.4.MyBatis主要内容 1.5.优点 1.6.缺点 二.MyBatis架构 2.1.mybatis所依赖的jar包 2.2.MyBatis准备工作 三.MyBatis 核心对象 一.MyBatis是什么 1.1.概述 Mybatis是一个优秀的开源.轻量级持久层框架,它对JDBC操作数据库的过程进行封装,简化了加载驱动.创建连接.创建 statement 等繁杂的过程,使开发者只需要关注sql本身.

  • Android数据持久化之ContentProvider机制详解

    本文实例讲述了Android数据持久化之ContentProvider机制.分享给大家供大家参考,具体如下: 一般而言,android操作系统的应用程序所建立的数据只允许自己使用,应用程序彼此间无法借助公用存储器来共享数据,android系统提供了一个机制,即内容提供器(ContentProvider),来公开自己私有的数据到数据内容器,通过该机制,可以供其他应用程序来读取自己内部的数据,当然也可以访问其他应用程序的数据.通常,内容提供器背后都有SQLite数据库的支持,用以存储内容提供内部数据

  • Android数据持久化之Preferences机制详解

    本文实例讲述了Android数据持久化之Preferences机制.分享给大家供大家参考,具体如下: 在Android中,实现数据持久化有五种方式:Preferences,文件File,I/O操作.SQLite数据库,ContentProvider组件. 下面逐个做一简单的介绍: 一.Preferences的介绍: Preferences是一种轻量级的数据存储机制,他将一些简单的数据类型的数据,包括boolean类型,int类型,float类型,long类型以及String类型的数据,以键值对的

  • Unity3D游戏开发数据持久化PlayerPrefs的用法详解

    小编今天研究了在Unity3D中的数据持久化问题.数据持久化在任何一个开发领域都是一个值得关注的问题,小到一个应用中配置文件的读写,大到数据库的管理维护,都可以看到数据持久化的身影.小编在<C#基于Linq和反射实现数据持久化框架Xml4DB>这篇文章中曾介绍了博主在寒假期间开发的Xml4DB框架,这是一个基于Xml的轻量级数据持久化框架,可以采用面向对象的方式来处理数据.数据持久化从某种意义上来说,就是序列化和反序列化化的过程.在.NET中我们可以将对象序列化为Xml.Json.二进制.然后

  • vuex中数据持久化插件vuex-persistedstate使用详解

    目录 数据持久化vuex-persistedstate使用 安装起步 配置使用 自定义存储方式 想使用cookie同理 使用vuex-persistedstate插件遇到的问题 数据持久化vuex-persistedstate使用 vuex是在中大型项目中必不可少的状态管理组件,刷新会重新更新状态,但是有时候我们并不希望如此.例如全局相关的,如登录状态.token.以及一些不常更新的状态等,我们更希望能够固化到本地,减少无用的接口访问,以及更佳的用户体验. 安装起步 npm i vuex-per

  • kubernetes存储之GlusterFS集群详解

    目录 1.glusterfs概述 1.1.glusterfs简介 1.2.glusterfs特点 1.3.glusterfs卷的模式 2.heketi概述 3.部署heketi+glusterfs 3.1.准备工作 3.1.1.所有节点安装glusterfs客户端 3.1.2.节点打标签 3.1.3.所有节点加载对应模块 3.2.创建glusterfs集群 3.2.1.下载相关安装文件 3.2.2.创建集群 3.2.3.查看gfs pods 3.3.创建heketi服务 3.3.1.创建heke

  • tensorflow的ckpt及pb模型持久化方式及转化详解

    使用tensorflow训练模型的时候,模型持久化对我们来说非常重要. 如果我们的模型比较复杂,需要的数据比较多,那么在模型的训练时间会耗时很长.如果在训练过程中出现了模型不可预期的错误,导致训练意外终止,那么我们将会前功尽弃.为了解决这一问题,我们可以使用模型持久化(保存为ckpt文件格式)来保存我们在训练过程中的临时数据.. 如果我们训练出的模型需要提供给用户做离线预测,那么我们只需要完成前向传播过程.这个时候我们就可以使用模型持久化(保存为pb文件格式)来只保存前向传播过程中的变量并将变量

  • Redis数据过期策略的实现详解

    目录 一.设置过期时间 1.常用方式 2.字符串独有方式 二.3种过期策略 三.Redis采用的过期策略 四.RDB对过期key的处理 五.AOF对过期key的处理 本文对Redis的过期机制简单的讲解一下 讲解之前我们先抛出一个问题,我们知道很多时候服务器经常会用到redis作为缓存,有很多数据都是临时缓存一下,可能用过之后很久都不会再用到了(比如暂存session,又或者只存放日行情股票数据)那么就会出现一下几个问题了 Redis会自己回收清理不用的数据吗?如果能,那如何配置?如果不能,如何

  • Oracle表中重复数据去重的方法实例详解

    Oracle表中重复数据去重的方法实例详解 我们在项目中肯定会遇到一种情况,就是表中没有主键 有重复数据 或者有主键 但是部分字段有重复数据 而我们需要过滤掉重复数据 下面是一种解决方法 delete from mytest ms where rowid in (select aa.rid from (select rowid as rid, row_number() over(partition by s.name order by s.id) as nu from mytest s) aa

随机推荐