Kubernetes中可用将本地磁盘作为存储挂载到容器上,但这样做的弊端是当容器出现异常而重启之后数据也会随之消失

    spec:containers:- name: logs# 挂载volumeMounts:- name: varlogmountPath: /tmp/log# 定义本地存储volumes:- name: varloghostPath:path: /var/log

为了实现容器存储与计算的分离,可将容器的数据单独存放到**网络共享存储(Network File System,NFS)**服务器上,当容器挂掉之后并不会影响到数据,之后容器重启或一个新的容器连接到服务器后可以重新读取到数据

1 NFS的使用

首先需要将一台服务器配置为NFS服务器

# 安装nfs
yum install -y nfs-utils
# 创建存放数据的目录
mkdir -p /data/nfs
# 创建并设置挂载路径
vim /etc/exports
/data/nfs *(rw,no_root_squash)
# 启动服务
systemctl start nfs

之后在K8s集群的Node节点上也安装nfs服务

yum install -y nfs-utils

最后就可以使用nfs作为数据挂载点了,在其中定义nfs服务器的地址server和其上面的存储路径path。通过如下配置文件就将pod中的 /usr/share/nginx/html 挂载到了 192.168.44.134/data/nfs

    spec:containers:- name: nginximage: nginxvolumeMounts:# 挂载nfs- name: mynfsmountPath: /usr/share/nginx/htmlports:- containerPort: 80volumes:# 定义nfs数据挂载点- name: mynfsnfs:server: 192.168.44.134path: /data/nfs

2 PV与PVC

上面的nfs挂载时ip 和端口是直接写在容器yaml文件中的,这样管理起来可能不方便。我们可以将nfs详细信息定义到PV(PersistentVolume)中,通过PVC(PersistentVolumeClaim)与其进行绑定,然后在定义容器时直接使用PVC而不必关心PV中具体的端口和IP等细节。

2.1 使用

如下所示PV定义文件mypv.yaml,在其中定义其存储大小、路径等信息,通过kubectl apply -f mypv.yaml进行创建

apiVersion: v1
kind: PersistentVolume
metadata:name: my-pv
spec:capacity:storage: 5GiaccessModes:- ReadWriteManynfs:# 定义PV的存储路径path: /k8s/nfsserver: 192.168.44.134

之后根据如下文件创建PVC

apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: my-pvc
spec:# 访问模式;描述用户应用对存储资源的访问权限accessModes:- ReadWriteManyresources:requests:# 资源请求的存储大小storage: 5Gi

其中,accessModes有如下三种模式

  • RWO:ReadWriteOnce,仅允许单个节点挂载进行读写;
  • ROX:ReadOnlyMany,允许多个节点挂载且只读;
  • RWX:ReadWriteMany,允许多个节点挂载进行读写;

之后在创建容器时就可以通过PVC的方式挂载存储,不必关心其底层存储PV的实现细节

apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-dep1
spec:template:metadata:labels:app: nginxspec:containers:- name: nginximage: nginxvolumeMounts:- name: wwwrootmountPath: /usr/share/nginx/htmlports:- containerPort: 80volumes:- name: wwwroot# 挂载到my-pvcpersistentVolumeClaim:claimName: my-pvc

2.2 PV和PVC的生命周期


如图所示,PVC在与PV绑定之后状态就会变为Bound,PVC一共有如下几种状态:

  • Available: 可用状态,无PV绑定;
  • Bound:绑定状态,已经和某个PV绑定;
  • Released:释放状态,被绑定的PV已删除,资源释放,但没有被集群回收;
  • Failed:失败状态,自动资源回收失败;

如下所示,容器Pod经过PVC -> PV 使用存储资源,其生命周期可以分为供应、绑定、使用、释放和回收

  1. 资源供应:通过PV建立对不同磁盘资源的描述,提供PV资源给消费者使用
  2. 资源绑定:创建好PVC后,PVC会在已存在的PV中选择合适的PV进行绑定,绑定成功,状态变成Bound,且该PV被对应的PVC独占绑定,不可以再被其他PVC绑定,除非该PVC释放。若在k8s系统中没有找到合适的PV,则PVC一直处于Pending状态。
  3. 资源使用:在通过Deployment创建容器时,在spec.template.spec.volumes进行磁盘挂载时选择persistentVolumeClaim挂载到对应的PVC。
  4. 资源释放:删除PVC,与该PVC绑定的PV状态就会变成“Released”,该PVC在存储设备上的数据删除后,对应的PV才能与其他的PVC进行绑定。
  5. 资源回收:PV中可以通过spec.persistentVolumeReclaimPolicy设置回收策略,用于在绑定的PVC删除后,资源释放后如何处理PVC写入存储设备的数据:
    Retain:保留,删除PVC后,PV保留数据;
    Recycle:回收空间,删除PVC后,简单的清除文件;(NFS和HostPath存储支持)
    Delete:删除,删除PVC后,与PV相连接的后端存储会删除数据;(AWS EBS、Azure Disk、Cinder volumes、GCE PD支持)

2.3 PV与PVC的绑定

PV与PVC之间可以通过静态绑定或者动态绑定建立连接:

  • 静态模式就是集群管理员预先创建对应的PV对存储特性进行设置;
  • 动态模式就是管理员预先创建好StorageClass资源对后端存储进行描述,PVC创建时对存储类型进行声明,k8s会自动创建合适的PV与PVC进行绑定。

手动绑定

如下所示,首先定义一个test-pv1

[root@k8s /pv_test]#  vim test_pv1.yaml
apiVersion: v1
kind: PersistentVolume
metadata:# 定义PV的名字name: test-pv1labels:pv: test-pv1
spec:capacity:storage: 2MiaccessModes:- ReadWriteManypersistentVolumeReclaimPolicy: Retainnfs:path: /date-nfs/k8sserver: 10.139.12.14

之后定义 PVC,在其中通过spec.selector.matchLabels标签匹配上面定义的test-pv1

[root@k8s /pvc_test]#  vim test_pvc1.yaml
#persistent Volume Claim
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: test-pvc1namespace: t1
spec:#storageClassName: managed-nfs-storageaccessModes:- ReadWriteManyresources:requests:storage: 1Miselector:# 手动进行绑定matchLabels:pv: test-pv1

动态绑定

上面的手动绑定无法根据PVC的访问模式,容量大小等实际需要灵活地匹配到合适的PV,每次去手动选择或创建PV会变得十分繁琐。这时可以通过StorageClass根据pvc定义的来动态创建合适的pv,不仅节省了管理员的时间,还可以封装不同类型的存储供pvc选用。如下所示通过StorageClass将PVC和PV进行自动绑定的过程

首先创建一个StorageClass

[root@master1 sc]# cat nfs-sc.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: statefu-nfsnamespace: default
# 云盘资源提供方
provisioner: nfs-deploy
reclaimPolicy: Retain[root@master1 sc]# kubectl apply -f nfs-sc.yaml
storageclass.storage.k8s.io/statefu-nfs created

然后创建PVC,在其中配置spec.storageClassName为上面的创建的statefu-nfs。

[root@master1 sc]# cat test-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: test-claimnamespace: default
spec:storageClassName: statefu-nfs   #sc一定要指向上面创建的sc名称accessModes:- ReadWriteMany   #采用ReadWriteMany的访问模式resources:requests:storage: 1Gi[root@master1 sc]# kubectl apply -f test-pvc.yaml

可以看到PVC test-claim创建成功之后,随之自动创建了对应的PV并且绑定到了test-claim

[root@master1 sc]# kubectl get pvc
NAME         STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
test-claim   Bound    pvc-0b9e1107-fefc-48b9-a5ec-8f8690e94435   1Gi        RWX            statefu-nfs    107m[root@master1 sc]# kubectl get pv
NAME             CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM            STORAGECLASS   REASON   AGE
pvc-0b9e1107-fefc-48b9-a5ec-8f8690e94435  1Gi  RWX  Delete   Bound   default/test-claim statefu-nfs          107m

Kubernetes中使用PersistentVolume挂载云盘相关推荐

  1. 阿里云服务器购买之后设置密码、安全组、增加带宽、挂载云盘教程

    当我们通过阿里云各种活动购买完云服务器之后,设置云服务器远程密码.配置安全组规则是必须操作的,由于活动中的云服务器购买时大多只有1M带宽,且没有数据盘,因此增加带宽和挂载云盘教程也是很多用户会做的事情 ...

  2. 服务器挂载云盘是做什么用,单独创建的云盘怎么挂载到ECS实例上

    单独创建的云盘怎么挂载到ECS实例上 发布时间:2020-07-10 14:36:57 来源:亿速云 阅读:119 作者:Leah 本篇文章为大家展示了单独创建的云盘怎么挂载到ECS实例上,代码简明扼 ...

  3. 【Linux系列】挂载云盘

     目录 1.查看信息 2.创建单分区数据盘 3.查看分区 4.创建文件系统 5.备份 6.新分区 7.查看新分区 8.挂载 9.查看 总结: 查看文件及文件夹占用空间大小 du -sh *du -h ...

  4. 【139】阿里云挂载云盘的方法

    先执行fdisk -l 可以看到硬盘情况,此时还没有挂载云盘. fdisk -lDisk /dev/vda: 42.9 GB, 42949672960 bytes, 83886080 sectors ...

  5. 阿里云Ecs挂载云盘

    转载请注明出处 http://www.paraller.com 原文排版地址 http://www.paraller.com/2015/10/22/%E9%98%BF%E9%87%8C%E4%BA%9 ...

  6. JDK1.8中文文档-阿里云盘

    需要自取吧,由于阿里云盘不支持zip文件分享,已经用7z压缩-创建自释放程序 下载JDK1.8中文文档.exe,直接打开即可 https://www.aliyundrive.com/s/nzg9G3Z ...

  7. 在华为云主机中添加新的云盘

    背景 一直借用朋友的华为云主机,系统盘只有40G,虽然有点小,但是只跑一些简单的测试程序,也够用了. 今天登录云主机控制台调整配置,才发现还有个100G的云盘一直空着......还是太年轻啊!! 添加 ...

  8. 阿里云服务器挂载云盘

    原以为服务器的盘都是配置好的,今天才发现还有数据盘未挂载.系统为CentOS6.8,挂载数据盘. 1.查看所有硬盘信息以及分区的格式 # lsblk -f 2.对硬盘进行分区 #fdisk /dev/ ...

  9. 百度云主机BCC挂载云盘CDS

    1.查看云磁盘. a.在没有分区和格式化云磁盘之前,执行df -h命令无法查看到云磁盘 b.执行fdisk -l查看,红色框为云磁盘初始化前的信息. 如下图所示: 2.对云磁盘进行分区. 执行命令fd ...

最新文章

  1. python读取内存和空闲内存
  2. java jtable行标题_如何设置JTable的标题——如图
  3. bat脚本注释多行_cmd批处理常用符号详解
  4. boost::safe_numerics模块实现检测到错误表达式评估的测试程序
  5. mysql 中 end like,MySQL 这三道必问面试题,你都会吗?
  6. php array_key_exists() 与 isset() 的区别
  7. java安装好了打不开机_门套安装是45度拼接还是直角好?当初不懂行,没有半年就重装!...
  8. 累加List对象中的某一个值
  9. Hough检测直线原理及c++代码
  10. jeecg框架中时间控件时分秒的显示
  11. 大学BBS年度十大原创淡黄笑话
  12. UE4路径跟随插件使用文档
  13. 小鸟云服务器如何安装rstudio-server?
  14. 小白装openstack(二) 安装NTP服务
  15. 计算机16进制A3 B9,ASCII码16进制对照表
  16. python利用jieba实现中文分词
  17. 格里高利历java_Java 日历笔记
  18. 【uni-app】H5的返回拦截经验分享
  19. 陈大好:持续创造小而美的产品丨独立开发者 x 开放麦
  20. 2021宜宾叙州区二中高考成绩查询,宜宾叙州第二中学2021年录取分数线

热门文章

  1. JavaScript 获取每月最大的天数
  2. arr访问绝对地址_西门子1200PLC与汇川伺服电机的MODBUS-RTU通讯
  3. DELL EqualLogic PS6100存储数据恢复方法和结构详解
  4. LAS100定位基站
  5. 先到先服务-作业调度算法-c++ 数组
  6. u盘文件没删除却消失了是什么原因?数据怎么恢复?
  7. 超高速数据采集记录存储回放系统
  8. 如何解决origin导出图像有dome字样
  9. 阿里巴巴前架构师360度无死角剖析微服务
  10. Linux音频设备驱动[zz]