Ceph项目中的cephadm开发指南
概述
cephadm是Ceph集群的官方部署和管理工具,采用Python编写,使用容器化技术部署Ceph服务。本文将为开发者详细介绍cephadm的多种开发环境搭建方式,帮助开发者高效地进行cephadm相关功能的开发和测试。
开发环境搭建方式
1. 使用vstart方式
vstart是Ceph开发者常用的本地测试工具,结合cephadm使用时具有以下特点:
-
启动命令示例:
MON=1 MGR=1 OSD=0 MDS=0 ../src/vstart.sh -d -n -x --cephadm
-
关键特性:
- 使用
~/.ssh/id_dsa
作为集群SSH密钥 - 默认使用
quay.io/ceph-ci/ceph:main
容器镜像 - 通过vstart启动的守护进程不受cephadm管理
- 修改mgr/cephadm代码后,可通过
ceph mgr fail x
命令重新加载
- 使用
-
适用场景:cephadm本身的开发测试
2. 使用cstart和cpatch工具
这套工具提供了更接近生产环境的测试集群:
-
启动集群:
sudo ../src/cstart.sh
-
更新容器镜像:
sudo ../src/script/cpatch -t quay.io/ceph-ci/ceph:8f509f4e
-
优势特点:
- 使用随机但稳定的fsid
- 使用随机mon端口
- 自动构建容器镜像
- 支持部分更新(仅更新Python模块或核心二进制文件)
-
管理命令:
- 重启守护进程:
sudo systemctl restart ceph-
cat fsid.target
- 销毁集群:
sudo ../src/ckill.sh
- 重启守护进程:
3. 使用cephadm bootstrap方式
无需编译Ceph二进制文件即可使用cephadm:
sudo ./cephadm bootstrap --mon-ip 127.0.0.1 \
--ssh-private-key /home/<user>/.ssh/id_rsa \
--skip-mon-network \
--skip-monitoring-stack --single-host-defaults \
--skip-dashboard \
--shared_ceph_folder /home/<user>/path/to/ceph/
- 修改
pybind/mgr/
目录代码后需要重启守护进程生效
高级开发环境
1. Kcli虚拟化环境
Kcli是一个虚拟化管理工具,可快速搭建接近生产环境的Ceph集群:
-
安装方式(推荐容器方式):
podman pull quay.io/karmab/kcli alias kcli='podman run --net host -it --rm --security-opt label=disable -v $HOME/.ssh:/root/.ssh -v $HOME/.kcli:/root/.kcli -v /var/lib/libvirt/images:/var/lib/libvirt/images -v /var/run/libvirt:/var/run/libvirt -v $PWD:/workdir -v /var/tmp:/ignitiondir quay.io/karmab/kcli'
-
创建Ceph开发集群:
kcli create plan -u https://github.com/karmab/kcli-plans/blob/master/ceph/ceph_cluster.yml -P ceph_dev_folder=/home/mycodefolder/ceph
-
Dashboard前端开发:
cd src/pybind/mgr/dashboard/frontend NG_CLI_ANALYTICS=false npm ci npm run build -- --deleteOutputPath=false --watch &
2. Cephadm Box容器环境
基于Podman的轻量级开发环境:
-
设置步骤:
cd src/cephadm/box ./box.py -v cluster setup ./box.py -v cluster start --extended --osds 5 --hosts 5
-
进入环境:
./box.py -v cluster bash
-
注意事项:
- 目前OSD支持仍在开发中
- 需要禁用SELinux以获得最佳体验
- 每个OSD需要5GiB空间
开发注意事项
1. CLI处理线程阻塞问题
执行cephadm CLI命令会阻塞MGR中的mon命令处理线程,导致:
- 无法并发处理CLI调用
- Ctrl+C仅中止客户端,服务端仍继续执行
- 设计时应尽量减少同步远程调用
2. 术语定义
service_type
: 服务类型(如mon、mgr等)service_id
: 服务名称(部分服务无名称)service_name
:<service_type>.<service_id>
daemon_type
: 通常与service_type相同daemon_id
: 通常为<service_id>.<hostname>.<random-string>
daemon_name
:<daemon_type>.<daemon_id>
cephadm编译指南
现代cephadm基于Python Zip Application支持,编译方法:
./src/cephadm/build.py [output]
-
版本元数据设置:
./src/cephadm/build.py -SCEPH_GIT_VER=$(git rev-parse HEAD) -SCEPH_GIT_NICE_VER=$(git describe) /tmp/cephadm
-
依赖管理选项:
-B pip
: 使用pip管理依赖-B rpm
: 使用RPM管理依赖-B none
: 不打包依赖
-
版本信息查询:
./cephadm version --verbose
通过本文介绍的各种开发环境搭建方式和注意事项,开发者可以根据自己的需求选择最适合的开发方式,高效地进行cephadm相关功能的开发和测试。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考