本文为个人记录之用,不对大多数用户具有参考价值。

前言

项目以ceph-14.2.5版本代码中的 ceph/src/pybind/mgr/dashboard· ceph/ceph 为基础通过二次开发以实现 Ceph 分布式管理系统。

Dashboard

开发环境搭建

前端

  1. 安装 npm 工具
    # 安装npm
    yum install npm
  2. 安装 node 环境
    # 配置国内源
    npm config set registry https://registry.npm.taobao.org
    # 安装node版本管理工具'node'
    npm install -g n
    # 升级到`8.9`版本的`node`
    n 8.9.0
    查看npmnodejs的版本,如果nodejs低于8.9.0版本,则升级之。
    注意:以Linux为开发环境安装前端依赖进行演示:
    切换到/usr/share/ceph/mgr/dashboard/frontend 目录:
    此处可见官方Ceph Dashboard Developer Documentation — Ceph Documentation文档说明。
  3. 安装依赖
    # 此处可见官方../HACKING.rst 文档说明
    # install dependencies
    npm install
    可以以node-sass安装成功为参考标志,如果报错,请删除 node_modules 目录之后重试。
    #报错清除缓存
    npm cache verify
  4. 安装成功之后,修改代理配置
    # 代理配置
    mv proxy.conf.json.sample proxy.conf.json
    一个可参考的配置内容为:
    {
    "/api/": {
    "target": "http://localhost:8080", # 服务端口和运行地址需要根据情况配置,注意http和https必须分清
    "secure": false,
    "logLevel": "debug"
    },
    "/ui-api/": {
    "target": "http://localhost:8080",
    "secure": false,
    "logLevel": "debug"
    }
    }

    其中端口号可以使用ceph mgr services获取到,即输出中的dashboard字段中所指:
    {
    "dashboard": "http://node-c1:8080/"
    }

  5. 运行前端服务

    npm start

    之后,如果使用默认配置,则访问http://localhost:4200/进行开发,外部网络访问,替换为服务所属机器的 ip 即可。

  6. 版本释出

    npm run-script build

    该命令会在 frontend 目录下释出dist目录。

后端

  1. 安装 pip
  2. 安装 python 依赖
    pip install requirements.txt -r
  3. 配置并启动 ODSP 作为一个服务
    systemctl start odspd

    功能展示

项目目录结构

tree -L 3 -I "node_modules|*.pyc|*.pyo" 
.
├── awsauth.py
├── controllers # 后端Python
│   ├── auth.py
│   ├── cephfs.py
│   ├── cluster_configuration.py
│   ├── docs.py
│   ├── erasure_code_profile.py
│   ├── grafana.py
│   ├── health.py
│   ├── home.py
│   ├── host.py
│   ├── __init__.py
│   ├── iscsi.py
│   ├── logging.py
│   ├── logs.py
│   ├── mgr_modules.py
│   ├── monitor.py
│   ├── nfsganesha.py
│   ├── osd.py
│   ├── perf_counters.py
│   ├── pool.py
│   ├── prometheus.py
│   ├── rbd_mirroring.py
│   ├── rbd.py
│   ├── rgw.py
│   ├── role.py
│   ├── saml2.py
│   ├── settings.py
│   ├── summary.py
│   ├── task.py
│   └── user.py
├── exceptions.py
├── frontend # 前端
│   ├── angular.json
│   ├── dist
│   │   └── en-US
│   ├── e2e
│   │   ├── block
│   │   ├── cluster
│   │   ├── filesystems
│   │   ├── helper.po.ts
│   │   ├── nfs
│   │   ├── pools
│   │   └── tsconfig.e2e.json
│   ├── environment.build.js
│   ├── html-linter.config.json
│   ├── i18n.config.json
│   ├── nodejs-8.9.4-1nodesource.x86_64.rpm
│   ├── package.json
│   ├── package-lock.json
│   ├── protractor.conf.js
│   ├── proxy.conf.json.sample
│   ├── src # 静态src
│   │   ├── app
│   │   ├── assets
│   │   ├── defaults.scss
│   │   ├── environments
│   │   ├── favicon.ico
│   │   ├── index.html
│   │   ├── jestGlobalMocks.ts
│   │   ├── locale
│   │   ├── main.ts
│   │   ├── polyfills.ts
│   │   ├── setupJest.ts
│   │   ├── styles
│   │   ├── styles.scss
│   │   ├── testing
│   │   ├── tsconfig.app.json
│   │   ├── tsconfig.spec.json
│   │   ├── typings.d.ts
│   │   ├── unit-test-configuration.ts.sample
│   │   ├── vendor.overrides.scss
│   │   └── vendor.variables.scss
│   ├── tsconfig.json
│   └── tslint.json
├── grafana.py
├── HACKING.rst
├── __init__.py
├── module.py # 必需
├── plugins
│   ├── feature_toggles.py
│   ├── __init__.py
│   ├── interfaces.py
│   ├── lru_cache.py
│   ├── pluggy.py
│   └── ttl_cache.py
├── README.rst
├── requirements-py27.txt # python依赖
├── requirements-py3.txt
├── requirements.txt
├── rest_client.py
├── run-backend-api-request.sh
├── run-backend-api-tests.sh
├── run-backend-rook-api-request.sh
├── run-frontend-e2e-tests.sh
├── run-frontend-unittests.sh
├── run-tox.sh
├── security.py
├── services
│   ├── access_control.py
│   ├── auth.py
│   ├── cephfs.py
│   ├── ceph_service.py
│   ├── cephx.py
│   ├── exception.py
│   ├── ganesha.py
│   ├── __init__.py
│   ├── iscsi_client.py
│   ├── iscsi_cli.py
│   ├── iscsi_config.py
│   ├── orchestrator.py
│   ├── rbd.py
│   ├── rgw_client.py
│   ├── sso.py
│   └── tcmu_service.py
├── settings.py
├── tests # 单元测试代码
│   ├── helper.py
│   ├── __init__.py
| |—— # 省略
│   └── test_tools.py
├── tools.py
└── tox.ini

问题记录

集群配置

启用mgr restful之后,访问https://node_addr:8003/config/cluster获取集群配置信息,之后可以访问具体名称,获得配置详情;

如何添加controller

参见HACKING.rst

继承BaseController之后使用 @Controller,@ApiController 或者@UiApiController ,三者的区别是:
@ApiController@UiApiController@Controller的特殊化。

@ApiController 应该用在提供类 API 接口,而@UiApiController应该被用于非公用的 API,其他接口使用@Controller

一般来说,我们只需要实现@Controller@ApiController 即可。

@Endpoint 用于暴露接口的方法实现,它可以接收很多参数,比如请求方法,查询参数等;
:对于集群管理时,我们把 node 信息直接传输到 url 中,或许是一个好办法,参考:@Endpoint(path="/{date}/latency")处代码。

而继承RESTController默认返回json格式数据。它是一个简化并使用collection整合数据的抽象层,将方法名、请求类型和状态码进行映射。具体映射关系见文档表格。

调试

模块编写完成,重启服务,看是否会有模块未找到,服务导入等报错

ceph mgr module disable dashboard
ceph mgr module enable dashboard
ceph dashboard create-self-signed-cert

也可以查看日志,查找可能的报错信息。

查看日志

通过该文件可以查看mgr中的报错信息,暂时未找到 logger.info()写入 log 中的信息(是否需要配置?)

tailf /var/log/ceph/ceph-mgr.node1.log

from ..module import cherrypy
cherrypy.log('---------', json.dumps(update_info)) # 必须是str

MDS 状态

元数据服务器
CEPH-MDS – CEPH 元数据服务器守护进程

需要安装的工具、依赖

  • 获取磁盘SN号码
    yum install hdparm

    时间配置

    集群部署的时候脚本中应该有配置 NTP 的操作,步骤参见:NTP
    不再支持手动输入时间配置
  1. 直接设置集群内部机器为 ntp 服务器,其他指向该机器;
  2. 给定 ip 或域名地址,如果是集群网段的,则直接返回提示不支持,否则,所有指向该地址。

    注意
    根据下面这篇文章的观点,在集群起来之后再去调节 ntp 服务被认为是会严重影响集群业务的操作,如果一定要调整,也可能会耗时很久!
    深度解析 CephX 原理—调节 NTP 时钟的困境 | 开心鬼

监视器配置参考

mon 状态

发布历史

vN1.0.1(2020-07-03)

集群主机

mon/mgr

节点发现:

  1. 单节点添加
  2. 多节点添加
  3. 局域网段添加
    节点删除
远程管理
  1. 节点远程开机、关机、重启;
  2. 修改远程操作用户用户名、密码;
  3. 网络配置(ip、掩码、网关。
磁盘展示及定位

磁盘盘位查看、(批量)定位及取消定位;

系统工具
  1. 设置 ntp 服务器
  2. 设置 DNS
License

license 添加、删除、更新

OSD

osd 新建:osd 添加(类型配置)、添加-WAL devices DB devices,加密
OSD 编辑:洗刷、深度洗刷、设置权重、标记、销毁、清除

日志

集群日志管理、审计日志、日志打包下载

存储池

存储池新建、编辑、删除

块设备
  • 映像
    新建、编辑、复制、删除,移除回收站、容量调节
  • 镜像
  • ISCSI-target
  • ISCSI-网关
对象网关

守护进程创建、更新、删除

更多

同事写的备忘录:有道云笔记