V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
caicloud2015
V2EX  ›  问与答

Q & A | 怎样让自己更像一个 Kubernetes 存储专家?

  •  
  •   caicloud2015 · 2017-08-13 16:49:40 +08:00 · 2663 次点击
    这是一个创建于 2643 天前的主题,其中的信息可能已经有所发展或是发生改变。

    邢舟 /IBM 开源与开放标准工程院软件工程师

    背景回顾:8 月 2 日 20:00,K8sMeetup 中国社区全新改版线上课堂,邀请邢舟老师以直播的方式进行了一场以《 Kubernetes 存储概览 & Volume Provisioner 》为题的线上讲解,反响热烈。为更好地为学员整合问答,K8sMeetup 中国社区特别整理了本期 Q & A 模块,感谢邢舟老师百忙之中进行校对。

    Kubernetes 存储概览

    Kubernetes 存储的主要应用场景

    1. @青春$:本地挂载卷,比如一个 node 上启动俩个 nginx 怎么做?

    A:两个 nginx 实例么?如果是的话,貌似需要配置 scheduler 让其分配到同一个节点上,比如设置 node affinity 等选项。

    Kubernetes 存储模块

    ( ̄^ ̄)ゞ: 创建 pod 的 yaml 文件有没有统一管理的工具?

    A:如果您是指编辑 yaml 的话,目前我都是 vim 编辑的,其他同事有好的编辑工具欢迎共享出来。如果是指保存的话,可以在数据库或者对象存储里统一保管,Kubernetes 有一定的版本保存功能(如 deployment 等的 rolling update ),但完全的版本管理需要自己设置版本管理环境单独保存。

    华: 存储容量的配额管理怎么做?

    A:目前 Kubernetes 的配额管理统一通过 resourceQuota 对象完成,不过存储容量的配额管理,尤其是本地存储配额的管理,目前 Kubernetes 还未实现。

    Sa.#:本地只能实现临时存储吗?

    A:不是的,在 Kubernetes 1.7 后出现了 LocalStorage 这种类型,可以作为 PV source 出现,相关文档在: https://kubernetes.io/docs/concepts/storage/volumes/#local

    欢型悠悠 too:

    1. 如何实现共享存储?
    2. 如何实现共享存储,将一块盘给多个 pod 用?

    A:只要后台存储支持挂载到多个节点,那么在 pod spec 中引用相应的存储对象就可以实现将一个块设备给多个 pod 使用。

    Leon Shi: 存储是怎样实现多租户隔离?

    A:这个问题社区现在正在讨论,对 LocalStorage 可能有一些 proposal, 不过目前基本没什么实现,大家可以关注一下社区的进展。

    逗号:pod scaling 的时候用的是同一个 volume 吗?

    A:如果是远程网络 volume 支持 RWX 的,是可以使用同一个 volume 的,如果是本地临时存储或者不支持多挂载的,是不支持的。

    Michael: 我现在有个需求就是,同类型的共享一个目录?这个有什么好的办法吗?

    A:对映射目录的问题,可以查看官方文档,目前仅 project volume 类型支持一定程度的同一目录映射,文档: https://kubernetes.io/docs/concepts/storage/volumes/#types-of-volumes

    JackShan:

    1. Kubernetes 下面块设备一般使用哪种?
    2. 保障 docker 的安全都有哪些措施?

    A:Kubernetes 的块设备是以插件形式提供的,目前已经提供了几十种主流存储平台的插件。Kubernetes 官方插件列表请参考我上周分享中的 PPT,里面有一页专门介绍。 想要看具体的信息,您也可以参考文档: https://kubernetes.io/docs/concepts/storage/volumes/#types-of-volumes 在 Docker 安全这边主要是权限方面的管理,可以参考以下社区 ticket: https://github.com/kubernetes/community/pull/180

    尼克: pod 的存储会不会跟随 pod 在 nodes 上的分布一样分布到不同的 node?

    A:是的,需要挂载到 pod 所在的节点(针对远程网络存储,本地存储无所谓)

    Michael: 现在社区有什么好的办法针对存储这块吗?有什么比较成熟的?

    A:您可以看一下社区的存储插件列表,选择一个存储解决方案。但 Kubernetes 目前在存储这一块只实现了最基础的功能。

    马诗洁:我们的 resize 的话,这个会影响到现有的逻辑卷不,是备份原有数据然后重新划分内存,然后数据恢复吗?还是说直接添加内存?

    A:resize 问题请参考上面类似的问题,目前社区只有一个 proposal 计划支持增加磁盘尺寸的。目前选择的做法是直接动态扩大原来快设备的存储,然后再改文件系统。

    ​风云:attach detach manager 和 volume manager 怎么一起工作,都会挂载 volume 吗,还是有分工?讲师好像说过有个参数可以去分工? A:是的,但 volume manager 也可以做 attach/detach 的工作。通过 kubelet 的参数 “--enable-controller-attach-detach=true ” 区分。

    H~Z~G:怎么改变 Kubernetes 默认存储路径? A:存储路径是在 Container Spec 中指定的,然后 Kubernetes 会通过 Volume Manager 和 Volume Plugin 实现 attach 和 mount。

    Yongkui:volume plugin 是各个厂商自己写的?

    A:官方提供了一组插件列表,请参见 PPT 中的总结。也可自己扩展,主要通过两个接口: 1.external-storage-provisioner( https://github.com/kubernetes-incubator/external-storage) 2.FlexVolume( https://kubernetes.io/docs/concepts/storage/volumes/#flexvolume)

    牛海朋: 应用的配置文件是存在 volume 还是 configmap 合适,有啥不一样吗?

    A:一般推荐是使用 configmap, secret 或者 downward API 来完成 app 配置,这个过程可以有 Kubernetes 将配置文件注入到 pod 的文件系统设置是环境变量里面。如果走 volume,应该需要您将配置信息提前准备好放在 PV 上。

    阿星:

    1. 卷的生命周期里面有个 using 状态,可以从 api 里面找到这个状态吗?我看到过 bound 的状态。
    2. 社区会考虑记录 PV 被那些 pod 使用吗?从 pod 里可以看到使用了那些卷,不知道能不能从 PV 看到该 PV 被那些 pod 使用了?

    A:我没看到过 using 这个状态,PV 的状态基本就是 pending, available, bound,released 以及 failed。可以从 node 对象查看每个 node 有哪些 volume attach,从 pod 对象可以查看到需要使用的 pv 信息,反向的应该没有(或者哪位同事熟悉这块代码可以指正一下,谢谢)

    Kubernetes 存储目前存在的一些问题

    官官久久: Accessmodes 的 RWO RWX 模式和 pod 的调度有关吗?

    A:目前没有,但如果要做 RWO 和 RWX 的检查的话,需要从 scheduler 开始做。

    keon: Accessmode 不是有单节点读写,多节点只读,多节点读写吗?

    A:目前的 AccessMode 包括:ReadOnlyMany(ROX), ReadWriteMany(RWX)和 RWO(ReadWriteOnly)。详细的 AccessMode 介绍,推荐您去参照链接中的文档: https://kubernetes.io/docs/concepts/storage/persistent-volumes/

    阿星:AccessMode 是不是只用在 PV 和 PVC 的 bind 过程中,跟底层的存储特性没有关联?

    A:是的,目前 Kubernetes 没有在实际 attach 和 mount 过程中执行 AccessMode 检查。

    Infei:

    1. RC 的 PV 挂载如何实现数据的一致性?
    2. pod 重新挂载 PV,是检查 PV 的状态吗? pod 故障时 PV 的状态会改变吗?

    A:多 pod 之间的数据一致性主要通过同一磁盘挂载到多个不同 pod 以及依赖存储平台的解决方案实现,目前这部分内容实现的比较弱,但可以保证 pod 故障时数据不受影响,在 pod 重启后,volume 会重新挂载到 pod。

    K8s Volume Provisioner 部分代码实现

    PV、PVC & StorageClass

    H~Z~G:PV、PVC 是什么?

    A:PV 和 PVC 是 Kubernetes 中的两种资源,PV(Persistent Volume)代表一块实际的后台块存储设备; PVC ( Persistent Volume Claim )代表的是 Pod 用户对块存储的实际需求,PV 和 PVC 的绑定完成了实际块存储设备和存储需求的绑定。

    董明心: PV 和 PVC 一定是成对出现的么?

    A:不一定,但绑定时是 1-1 绑定的。可以通过 kubectl 命令单独创建 PV 和 PVC。

    小清、刘冲:PVC 和 PV 是一对一还是一对多?

    A:PV 和 PVC 是一对一的关系,但是 PV 和 PVC 都可以通过 Kubectl create 来单独创建,未绑定的 PV 和 PVC 一般处于 available 和 Pending 状态。

    lota: 先创建 PVC?

    A:没有顺序要求,都可以通过 kubectl create 命令分别创建。

    Chao: PVC 找 PV 是随机找的,还是有相应匹配规则?可以让 PVC 绑定到指定 PV 吗?

    A:PVC 可以指定需要绑定的 volume, 通过在 PVC 的 Spec 里面定义实现。但是有一种情况是预定的 PV 可能会被其他 PVC 绑定。匹配规则主要是在 findBestMatch 方法中进行的,主要依据是两方面:AccessMode 和磁盘容量,并满足最小匹配原则。

    it2911: PVC 和 PV 的 resize 问题上,就 StroageClass 的扩容请问是否目前也是无解?

    A:对,这个问题目前确实无解。一般两种方案,一种是创建大的 volume,然后 data migration, 另一种就是现在社区想采用的,直接 resize,然后更新 fs, 但第二种我觉得局限性有点大,很多插件都不支持。

    阿仆来耶:为什么 PV 创建的 yaml 中需要指定 StroageClass ?

    A:我理解是 PVC 需要指定 StroageClass? PVC 并不一定需要指定 StroageClass。StroageClass 我的理解主要为了存储的分类(如根据 io 等指标)以及 dynamic provisioning。PVC 可以直接指定 PV 的名称,也可以通过三种其他方式使用 StroageClass: (1). 不指定,使用默认 StroageClass ; (2).指定空的 StroageClass, 让 Kubernetes 自动匹配合适的 PV ; (3).指定一个 StroageClass, 使用 in-tree 或者 out-of-tree provisioner 创建块设备。

    ☀欧帝☀:请问老师 readwriteonce 和 readwritemany 的区别是什么?什么场景能用 many ?

    A:就是同一块块设备是否能够同时挂载到多个节点上,主要是为了应用程序之间共享数据或者协同编辑数据用的。

    柯蓬:

    1. 请问 ReadWriteMany 什么场景下会用到?需要特定的 PV 来支持吗?
    2. 有没有可以推荐的分布式 volume ?使用起来性能如何?

    A:就是需要多个 pod 同时读写一个磁盘的场合,一般用于应用程序间的数据共享和协同操作。AccessMode 是需要后面存储平台支持的,即只有存储平台中的 volume 支持被挂载到多个节点时才支持,如 IBM SL Block, 目前就只能支持一个设备挂载到一个节点上。

    Out of Tree Provisioner 的基本实现

    张晓宇 @serendipity:Cephfs 更改挂载方式 fuse 可以用 out of tree 方式吗?

    A:Cephfs 应该有个 out-of-tree provisioner, 链接在: https://github.com/kubernetes-incubator/external-storage/tree/master/ceph, 有用过的同事可以分享一下,谢谢。

    其它

    Green:Kubernetes 与 Mesos 到底是不是一个最佳实践呢?

    A:目前 IBM 的实践来看,Mesos on Kubernetes 或者 Kubernetes on mesos 都并不是好的选择。Kubernetes 社区也正在逐渐淡化两者之间的集成关系,主要原因在于带来的复杂性过高,用户需要同时把握 Kubernetes、Mesos 以及两者之间的集成关系,一旦出现问题,很难诊断和解决。

    Zing:现在 Kubernetes 在生产环境的实践情况怎么样?

    A:因为我没有参与过 Kubernetes 的实际生产部署,所以目前不了解实际的生产实践。但我可以邀请 IBM 或者其他有生产实践的企业嘉宾给大家做实际部署的分享,在实际部署方面,相信 Kubernetes 的坑还是比较多的。如果大家感兴趣,请把感兴趣的话题发到群里以便我们安排下一步的课程。

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1144 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 18:47 · PVG 02:47 · LAX 10:47 · JFK 13:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.