1.PV和PVC的引入

Volume 提供了非常好的数据持久化方案,不过在可管理性上还有不足。

拿前面 AWS EBS 的例子来说,要使用 Volume,Pod 必须事先知道如下信息:

当前 Volume 来自 AWS EBS。

EBS Volume 已经提前创建,并且知道确切的 volume-id。

Pod 通常是由应用的开发人员维护,而 Volume 则通常是由存储系统的管理员维护。开发人员要获得上面的信息:

要么询问管理员。

要么自己就是管理员。

这样就带来一个管理上的问题:应用开发人员和系统管理员的职责耦合在一起了。如果系统规模较小或者对于开发环境这样的情况还可以接受。但当集群规模变大,特别是对于生成环境,考虑到效率和安全性,这就成了必须要解决的问题。

Kubernetes 给出的解决方案是 PersistentVolume 和 PersistentVolumeClaim。

PersistentVolume (PV) 是外部存储系统中的一块存储空间,由管理员创建和维护。与 Volume 一样,PV 具有持久性,生命周期独立于 Pod。

PersistentVolumeClaim (PVC) 是对 PV 的申请 (Claim)。PVC 通常由普通用户创建和维护。需要为 Pod 分配存储资源时,用户可以创建一个 PVC,指明存储资源的容量大小和访问模式(比如只读)等信息,Kubernetes 会查找并提供满足条件的 PV。

有了 PersistentVolumeClaim,用户只需要告诉 Kubernetes 需要什么样的存储资源,而不必关心真正的空间从哪里分配,如何访问等底层细节信息。这些 Storage Provider 的底层信息交给管理员来处理,只有管理员才应该关心创建 PersistentVolume 的细节信息。

2.通过NFS实现持久化存储

2.1配置nfs

k8s-master  nfs-server

k8s-node1  k8s-node2 nfs-client

所有节点安装nfs

yum install -y nfs-common nfs-utils

在master节点创建共享目录

[root@k8s-master k8s]# mkdir /nfsdata

授权共享目录

[root@k8s-master k8s]# chmod 666 /nfsdata

编辑exports文件

[root@k8s-master k8s]# cat /etc/exports/nfsdata *(rw,no_root_squash,no_all_squash,sync)

配置生效

[root@k8s-master k8s]# export -r

启动rpc和nfs(注意顺序)

[root@k8s-master k8s]# systemctl start rpcbind

[root@k8s-master k8s]# systemctl start nfs

作为准备工作,我们已经在 k8s-master 节点上搭建了一个 NFS 服务器,目录为 /nfsdata:

2.2创建PV

下面创建一个 PV mypv1,配置文件 nfs-pv1.yml 如下:

① capacity 指定 PV 的容量为 1G。

② accessModes 指定访问模式为 ReadWriteOnce,支持的访问模式有:

ReadWriteOnce – PV 能以 read-write 模式 mount 到单个节点。

ReadOnlyMany – PV 能以 read-only 模式 mount 到多个节点。

ReadWriteMany – PV 能以 read-write 模式 mount 到多个节点。

③ persistentVolumeReclaimPolicy 指定当 PV 的回收策略为 Recycle,支持的策略有:

Retain – 需要管理员手工回收。

Recycle – 清除 PV 中的数据,效果相当于执行 rm -rf /thevolume/*。

Delete – 删除 Storage Provider 上的对应存储资源,例如 AWS EBS、GCE PD、Azure Disk、OpenStack Cinder Volume 等。

④ storageClassName 指定 PV 的 class 为 nfs。相当于为 PV 设置了一个分类,PVC 可以指定 class 申请相应 class 的 PV。

⑤ 指定 PV 在 NFS 服务器上对应的目录。

创建 mypv1:

STATUS 为 Available,表示 mypv1 就绪,可以被 PVC 申请。

2.3创建PVC

接下来创建 PVC mypvc1,配置文件 nfs-pvc1.yml 如下:

PVC 就很简单了,只需要指定 PV 的容量,访问模式和 class。

执行命令创建 mypvc1:

从 kubectl get pvc 和 kubectl get pv 的输出可以看到 mypvc1 已经 Bound 到 mypv1,申请成功。

2.4创建pod

上面已经创建好了pv和pvc,pod中直接使用这个pvc即可

与使用普通 Volume 的格式类似,在 volumes 中通过 persistentVolumeClaim 指定使用 mypvc1 申请的 Volume。

通过命令创建mypod1:

2.5验证

可见,在 Pod 中创建的文件 /mydata/hello 确实已经保存到了 NFS 服务器目录 /nfsdata中。

如果不再需要使用 PV,可用删除 PVC 回收 PV。

3.PV的回收

当 PV 不再需要时,可通过删除 PVC 回收。

未删除pvc之前  pv的状态是Bound

删除pvc之后pv的状态变为Available,,此时解除绑定后则可以被新的 PVC 申请。

/nfsdata文件中的文件被删除了

因为 PV 的回收策略设置为 Recycle,所以数据会被清除,但这可能不是我们想要的结果。如果我们希望保留数据,可以将策略设置为 Retain。

通过 kubectl apply 更新 PV:

回收策略已经变为 Retain,通过下面步骤验证其效果:

① 重新创建 mypvc1。

② 在 mypv1 中创建文件 hello。

③ mypv1 状态变为 Released。

④ PV 中的数据被完整保留。

虽然 mypv1 中的数据得到了保留,但其 PV 状态会一直处于 Released,不能被其他 PVC 申请。为了重新使用存储资源,可以删除并重新创建 mypv1。删除操作只是删除了 PV 对象,存储空间中的数据并不会被删除。

新建的 mypv1 状态为 Available,已经可以被 PVC 申请。

PV 还支持 Delete 的回收策略,会删除 PV 在 Storage Provider 上对应存储空间。NFS 的 PV 不支持 Delete,支持 Delete 的 Provider 有 AWS EBS、GCE PD、Azure Disk、OpenStack Cinder Volume 等。

4.PV的动态供给

前面的例子中,我们提前创建了 PV,然后通过 PVC 申请 PV 并在 Pod 中使用,这种方式叫做静态供给(Static Provision)。

与之对应的是动态供给(Dynamical Provision),即如果没有满足 PVC 条件的 PV,会动态创建 PV。相比静态供给,动态供给有明显的优势:不需要提前创建 PV,减少了管理员的工作量,效率高。

动态供给是通过 StorageClass 实现的,StorageClass 定义了如何创建 PV,下面是两个例子。

StorageClass standard:

StorageClass slow:

这两个 StorageClass 都会动态创建 AWS EBS,不同在于 standard 创建的是 gp2 类型的 EBS,而 slow 创建的是 io1 类型的 EBS。不同类型的 EBS 支持的参数可参考 AWS 官方文档。

StorageClass 支持 Delete 和 Retain 两种 reclaimPolicy,默认是 Delete。

与之前一样,PVC 在申请 PV 时,只需要指定 StorageClass 和容量以及访问模式,比如:

5.PV&&PVC在应用在mysql的持久化存储

下面演示如何为 MySQL 数据库提供持久化存储,步骤为:

创建 PV 和 PVC。

部署 MySQL。

向 MySQL 添加数据。

模拟节点宕机故障,Kubernetes 将 MySQL 自动迁移到其他节点。

验证数据一致性。

首先创建 PV 和 PVC,配置如下:

mysql-pv.yml

mysql-pvc.yml

创建 mysql-pv 和 mysql-pvc:

接下来部署 MySQL,配置文件如下:

PVC mysql-pvc Bound 的 PV mysql-pv 将被 mount 到 MySQL 的数据目录 var/lib/mysql。

MySQL 被部署到 k8s-node2,下面通过客户端访问 Service mysql:

kubectl run -it --rm --image=mysql:5.6 --restart=Never mysql-client -- mysql -h mysql -ppassword

更新数据库:

① 切换到数据库 mysql。

② 创建数据库表 my_id。

③ 插入一条数据。

④ 确认数据已经写入。

关闭 k8s-node2,模拟节点宕机故障。

验证数据的一致性:

由于node2节点已经宕机,node1节点接管了这个任务。

通过kubectl run 命令 进入node1的这个pod里,查看数据是否依旧存在

MySQL 服务恢复,数据也完好无损。

6.小结

本章我们讨论了 Kubernetes 如何管理存储资源。

emptyDir 和 hostPath 类型的 Volume 很方便,但可持久性不强,Kubernetes 支持多种外部存储系统的 Volume。

PV 和 PVC 分离了管理员和普通用户的职责,更适合生产环境。我们还学习了如何通过 StorageClass 实现更高效的动态供给。

最后,我们演示了如何在 MySQL 中使用 PersistentVolume 实现数据持久性。

kubectl 创建pvc_k8s的持久化存储PVPVC相关推荐

  1. kubectl 创建pvc_k8s数据持久化之statefulset的数据持久化,并自动创建PV与PVC

    Statefulset StatefulSet是为了解决有状态服务的问题,对应的Deployment和ReplicaSet是为了无状态服务而设计,其应用场景包括:稳定的持久化存储,即Pod重新调度后还 ...

  2. kubectl 创建pvc_K8s针对有状态服务数据持久化之StatefulSet 自动创建PVC

    一.Kubernetes无状态服务VS有状态服务 1)Kubernetes无状态服务 Kubernetes无状态服务特征: 1)是指该服务运行的实例不会在本地存储需要持久化的数据,并且多个实例对于同一 ...

  3. 02.Kubernetes 和 KubeSphere 集群安装配置持久化存储(nfs)并通过StatefulSet动态为pod生成pv挂载

    Kubernetes 和 KubeSphere 集群安装配置持久化存储(nfs)并通过StatefulSet动态为pod生成pv挂载 简介 1. 安装配置前置环境 1.1 安装nfs文件系统 1.1. ...

  4. Kubernetes K8S之存储PV-PVC详解

    K8S之存储PV-PVC概述与说明,并详解常用PV-PVC示例 概述 与管理计算实例相比,管理存储是一个明显的问题.PersistentVolume子系统为用户和管理员提供了一个API,该API从如何 ...

  5. k8s之持久化存储PV、PVC

    目录 前言 一.k8s 容器磁盘 1.1 Volume(存储卷) 1.2 emptyDir 存储卷 1.3  hostPath存储卷 二.PV和PVC 1.PV 概念 2.PVC概念 3.PV 与 P ...

  6. Kubernetes持久化存储PV、PVC和StorageClass介绍

    PV和PVC Kubernetes Volume提供了非常好的数据持久化方案,不过对于大型Kubernetes集群来说管理上还有不方便之处.Volume方案需要创建Pod或者Deployment的管理 ...

  7. 使用Ceph集群作为Kubernetes的动态分配持久化存储

    2019独角兽企业重金招聘Python工程师标准>>> 使用Docker快速部署Ceph集群 , 然后使用这个Ceph集群作为Kubernetes的动态分配持久化存储. Kubern ...

  8. 14、Kubernetes持久化存储

    文章目录 前言 步骤 持久化服务器上操作 设置挂载路径 Node节点上操作 PV和PVC 实现流程 举例 前言 之前我们有提到数据卷:emptydir ,是本地存储,pod重启,数据就不存在了,需要对 ...

  9. Kubernetes 使用 ceph-csi 消费 RBD 作为持久化存储

    本文详细介绍了如何在 Kubernetes 集群中部署 ceph-csi(v3.1.0),并使用 RBD 作为持久化存储. 需要的环境参考下图: 本文使用的环境版本信息: Kubernetes 版本: ...

最新文章

  1. 多个线程为了同个资源打起架来了,该如何让他们安分?
  2. 视觉平衡与物理平衡_怎样做好摄影中“视觉平衡”的那些事
  3. Elementary OS 系统Java8环境的配置
  4. P4492-[HAOI2018]苹果树【dp】
  5. python逻辑运算符的使用_总结Python中逻辑运算符的使用
  6. Laravel 5 4 实现前后台登录
  7. 哀悼!知名教授逝世,享年55岁!
  8. 学java要算法吗_学习java不可不知的几种算法
  9. LeetCode(1021)——删除最外层的括号(JavaScript)
  10. 简单的学习一下node吧——还在学习中~~~
  11. 求解简单的四则运算表达式
  12. 620安装linux_Linux运维基础 Linux的quot;桑巴quot;
  13. SpringBoot参数传递bean自动填充
  14. visual stadio.net已检测到web服务器运行的不是asp.net1.1版故障的排除
  15. 爱奇艺Android移动客户端app瘦身经验
  16. idea 错误: -source 1.6 中不支持 diamond 运算符的解决办法
  17. lcx的使用-内网穿透
  18. LeetCode 781. 森林中的兔子
  19. 修改阿拉伯语等语言下的数字显示
  20. CTGU实验5_1-创建还书过程中的触发器

热门文章

  1. ElasticSearch搜索语法学习(term,filter,bool,terms,range)
  2. F4V 封装格式详解(一)-------box
  3. Nginx RTMP 功能研究
  4. Storm 04_Storm单机模式搭建完全分布式安装部署集群drpc
  5. leetcode 954. Array of Doubled Pairs | 954. 二倍数对数组(Java)
  6. JVM从入门到精通(五): Java运行时数据区和常用指令
  7. 三种方式实现分布式锁
  8. mybatis中去除多余的前缀或者后缀
  9. java中三种常见内存溢出错误的处理方法
  10. 算法训练营07-递归使用练习