摘要:本文分析了hostPath volume缺陷,然后对local persistent volume的使用场景、基本的工作机制进行了分析,介绍了使用时的注意事项,并简单介绍local volume manager如何帮助administrator进行local persistent volume的生命周期管理的。

hostPath volume存在的问题

过去我们经常会通过hostPath volume让Pod能够使用本地存储,将Node文件系统中的文件或者目录挂载到容器内,但是hostPath volume的使用是很难受的,并不适合在生产环境中使用。

我们先看看hostPath Type有哪些类型:

Value Behavior
Empty string (default) is for backward compatibility, which means that no checks will be performed before mounting the hostPath volume.
DirectoryOrCreate If nothing exists at the given path, an empty directory will be created there as needed with permission set to 0755, having the same group and ownership with Kubelet.
Directory A directory must exist at the given path
FileOrCreate If nothing exists at the given path, an empty file will be created there as needed with permission set to 0644, having the same group and ownership with Kubelet.
File A file must exist at the given path
Socket A UNIX socket must exist at the given path
CharDevice A character device must exist at the given path
BlockDevice A block device must exist at the given path

看起来支持这么多type还是挺好的,但为什么说不适合在生产环境中使用呢?

  • 由于集群内每个节点的差异化,要使用hostPath Volume,我们需要通过NodeSelector等方式进行精确调度,这种事情多了,你就会不耐烦了。

  • 注意DirectoryOrCreateFileOrCreate两种类型的hostPath,当Node上没有对应的File/Directory时,你需要保证kubelet有在Node上Create File/Directory的权限。

  • 另外,如果Node上的文件或目录是由root创建的,挂载到容器内之后,你通常还要保证容器内进程有权限对该文件或者目录进行写入,比如你需要以root用户启动进程并运行于privileged容器,或者你需要事先修改好Node上的文件权限配置。

  • Scheduler并不会考虑hostPath volume的大小,hostPath也不能申明需要的storage size,这样调度时存储的考虑,就需要人为检查并保证。

  • StatefulSet无法使用hostPath volume,已经写好的使用共享存储的Helm Chart不能兼容hostPath volume,需要修改的地方还不少,这也挺难受的。

local persistent volume工作机制

FEATURE STATE: Kubernetes v1.11 Beta

Local persistent volume就是用来解决hostPath volume面临的**portability, disk accounting, and scheduling**的缺陷。PV Controller和Scheduler会对local PV做特殊的逻辑处理,以实现Pod使用本地存储时发生Pod re-schedule的情况下能再次调度到local volume所在的Node。

local pv在生产中使用,也是需要谨慎的,毕竟它本质上还是使用的是节点上的本地存储,如果没有相应的存储副本机制,那意味着一旦节点或者磁盘异常,使用该volume的Pod也会异常,甚至出现数据丢失,除非你明确知道这个风险不会对你的应用造成很大影响或者允许数据丢失。

那么通常什么情况会使用Local PV呢?

  • 比如节点上的目录数据是从远程的网络存储上挂载或者预先读取到本地的,为了能加速Pod读取这些数据的速度,相当于起Cache作用,这种情况下因为只读,不存在惧怕数据丢失。这种AI训练中存在需要重复利用并且训练数据巨大的时候可能会采取的方式。
  • 如果本地节点上目录/磁盘实际是具有副本/分片机制的分布式存储(比如gluster, ceph等)挂载过来的,这种情况也可以使用local pv。

Local volume允许挂载本地的disk, partition, directory到容器内某个挂载点。在Kuberentes 1.11仍然仅支持local pv的static provision,不支持dynamic provision。

  • Kubernetes使用PersistentVolume的.spec.nodeAffinityfield来描述local volume与Node的绑定关系。

  • 使用volumeBindingMode: WaitForFirstConsumer的local-storage StorageClass来实现PVC的延迟绑定,使得PV Controller并不会立刻为PVC做Bound,而是等待某个需要使用该local pv的Pod完成调度后,才去做Bound。

下面是定义local pv的Sample:

apiVersion: v1
kind: PersistentVolume
metadata:name: example-pv
spec:capacity:storage: 100Gi# volumeMode field requires BlockVolume Alpha feature gate to be enabled.volumeMode: FilesystemaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RetainstorageClassName: local-storagelocal:path: /mnt/disks/ssd1nodeAffinity:required:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- example-node

对应的local-storage storageClass定义如下:

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer

使用local persistent volume注意事项

  • 使用local pv时必须定义nodeAffinity,Kubernetes Scheduler需要使用PV的nodeAffinity描述信息来保证Pod能够调度到有对应local volume的Node上。

  • volumeMode可以是FileSystem(Default)和Block,并且需要enable BlockVolume Alpha feature gate。

  • 创建local PV之前,你需要先保证有对应的storageClass已经创建。并且该storageClass的volumeBindingMode必须是WaitForFirstConsumer以标识延迟Volume Binding。WaitForFirstConsumer可以保证正常的Pod调度要求(resource requirements, node selectors, Pod affinity, and Pod anti-affinity等),又能保证Pod需要的Local PV的nodeAffinity得到满足,实际上,一共有以下两种volumeBindingMode:

     // VolumeBindingImmediate indicates that PersistentVolumeClaims should be// immediately provisioned and bound.VolumeBindingImmediate VolumeBindingMode = "Immediate"
    
    <span class="hljs-comment">// VolumeBindingWaitForFirstConsumer indicates that PersistentVolumeClaims</span>
    <span class="hljs-comment">// should not be provisioned and bound until the first Pod is created that</span>
    <span class="hljs-comment">// references the PeristentVolumeClaim.  The volume provisioning and</span>
    <span class="hljs-comment">// binding will occur during Pod scheduing.</span>
    VolumeBindingWaitForFirstConsumer VolumeBindingMode = <span class="hljs-string">"WaitForFirstConsumer"</span>
    
  • 节点上local volume的初始化需要我们人为去完成(比如local disk需要pre-partitioned, formatted, and mounted. 共享存储对应的Directories也需要pre-created),并且人工创建这个local PV,当Pod结束,我们还需要手动的清理local volume,然后手动删除该local PV对象。因此,persistentVolumeReclaimPolicy只能是Retain。

  • local volume manager

    上面这么多事情需要人为的去做预处理的工作,我们必须要有解决方案帮我们自动完成local volume的create和cleanup的工作。官方给出了一个简单的local volume manager,注意它仍然只是一个static provisioner,目前主要帮我们做两件事:

    • local volume manager 监控配置好的discovery directory的新的挂载点,并为每个挂载点根据对应的storageClassName, path, nodeAffinity, and capacity创建PersistentVolume object。

    • 当Pod结束并删除了使用local volume的PVC,local volume manager将自动清理该local mount上的所有文件, 然后删除对应的PersistentVolume object.

    因此,除了需要人为的完成local volume的mount操作,local PV的生命周期管理就全部交给local volume manager了。下面我们专门介绍下这个Static Local Volume Provisioner。

    后面我会单独写一个博文对local volume manager进行深度剖析。

    总结

    本文对hostPath volume不能在生产环境中很好使用的原因进行了阐述,然后对local persistent volume的使用场景、基本的工作机制进行了分析,介绍了使用时的注意事项,最后简单介绍了local volume manager如何帮助administrator进行local persistent volume的生命周期管理的。接下来,我会再写两篇博客,分别对scheduler和pv controller如何对local persistent volume的处理逻辑进行源码分析,对local volume manager进行深度剖析。

    原文:https://my.oschina.net/jxcdwangtao/blog/1934004?from=timeline&isappinstalled=0

k8s之local persistent volume相关推荐

  1. @kubernetes(k8s)数据持久化Volume存储卷(emptyDir、hostPath、NFS、StorageClass)

    文章目录 kubernetes(k8s)数据持久化Volume 一.数据持久化 1.Vlolume概述 2.数据卷的分类 3.常用的四种数据卷 4.Pod使用Volume步骤: 5. volume基本 ...

  2. 持久卷(Persistent Volume)详解

    一.概述    在Kubenetes中,对存储资源的管理方式和计算资源(CPU/内存),截然不同.为了能够屏蔽底层存储实现的细节,让用户方便使用及管理员方便管理,Kubernetes从1.0版本就已经 ...

  3. Docker中的Docker volumes与Persistent Volume借鉴

    文章目录 <Docker中的Docker volumes与Persistent Volume借鉴> 引言 技术原理及概念 2.1. 基本概念解释 2.2. 技术原理介绍:算法原理,操作步骤 ...

  4. Kubernetes(K8s)基本概念:Volume(存储卷)、Persistent Volume

    Kubernetes(K8s)基本概念:Volume(存储卷) 一.Volume(存储卷) Volume是Pod中能够被多个容器访问的共享目录. K8s中的Volume定义在Pod上,然后被一个Pod ...

  5. 轻量级 Kubernetes 集群发行版 K3s 完全进阶指南

    公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! 深入理解官方文档,轻松学会使用 K3S 工具! K3s 是一个轻量级的 Kubernetes 发行版,它针对边缘计 ...

  6. emptyDir、hostPath以及local volume的不同

    转载自:https://blog.csdn.net/watermelonbig/article/details/84108424 Kubernetes支持几十种类型的后端存储卷,其中有几种存储卷总是给 ...

  7. OpenShift 4 - 使用 emptyDir/hostPath/local 类型 PV

    <OpenShift 4.x HOL教程汇总> 说明:本文已经在OpenShift 4.9环境中验证 文章目录 emptyDir 类型 pv hostPath 类型 pv local 类型 ...

  8. kubernetes存储:local,openEBS,rook ceph

    文章目录 Local 存储(PV) 概念 hostPath Local PV storageClassName指定延迟绑定动作 pv的删除流程 OpenEBS存储 控制平面 OpenEBS PV Pr ...

  9. k8s v1.17 新特性预告: 拓扑感知服务路由

    大家好,我是 roc,来自腾讯云容器服务(TKE)团队,今天给大家介绍下我参与开发的一个 k8s v1.17 新特性: 拓扑感知服务路由. 01 名词解释 拓扑域: 表示在集群中的某一类 " ...

最新文章

  1. 【MediaPipe】(4) AI视觉,远程手势调节电脑音量,附python完整代码
  2. 如何使用消息队列解决分布式事物?
  3. Bootstrap按钮
  4. [JOISC2014]ストラップ
  5. Mybatis DAO开发--Mapper动态代理开发方式
  6. Linux Shell编程之一循环结构
  7. 商业逻辑12讲之战略管理的逻辑
  8. php中ci的session自动加载报错
  9. 04-图像的阈值操作
  10. 将excel转为python的字典_python读取excel数据转换成字典
  11. kudu :impala 和 kuduClient 的选择
  12. tf卡量产工具万能版_手上还有SD卡/TF卡的小伙伴,这些玩法你有关注过吗
  13. 2020全球智博会于苏州盛大开幕
  14. 人才为王,语音识别技术并非高不可攀
  15. linux挂载第二块磁盘,linux服务器挂载第二块磁盘图文解说-转自美橙
  16. 国庆在家太无聊, 用Java爬了上千张小姐姐照片...
  17. ZK(7.0.1)将zul页面引入作为组件标签的简单示例
  18. D3D处理2D图像: NV12格式及其转换(1)
  19. 我的第一个项目(员工绩效管理系统 步骤超级详细---未完待更...)
  20. 怎么恢复oracle的包,Oracle的恢复管理器及DBMS_JOB包分析

热门文章

  1. 中国智能网联汽车技术规程-基础行车辅助测评细则
  2. 关于java网上投简历找工作后的面试几率?(如何投简历)
  3. 《数据分析实战》总结二之分类算法:决策树,朴素贝叶斯,SVM,KNN,Adaboost
  4. 【数据结构与算法】三、从堆到堆排序,又是一个logN
  5. EXCEL2010解决无法打开多个窗口的问题
  6. 《啊哈算法》第四章之深度优先搜索
  7. GPE监控多台MySQL_GPE监控预警系统(Grafana+Prometheus+Exporter)搭建
  8. 梳理注册表的一些危险操作,注册表的安全配置,以及对于注册表的总结
  9. Django学习笔记2-使用QuerySet删除和查询单表
  10. zypper命令使用及zypper源配置