深入剖析Kubernetes
张磊
Kubernetes社区资深成员与项目维护者
立即订阅
22403 人已学习
课程目录
已完结 56 讲
0/4登录后,你可以任选4讲全文学习。
课前必读 (5讲)
开篇词 | 打通“容器技术”的任督二脉
免费
01 | 预习篇 · 小鲸鱼大事记(一):初出茅庐
02 | 预习篇 · 小鲸鱼大事记(二):崭露头角
03 | 预习篇 · 小鲸鱼大事记(三):群雄并起
04 | 预习篇 · 小鲸鱼大事记(四):尘埃落定
容器技术概念入门篇 (5讲)
05 | 白话容器基础(一):从进程说开去
06 | 白话容器基础(二):隔离与限制
07 | 白话容器基础(三):深入理解容器镜像
08 | 白话容器基础(四):重新认识Docker容器
09 | 从容器到容器云:谈谈Kubernetes的本质
Kubernetes集群搭建与实践 (3讲)
10 | Kubernetes一键部署利器:kubeadm
11 | 从0到1:搭建一个完整的Kubernetes集群
12 | 牛刀小试:我的第一个容器化应用
容器编排与Kubernetes作业管理 (15讲)
13 | 为什么我们需要Pod?
14 | 深入解析Pod对象(一):基本概念
15 | 深入解析Pod对象(二):使用进阶
16 | 编排其实很简单:谈谈“控制器”模型
17 | 经典PaaS的记忆:作业副本与水平扩展
18 | 深入理解StatefulSet(一):拓扑状态
19 | 深入理解StatefulSet(二):存储状态
20 | 深入理解StatefulSet(三):有状态应用实践
21 | 容器化守护进程的意义:DaemonSet
22 | 撬动离线业务:Job与CronJob
23 | 声明式API与Kubernetes编程范式
24 | 深入解析声明式API(一):API对象的奥秘
25 | 深入解析声明式API(二):编写自定义控制器
26 | 基于角色的权限控制:RBAC
27 | 聪明的微创新:Operator工作原理解读
Kubernetes容器持久化存储 (4讲)
28 | PV、PVC、StorageClass,这些到底在说啥?
29 | PV、PVC体系是不是多此一举?从本地持久化卷谈起
30 | 编写自己的存储插件:FlexVolume与CSI
31 | 容器存储实践:CSI插件编写指南
Kubernetes容器网络 (8讲)
32 | 浅谈容器网络
33 | 深入解析容器跨主机网络
34 | Kubernetes网络模型与CNI网络插件
35 | 解读Kubernetes三层网络方案
36 | 为什么说Kubernetes只有soft multi-tenancy?
37 | 找到容器不容易:Service、DNS与服务发现
38 | 从外界连通Service与Service调试“三板斧”
39 | 谈谈Service与Ingress
Kubernetes作业调度与资源管理 (5讲)
40 | Kubernetes的资源模型与资源管理
41 | 十字路口上的Kubernetes默认调度器
42 | Kubernetes默认调度器调度策略解析
43 | Kubernetes默认调度器的优先级与抢占机制
44 | Kubernetes GPU管理与Device Plugin机制
Kubernetes容器运行时 (3讲)
45 | 幕后英雄:SIG-Node与CRI
46 | 解读 CRI 与 容器运行时
47 | 绝不仅仅是安全:Kata Containers 与 gVisor
Kubernetes容器监控与日志 (3讲)
48 | Prometheus、Metrics Server与Kubernetes监控体系
49 | Custom Metrics: 让Auto Scaling不再“食之无味”
50 | 让日志无处可逃:容器日志收集与管理
再谈开源与社区 (1讲)
51 | 谈谈Kubernetes开源社区和未来走向
答疑文章 (1讲)
52 | 答疑:在问题中解决问题,在思考中产生思考
特别放送 (1讲)
特别放送 | 2019 年,容器技术生态会发生些什么?
结束语 (1讲)
结束语 | Kubernetes:赢开发者赢天下
特别放送 | 云原生应用管理系列 (1讲)
基于 Kubernetes 的云原生应用管理,到底应该怎么做?
深入剖析Kubernetes
登录|注册

30 | 编写自己的存储插件:FlexVolume与CSI

张磊 2018-10-31
你好,我是张磊。今天我和你分享的主题是:编写自己的存储插件之 FlexVolume 与 CSI。
在上一篇文章中,我为你详细介绍了 Kubernetes 里的持久化存储体系,讲解了 PV 和 PVC 的具体实现原理,并提到了这样的设计实际上是出于对整个存储体系的可扩展性的考虑。
而在今天这篇文章中,我就和你分享一下如何借助这些机制,来开发自己的存储插件。
在 Kubernetes 中,存储插件的开发有两种方式:FlexVolume 和 CSI。
接下来,我就先为你剖析一下Flexvolume 的原理和使用方法
举个例子,现在我们要编写的是一个使用 NFS 实现的 FlexVolume 插件。
对于一个 FlexVolume 类型的 PV 来说,它的 YAML 文件如下所示:
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-flex-nfs
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany
flexVolume:
driver: "k8s/nfs"
fsType: "nfs"
options:
server: "10.10.0.25" # 改成你自己的NFS服务器地址
share: "export"
可以看到,这个 PV 定义的 Volume 类型是 flexVolume。并且,我们指定了这个 Volume 的 driver 叫作 k8s/nfs。这个名字很重要,我后面马上会为你解释它的含义。
而 Volume 的 options 字段,则是一个自定义字段。也就是说,它的类型,其实是 map[string]string。所以,你可以在这一部分自由地加上你想要定义的参数。
在我们这个例子里,options 字段指定了 NFS 服务器的地址(server: “10.10.0.25”),以及 NFS 共享目录的名字(share: “export”)。当然,你这里定义的所有参数,后面都会被 FlexVolume 拿到。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《深入剖析Kubernetes》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(9)

  • 虎虎❤️
    思考题:

    1. Register过程: csi 插件应该作为 daemonSet 部署到每个节点(node)。然后插件 container 挂载 hostpath 文件夹,把插件可执行文件放在其中,并启动rpc服务(identity, controller, node)。External component Driver Registrar 利用 kubelet plugin watcher 特性watch指定的文件夹路径来自动检测到这个存储插件。然后通过调用identity rpc服务,获得driver的信息,并完成注册。


    2. Provision过程:部署External Provisioner。 Provisioner 将会 watch apiServer 中 PVC 资源的创建,并且PVC 所指定的 storageClass 的 provisioner是我们上面启动的插件。那么,External Provisioner 将会调用 插件的 controller.createVolume() 服务。其主要工作应该是通过阿里云的api 创建网络磁盘,并根据磁盘的信息创建相应的pv。

    3. Attach过程:部署External Attacher。Attacher 将会监听 apiServer 中 VolumeAttachment 对象的变化。一旦出现新的VolumeAttachment,Attacher 会调用插件的 controller.ControllerPublish() 服务。其主要工作是调用阿里云的api,把相应的磁盘 attach 到声明使用此 PVC/PV 的 pod 所调度到的 node 上。挂载的目录:/var/lib/kubelet/pods/<Pod ID>/volumes/aliyun~netdisk/<name>


    4. Mount过程:mount 不可能在远程的container里完成,所以这个工作需要kubelet来做。kubelet 的 VolumeManagerReconciler 控制循环,检测到需要执行 Mount 操作的时候,通过调用 pkg/volume/csi 包,调用 CSI Node 服务,完成 volume 的 Mount 阶段。具体工作是调用 CRI 启动带有 volume 参数的container,把上阶段准备好的磁盘 mount 到 container指定的目录。
    2018-10-31
    26
  • leo
    厉害了 新的知识!
    2018-11-20
    2
  • silver
    'test 正是我们前面定义的 PV 的名字',这个是否是typo?PV的名字是pv-flex-nfs?
    2018-11-01
    2
  • 左氧佛沙星人
    思考题,应该参考local path storage provisioner 或者 local volume storage provisioner,需要新增的是,讲创建好的云盘,attach到主机上,这样对吗?
    2019-10-16
  • kakj
    java程序员从入门到放弃到再入门到再放弃中
    2019-07-10
    1
  • 大星星
    有个问题,请教下,三个external组建为什么要独立出来。这个不需要吧。只要csi 三个服务起来了,自动注册插件。他们三个服务也负责watch api,每当有请求过来,provision attatch.mount动作时候分别找对应服务请求就行。不知道都一个个分出来有必要么?
    2019-03-15
    1
  • 陆培尔
    老师的课讲得太好了,什么时候开始讲容器网络方面的内容?感觉这一块一直有很多地方搞不明白,service,ingress,lb,跨节点组网等等

    作者回复: 很快

    2018-11-02
  • Alery
    你好,自己实现的nfs flexvolume是否可以在pvc中指定呢?怎么指定呢?
    2018-10-31
  • 虎虎❤️
    问题:

    1. 既然csi的PV是自己定义的类型,那么volume controller应该不会做这个红娘吧?所以问题是,他们是怎么完成绑定的?绑定后的状态会改变为 bound 吗?
    2. 按照我的理解 driver 插件应该安装到每个node上,那么适合使用 daemonSet 去部署插件和 Driver Registerar sidecar。而 External Provisioner/Attacher 则只需要一份部署就可以。为什么文中建议把三个 External components 都部署为sidecar?
    2018-10-31
收起评论
9
返回
顶部