Rook Operator 源码分析(1) - osd 启动的流程
阅读本文可能需要有手动部署 Ceph 集群的经验。
Rook 本身很复杂,包含很多 Controller,而 Rook 的复杂不仅体现在这里,并且 Ceph 也非常复杂,在部署和运维上有很多需要注意的地方。本文主要剖析 Rook 启动 osd 的流程,如果有部署过 Ceph 的经验,应该知道加入 osd 大概有两个步骤,1是先 prepare,也就是检查节点上的一些设备是否符合安装 osd,2是激活,也就是 activate。这个过程在 Rook 里也同样需要。
下面是部署完毕后的 Operator 和 osd 相关的 pod 的情况,测试条件下,部署了 3 个 osd,每个节点有 11 块盘。
# kubectl get pod -n rook-ceph
NAME READY STATUS RESTARTS AGE
rook-ceph-operator-7658565d97-ptw5n 1/1 Running 0 20h
rook-ceph-osd-0-78b77dc8d7-xbxhz 1/1 Running 0 20h
rook-ceph-osd-1-b59bcd696-pz9ml 1/1 Running 0 20h
rook-ceph-osd-10-5df9b68f95-lfpnd 1/1 Running 0 20h
rook-ceph-osd-11-5cf6b4bcc5-9cllt 1/1 Running 0 20h
rook-ceph-osd-12-f9f8cb486-4sdts 1/1 Running 0 20h
rook-ceph-osd-13-778bdd8db8-qn6t8 1/1 Running 0 20h
rook-ceph-osd-14-86bc4cd79f-svv92 1/1 Running 0 20h
rook-ceph-osd-15-bd699f59d-txmbx 1/1 Running 0 20h
rook-ceph-osd-16-c68c76f8f-bgl7l 1/1 Running 0 20h
rook-ceph-osd-17-544f7bcf47-xq7dn 1/1 Running 0 20h
rook-ceph-osd-18-6f75c97cdd-lw8xl 1/1 Running 0 20h
rook-ceph-osd-19-99f8f8c6f-7drdz 1/1 Running 0 20h
rook-ceph-osd-2-864c77cc6f-zctcr 1/1 Running 0 20h
rook-ceph-osd-20-7b76984897-g29zj 1/1 Running 0 20h
rook-ceph-osd-21-545fd69888-sbfhl 1/1 Running 0 20h
rook-ceph-osd-22-579897959d-5bff6 1/1 Running 0 20h
rook-ceph-osd-23-57555ffd8d-2jhwt 1/1 Running 0 20h
rook-ceph-osd-24-74457df8fd-vrbnt 1/1 Running 0 20h
rook-ceph-osd-25-799f5bc7d5-sdktc 1/1 Running 0 20h
rook-ceph-osd-26-5c7fb9dc6c-8vrg9 1/1 Running 0 20h
rook-ceph-osd-27-74ff56f958-ndjlx 1/1 Running 0 20h
rook-ceph-osd-28-564dc76999-fzf28 1/1 Running 0 20h
rook-ceph-osd-29-56dd458d4c-76hm6 1/1 Running 0 20h
rook-ceph-osd-3-74d7b78fdf-jxll6 1/1 Running 0 20h
rook-ceph-osd-30-86bf9b4b86-9bxlg 1/1 Running 0 20h
rook-ceph-osd-31-cb6f96589-29pkb 1/1 Running 0 20h
rook-ceph-osd-32-6687876667-6zt6g 1/1 Running 0 20h
rook-ceph-osd-4-c7766fb54-lfcbp 1/1 Running 0 20h
rook-ceph-osd-5-79f8c8f87c-pk85b 1/1 Running 0 20h
rook-ceph-osd-6-88cb5ffd7-h59cl 1/1 Running 0 20h
rook-ceph-osd-7-65697c96-xcgtt 1/1 Running 0 20h
rook-ceph-osd-8-868475d68b-vk5sl 1/1 Running 0 20h
rook-ceph-osd-9-5bf449b4c9-75qwc 1/1 Running 0 20h
rook-ceph-osd-prepare-9.51.1.105-xp2cn 0/1 Completed 0 152m
rook-ceph-osd-prepare-9.51.1.107-4lgqx 0/1 Completed 0 152m
rook-ceph-osd-prepare-9.51.2.164-hqj2f 0/1 Completed 0 152m
rook-discover-7m26q 1/1 Running 0 20h
rook-discover-cxcbw 1/1 Running 0 20h
rook-discover-slncz 1/1 Running 0 20h
Rook 代码结构是比较清晰的,关于 osd 的代码可以从 pkg/operator/ceph/cluster/osd
找到。
现在都用ceph-volume来安装ceph集群了,ceph-deploy已经不维护了。不用ceph-volume就用ceph本来的命令。
由于有一个 osd prepare 的过程,在 Rook 里是通过 init-container 来运行一个脚本来实现的。
关于手动部署,一定要看看 ceph 的官方文档 。
只有当状态为 completed 的时候才会真正的去启动 osd。
osd 的部署就是通过 lsblk
、udevadm
这些命令来做检查的,下面的命令即使 Rook 里用到的命令,在节点上执行一次看看结果,Rook 会根据一些条件来筛选合适的设备来启动 osd。
lsblk --all --noheadings --list --output KNAME
lsblk /dev/sdc --bytes --nodeps --pairs --paths --output SIZE,ROTA,TYPE,PKNAME,NAME,KNAME
udevadm info --query=property /dev/sdc
通过下面的命令,我们在 osd 的节点上运行一下,ceph-volume
是用 python 写的,基本上就是通过一些磁盘、设备等命令来检查节点上的设备。如果 osd prepare 之后没有启动真正的 osd pod 的话,就需要查一下 osd prepare pod 的日志了,或者看一下 local-device 开头的 ConfigMap,里面会有执行 ceph-volume
的结果,下图的结果明显就是设备因为某些原因被拒绝了,具体尅看 rejected_resons
的结果。
ceph-volume inventory --format json
上面的代码走读比较麻烦,跳转来跳转去,下面是我画的一个图,可以参考这个图来理解 Rook 是如何启动 osd 的。
- 看吧,这就是现代化 PHP 该有的样子
- 从web图片裁剪出发:了解H5中的Blob
- Android子线程更新UI主线程方法之Handler
- Drawable.Bitmap.Canvas.Paint.Matrix
- 关于JSON.stringify和Unicode编码,需要注意的几点
- 用 PHP 的方式实现的各类算法合集
- Nginx 反向代理解决前后端联调跨域问题
- JavaScript对象length
- Go1.8.4和Go1.9.1版本发布
- Javascript数组操作
- Tensorflow官方语音识别入门教程 | 附Google新语音指令数据集
- jQuery VS JavaScript原生API
- 居于H5的多文件、大文件、多线程上传解决方案
- 抛弃websocket,前端直接打通信道,webRTC搭建音视频聊天
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 潘石屹用Python解决100个问题 | 素数
- Spring 自动装配模式之构造函数装配方式
- 安全狗 {safedog} 最新版注入bypass
- C语言定时关机小程序
- 深入k8s:Pod对象中重要概念及用法
- Golang语言排序的几种方式
- 性能分析(1)- Java 进程导致 CPU 使用率升高,问题怎么定位?
- 安全服务之安全基线及加固(三)Apache篇
- 使用docsify来管理文献
- Cypress系列(41)- Cypress 的测试报告
- SSRF绕过
- 性能测试必备知识(6)- 如何查看“CPU 上下文切换”
- flex布局 div盒子居中
- 使用Apple Configurator 2提取商店ipa or app文件
- Spring 自动装配模式之byType