邢舟 /IBM 开源与开放标准工程院软件工程师node
背景回顾:8 月 2 日 20:00,K8sMeetup 中国社区全新改版线上课堂,邀请邢舟老师以直播的方式进行了一场以《Kubernetes 存储概览 & Volume Provisioner》为题的线上讲解,反响热烈。为更好地为学员整合问答,K8sMeetup 中国社区特别整理了本期 Q & A 模块,感谢邢舟老师百忙之中进行校对。nginx
Kubernetes 存储的主要应用场景 git
@青春$:本地挂载卷,好比一个 node上启动俩个 nginx 怎么作?github
A:两个 nginx 实例么?若是是的话,貌似须要配置 scheduler 让其分配到同一个节点上,好比设置 node affinity 等选项。docker
Kubernetes 存储模块 数据库
( ̄^ ̄)ゞ: 建立 pod 的 yaml 文件有没有统一管理的工具?vim
A:若是您是指编辑 yaml 的话,目前我都是 vim 编辑的,其余同事有好的编辑工具欢迎共享出来。若是是指保存的话,能够在数据库或者对象存储里统一保管,Kubernetes 有必定的版本保存功能(如deployment 等的 rolling update),但彻底的版本管理须要本身设置版本管理环境单独保存。api
华: 存储容量的配额管理怎么作?安全
A:目前 Kubernetes 的配额管理统一经过 resourceQuota 对象完成,不过存储容量的配额管理,尤为是本地存储配额的管理,目前 Kubernetes 还未实现。网络
Sa.#:本地只能实现临时存储吗?
A:不是的,在 Kubernetes 1.7 后出现了 LocalStorage 这种类型,能够做为 PV source 出现,相关文档在:
https://kubernetes.io/docs/co...
欢型悠悠too:
A:只要后台存储支持挂载到多个节点,那么在 pod spec 中引用相应的存储对象就能够实现将一个块设备给多个 pod 使用。
Leon Shi: 存储是怎样实现多租户隔离?
A:这个问题社区如今正在讨论,对 LocalStorage 可能有一些 proposal, 不过目前基本没什么实现,你们能够关注一下社区的进展。
逗号:pod scaling 的时候用的是同一个 volume 吗?
A:若是是远程网络 volume 支持 RWX 的,是可使用同一个 volume 的,若是是本地临时存储或者不支持多挂载的,是不支持的。
Michael: 我如今有个需求就是,同类型的共享一个目录?这个有什么好的办法吗?
A:对映射目录的问题,能够查看官方文档,目前仅 project volume 类型支持必定程度的同一目录映射,文档:https://kubernetes.io/docs/co...
JackShan:
A:Kubernetes 的块设备是以插件形式提供的,目前已经提供了几十种主流存储平台的插件。Kubernetes 官方插件列表请参考我上周分享中的PPT,里面有一页专门介绍。
想要看具体的信息,您也能够参考文档:https://kubernetes.io/docs/co...
在 Docker 安全这边主要是权限方面的管理,能够参考如下社区 ticket:
https://github.com/kubernetes...
尼克: 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...
2.FlexVolume(https://kubernetes.io/docs/co...
牛海朋: 应用的配置文件是存在 volume 仍是 configmap 合适,有啥不同吗?
A:通常推荐是使用 configmap, secret 或者 downward API 来完成 app 配置,这个过程能够有 Kubernetes 将配置文件注入到 pod 的文件系统设置是环境变量里面。若是走 volume,应该须要您将配置信息提早准备好放在 PV 上。
阿星:
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/co...
阿星:AccessMode 是否是只用在 PV 和 PVC 的 bind 过程当中,跟底层的存储特性没有关联?
A:是的,目前 Kubernetes 没有在实际 attach 和 mount 过程当中执行 AccessMode检查。
Infei:
A:多 pod 之间的数据一致性主要经过同一磁盘挂载到多个不一样 pod 以及依赖存储平台的解决方案实现,目前这部份内容实现的比较弱,但能够保证 pod 故障时数据不受影响,在 pod 重启后,volume 会从新挂载到 pod。
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:就是同一块块设备是否可以同时挂载到多个节点上,主要是为了应用程序之间共享数据或者协同编辑数据用的。
柯蓬:
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... 有用过的同事能够分享一下,谢谢。
Green: Kubernetes 与 Mesos 究竟是不是一个最佳实践呢?
A:目前 IBM 的实践来看,Mesos on Kubernetes 或者 Kubernetes on mesos 都并非好的选择。 Kubernetes 社区也正在逐渐淡化二者之间的集成关系,主要缘由在于带来的复杂性太高,用户须要同时把握 Kubernetes、Mesos 以及二者之间的集成关系,一旦出现问题,很难诊断和解决。
Zing:如今 Kubernetes 在生产环境的实践状况怎么样?
A:由于我没有参与过 Kubernetes 的实际生产部署,因此目前不了解实际的生产实践。但我能够邀请 IBM 或者其余有生产实践的企业嘉宾给你们作实际部署的分享,在实际部署方面,相信 Kubernetes 的坑仍是比较多的。若是你们感兴趣,请把感兴趣的话题发到群里以便咱们安排下一步的课程。