Volume数据管理

news2024/9/26 1:01:26
  1. Volume
    1. 容器销毁时,保存在容器内部文件系统中的数据都会被清除,为了持久化保存容器的数据,可以使用kubernetes Volume
    2. volume的生命周期独立于容器,Pod中的容器可能被销毁和重建,但Volume会被保留
    3. 本质上,Kubernetes Volume是一个目录,当Volume被mount到Pod,Pod中的所有容器都可以访问这个Volume,Volume提供了对各种backend的抽象,容器在使用Volume读写数据时不需要关心数据到底是存在本地节点的文件系统还是云硬盘上,对他来说,所有类型的Volume都只是一个目录
    4. Kubernetes Volume支持多种backend类型,包括emptyDir, hostPath, GCE Persistent Disk, AWS Elastic Block Store, NFS, Ceph等
  2. emptyDir
    1. emptyDir是最基础的Volume类型,一个emptyDir Volume是Host上的一个空目录

    2. emptyDir Volume对于容器来说是持久的,对于Pod则不是,当Pod从节点删除时,Volume的内容也会被删除,但如果只是容器被销毁而Pod还在,则Volume不受影响,也就是说emptyDir Volume的生命周期与Pod一致

    3. Pod中的所有容器都可以共享Volume,他们可以指定各自的mount路径,在这里插入图片描述

    4. 配置解析:

      1. 模拟了一个producer-consumer场景,Pod有两个容器producer和consumer,他们共享一个Volume,producer负责往Volume中写数据,consumer则是从Volume读取数据
      2. 文件底部Volume定义了一个emptyDir类型的Volume shared-volume
      3. producer容器将shared-volume mount到/producer_dir目录
      4. producer通过echo将数据写到文件hello中
      5. consumer容器将shared-volume mount到/consumer_dir目录
      6. consumer通过cat从文件hello读取数据
    5. 执行命令创建Pod在这里插入图片描述

      1. kubectl logs显示容器consumer成功读到了producer写入的数据,验证了两个容器共享emptyDSir Volume
    6. 因为emptyDir是Docker Host文件系统里的目录,其效果相当于执行了docker run -v/producer_dir 和 docker run -v /consumer_dir 。通过docker inspect 查看容器的详细配置信息,可以看到两个容器都mount了同一个目录在这里插入图片描述
      在这里插入图片描述

      1. 这里的var/lib/kubelet/pods/3e6100eb-a97a-11e7-8f72-0800274451ad/volumes/kubernetes.io~empty-dir/shared-volume就是emptyDir在Host上的真正路径
    7. emptyDir是Host上创建的临时目录,其优点是能够方便地为Pod中的容器提供共享存储,不需要额外的配置,他不具备持久性,如果pod不存在了,emptyDir也就没有了,根据这个特性,emptyDir特别适合Pod中的容器需要临时共享存储空间的场景,比如之前的生产者消费者

  3. hostPath
    1. hostPath Volume的作用是将Docker Host文件系统中已经存在的目录mount给Pod的容器,

    2. 大部分应用都不会使用hostPath Volume,因为这实际上增加了Pod与节点的耦合,限制了Pod的使用

    3. 不过那些需要访问kubernetes或DSocker内部数据(配置文件和二进制库)的应用则需要使用hostPath。比如kube-apiserver和kube-controller-manager就是这样的应用,通过kubectl edit–namespace=kube-system pod kube-apiserver-k8s-master查看kube-apiserver Pod的配置在这里插入图片描述

      1. 这里定义了三个hostPath:volume k8s,certs 和pki,分别对应的Host目录/etc/kubernetes, /etc/ssl/certs和/etc/pki
      2. 如果Pod被销毁了,hostPath对应的目录还是会被保留,从这一点看,hostPath的持久性比emptyDir强,不过一旦Host崩溃。hostPath也就无法访问了
    4. 外部Storage Provider

      1. 如果Kubernetes部署在诸如AWS,GCE,Azure等公有云上,可以直接使用云硬盘作为Volume,以AWS Elastic Block Store为例子:在这里插入图片描述

        1. 要在Pod中使用ESB volume,必须先在AWS中创建,然后通过volume-id引用,
      2. Kubernetes Volume也可以使用主流的分布式存储,比如Ceph,GlusterFS等,以Ceph为例:

        1. 在这里插入图片描述

        2. Ceph文件系统的/some/path/in/side/cephfs目录被mount到容器路径/test-ceph,相对于emptyDir和hostPath,这些Volume类型的最大特点是不依赖Kubernetes,Volume的底层基础设施由独立的存储系统管理,与Kubernetes集群是分离的,数据被持久化后,即使整个Kubernetes崩溃也不会受损

    5. PersistentVolume & PersistentVolumeClaim

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

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

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

      4. Kubernetes支持多种类型的PersistenVolume,比如AWS EBS, Ceph,NFS等,

      5. NFS PersistentVolume

        1. 先做准备工作,在k8s-master节点上搭建一个NFS服务器,目录为/nfsdata在这里插入图片描述

        2. 创建一个PV mypv1,配置文件为nfs-pv1.yml在这里插入图片描述

          1. capacity指定PV的容量为1GB
          2. accessModes指定访问模式为ReadWriteOnce,支持的访问模式有三种,ReadWriteOnce表示PV能以read-write模式mount到单个节点,ReadOnlyMany表示PV能以read-only模式mount到多个节点
          3. persistentVolumeReclaimPolicy指定当PV的回收策略为Recycle,支持的策略有三种,Retain表示需要管理员手工回收,Recycle表示清除PV中的数据,效果相当于执行rm -rf/thevolume/*,Delete表示删除Storage Provider上的对应存储资源,例如AWS EBS, GCE PD, Azure Disk, OpenStack Cinder Volume等
          4. storageClassName指定PV的class为nfs,相当于为PV设置了一个分类,PVC可以指定class申请相应class的PV
          5. 指定PV在NFS服务器上对应的目录
        3. 创建mypv1在这里插入图片描述

          1. status为available,表示mypv1就绪,可以被PVC申请
        4. 创建PVC mypvc1,配置文件为nfs-pvc1.yml,只需要指定PV的容量,访问模式和class即可在这里插入图片描述

        5. 创建mypvc1,从kubectl get pvc 和kubectl get pv的输出,可以看到mypvc1已经bound到mypv1,申请成功在这里插入图片描述

        6. 在pod中使用存储,Pod配置文件pod1.yml在这里插入图片描述

        7. 与普通Volume的格式相似,在volumes中通过persistentVolumeClaim指定使用mypvc1申请的volume在这里插入图片描述

        8. 验证PV是否可用,可见,在pod中创建的文件/mydata/hello已经保存到了NFS服务器目录/nfsdata/pv1中在这里插入图片描述

      6. 回收PV

        1. 当不需要使用PV时,可删除PVC回收PV在这里插入图片描述

          1. 当PVC mypvc1被删除后,发现kubernetes启动了一个新Pod recycler-for-mypv1,这个Pod的作用就是清除PV mypv1的数据,此时mypv1的状态Released,表示已经被解除了与mypvc1的bound,正在清除数据,不过此时还不可用,

          2. 当数据清除完毕,mypv1的状态重新变为Available,此时可以被新的PVC申请在这里插入图片描述

          3. /nfsdata/pv1中的hello文件已经被删除了,因为PV的回收策略设置为Recycle,所以数据会被清除,如果希望保留数据,可以将策略设置为Retain在这里插入图片描述

          4. 通过kubectl apply更新PV在这里插入图片描述

          5. 回收策略已经变为Retain在这里插入图片描述

            1. 重新创建mypvc1
            2. 在mypv1中创建文件hello
            3. mypv1状态变为Released
            4. kubernetes并没有启动pod recycle-for-mypv1
            5. PV中的数据被完整保留
          6. 虽然mypv1中的数据得到了保留,但其PV状态会一直处于Released,不能被其他PVC申请,为了重新使用存储资源,可以删除并重新创建mypv1,删除操作只是删除了PV对象,存储空间中的数据并不会被删除

          7. 新建的mypv1状态为Available,可以被PVC申请在这里插入图片描述

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

      7. PV动态供给

        1. 在前面,提前创建了PV,然后通过PVC申请PV并在Pod中使用,这种方式叫做静态供给
        2. 与之对应的是动态供给,即如果没有满足PVC条件的PV,会动态创建PV,相比静态供给,动态供给有明显的优势,不需要提前创建PV
        3. 动态供给通过StorageClass实现,StorageClass定义了如何创建PV
          1. StorageClass standard在这里插入图片描述

          2. StorageClass slow在这里插入图片描述

          3. 这两个StorageClass都会动态创建AWS EBS,不同点在于standard创建的是gp2类型的EBS,而slow创建的是io1类型的EBS,

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

          5. PVC在申请PV时,只需要指定StorageClass,容量以及访问模式即可在这里插入图片描述

      8. 以数据库为例子:如何为mysql数据库提供持久化存储

        1. 创建PV和PVC
        2. 部署mysql
        3. 向mysql添加数据
        4. 模拟节点宕机故障,kubernetes将mysql自动迁移到其他节点
        5. 验证数据一致性
          1. 首先创建PV和PVC,配置文件为mysql-pv.yml在这里插入图片描述

          2. mysql-pvc.yml在这里插入图片描述

          3. 创建mysql-pv和mysql-pvc在这里插入图片描述

          4. 部署mysql,配置文件为在这里插入图片描述

          5. PVC mysql-pvc bound的PV mysql-pv将被mount到mysql的数据目录var/lib/mysql在这里插入图片描述

          6. mysql被部署到k8s-node2,通过客户端访问Service mysql:kuberctl run -it --rm --image=mysql:5.6 --restart=Never mysql-client – mysql-hmysql -ppassword在这里插入图片描述

          7. 更新数据库在这里插入图片描述

            1. 切换到数据库mysql
            2. 创建数据表my_id
            3. 插入一条记录
            4. 确认数据已经写入
          8. 关闭k8s-node2,模拟节点宕机故障在这里插入图片描述

          9. 一段时间后,kubernetes将mysql迁移到k8s-node1在这里插入图片描述

          10. 验证数据一致性在这里插入图片描述

          11. mysql服务恢复,数据也完好无损

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2165316.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【机器学习】Flux.jl 生态

官方API https://fluxml.ai/Flux.jl/stable/ecosystem/ 官网给出了 Flux’s model-zoo, 是一个庞大的案例库, 可以提供直观的参考, 并且还列举了基于 Flux.jl 开发的第三方库。 机器视觉 ObjectDetector.jl YOLO 抓取的“预备跑” 图像Met…

Vue3:作用域插槽

目录 一.性质 1.数据传递性 2.自定义显示方式 3.复用性 4.解耦性 二.作用 1.提高灵活性 2.增强可维护性 3.简化数据流 4.提升用户体验 三.使用 1.父组件 2.子组件 四.代码 1.父组件代码 2.子组件代码 五.效果 作用域插槽(Scoped Slots)…

一个很小的系统为什么负载那么高?

最近帮朋友优化一个系统&#xff0c;基本的情况如下&#xff1a;虚拟机&#xff0c;centos7.9&#xff0c;oracle 11.2.0.4&#xff0c;MES系统&#xff0c;数据量<50GB,日常session数不足100&#xff1b;按说这应该是一个负载很低的系统&#xff0c;但是用户却反映系统CPU经…

jQuery——jQuery的基本使用

1、使用 jQuery 核心函数&#xff1a;$ / jQuery 2、使用 jQuery 核心对象&#xff1a;执行 $&#xff08;&#xff09;返回的对象 3、引入 jQuery 函数库&#xff1a;可以本地引入&#xff08;不用联网&#xff09;&#xff0c;也可以远程引入&#xff08;需联网&#xff09…

GIS开发常用的开源地图数据框架有哪些?

学完Web前端开发&#xff0c;还需要掌握哪些内容&#xff1f;本篇文章再给大家主要讲讲针对WebGIS开发的地图和可视化数据库。 Echarts ECharts是一个使用 JavaScript 实现的开源可视化库。它可以流畅的运行在 PC 和移动设备上&#xff0c;兼容当前绝大部分浏览器&#xff08;…

OpenHarmony(鸿蒙南向)——平台驱动指南【DAC】

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… 概述 功能简介 DAC&#xff08;Digital to Analog Converter&…

分享课程:VUE数据可视化教程

在当今这个数据驱动的世界中&#xff0c;数据可视化已经成为了一种至关重要的工具&#xff0c;它帮助我们理解复杂的数据集&#xff0c;发现模式、趋势和异常。数据可视化不仅仅是将数字转换成图表&#xff0c;它是一种将数据转化为洞察力的艺术。 1.什么是数据可视化&#xf…

2021世界人工智能大会召开 百度展示量子技术影响力

姓 名&#xff1a;王芷若 学 号&#xff1a;19020100180 学 院&#xff1a;电子工程学院 转载自&#xff1a;钥成网 原文链接&#xff1a; https://baijiahao.baidu.com/s?id1704906954970597725&wfrspider&forpc&searchword2021%E4%B8%9…

Windows (rust) vulkan 画一个三角形: 窗口创建与渲染初始化

在每个平台, 每前进一步, 都会出现许多预料之外的困难 (大坑). 本文介绍在 Windows 操作系统之中, 使用 win32 API 创建窗口, 并使用 vulkano (rust) 初始化 vulkan, 绘制一个三角形. 这里是 穷人小水滴, 专注于 穷人友好型 低成本技术. (本文为 63 号作品. ) 相关文章: 《r…

企业微信聊天记录怎么查看,会话存档的妙用!

在企业微信中&#xff0c;老板是否可以任意查看任何人的聊天记录取决于是否开通了会话存档功能以及你是否在存档的成员范围内。以下是详细解释&#xff1a; 如果企业开通了会话存档功能&#xff0c;并且在存档的成员范围内&#xff0c;老板可以看到该成员的聊天记录。 存档的…

点餐小程序实战教程11数据源设计

目录 1 设计图2 创建数据源2.1 菜品分类2.2 菜品表 3 创建管理应用4 设置上架下架功能总结 我们用了10篇讲解了一下用户管理及权限设计&#xff0c;有了用户和权限相当于有了骨架&#xff0c;但是我们还需要有良好的设计来确保我们的小程序的开发顺利进行。 在数据源的设计中&a…

光伏开发:一分钟生成光伏项目报告

传统光伏项目报告的编制往往需要收集大量数据、进行复杂计算与分析&#xff0c;耗时长且易受人为因素影响。自动生成光伏项目报告&#xff0c;依托大数据、云计算、人工智能等先进信息技术&#xff0c;实现了对光伏项目关键参数的快速分析、评估与预测。 一、核心功能与流程 1…

Python学习笔记--BeeWare跨平台打包方案2

文章目录 1. 多文件开发支持 首先贴上官方的地址&#xff1a; BeeWare 教程 其中的安装和初始化过程在上一片有描述&#xff0c;这张介绍一些基础使用&#xff1a; 1. 多文件开发支持 通常一个工程下我们通常会分为多个 app进行开发&#xff0c;例如如下目录&#xff1a; 如…

vue3/Element-Plus/路由的使用

我们来实现一个简单的二级路由 1.准备主页和要配置的组件 主页面 <template><!-- 加载配置路由 --><RouterView></RouterView> </template><style scoped></style>组件1 <template><div>考试组件</div> </t…

在 Docker 中部署无头 Chrome:在 Browserless 中运行

什么是 Browserless&#xff1f; Browserless 是一款基于云的浏览器解决方案&#xff0c;旨在实现高效的浏览器自动化、网页抓取和测试。 它利用 Nstbrowser 的指纹库&#xff0c;实现随机指纹切换&#xff0c;确保流畅的数据收集和自动化。得益于其强大的云基础设施&#xf…

ROS理论与实践学习笔记——2 ROS通信机制之话题通信

话题通信是ROS中使用频率最高的一种通信模式&#xff0c;话题通信是基于发布订阅模式的&#xff0c;也即:一个节点发布消息&#xff0c;另一个节点订阅该消息&#xff0c;用于不断更新的、少逻辑处理的数据传输场景。 1.1 话题通信理论模 话题通信实现模型是比较复杂的&#x…

qm 命令:管理PVE虚拟机

一、命令简介 ​qm​ 是 Proxmox Virtual Environment (PVE) 中用于管理虚拟机的命令行工具。它允许用户创建、启动、停止、删除虚拟机&#xff0c;以及管理虚拟机的配置和状态。 ‍ 介绍 PVE Proxmox Virtual Environment (PVE) 是一个开源的虚拟化管理平台&#xff0c;专…

Java 注解详解:从基础到自定义及解析

注解&#xff1a;概述 目标 能够理解注解在程序中的作用 路径 什么是注解注解的作用 注解 什么是注解&#xff1f; 注解(Annotation)也称为元数据&#xff0c;是一种代码级别的说明注解是JDK1.5版本引入的一个特性&#xff0c;和类、接口是在同一个层次注解可以声明在包…

Linux系统--五种IO模型

1、简介 Linux IO 模型根据实现的功能可以划分为为阻塞 IO、 非阻塞 IO、 信号驱动 IO&#xff0c; IO 多路复用和异 步 IO。 根据等待 IO 的执行结果进行划分&#xff0c; 前四个 IO 模型又被称为同步 IO&#xff0c;如下图&#xff1a; 2、详细介绍 2.1 阻塞IO 在阻塞IO模…

Docker容器常用命令详解

Docker容器常用命令&#xff0c;我们经常使用&#xff0c;又经常忘记&#xff0c;今天我们系统分析一下&#xff1a; 1、查看运行的进程 #列出所有运行的容器 sudo docker ps#列出所有容器&#xff0c;包括运行和停止的 docker ps -a #列出所有容器&#xff0c;并过滤 docker…