Ceph-mgr: dashboard, zabbix, RESTful, status, balance

ceph-mgr (Manager daemon) — сервис который стал обязательным с версии Luminous. Кроме того, что он обязательный вместе с ним поставляется несколько модулей которые можно включит и использовать если то, что они дают вам нужно.
В этой заметке я пробегусь по списку используемых мной модулей, покажу как их настроить и отмечу некоторые не очевидные моменты из-за которых я решил об этом написать.

Список всех модулей, включенных и выключенных в данный момент:

$ ceph mgr module ls

{
    "enabled_modules": [],
    "disabled_modules": [
        "balancer",
        "dashboard",
        "influx",
        "localpool",
        "prometheus",
        "restful",
        "selftest",
        "status",
        "zabbix"
    ]
}

У меня пока все выключены, у вас, что то может быть уже включенным, это не важно.
В процессе настройки рекомендую смотреть логи одного из mgr дабы понимать, что происходит.

Dashboard module

Включаем dashboard:

$ ceph mgr module enable dashboard

Собственно все, после этого dashboard будет доступен по http://ip-of-active-mgr:7000

Если mgr несколько и постучаться на standby то получим редирект (http 303 See Other) на hostname активного mgr.

Если в логах mgr появляется ошибка типа:

2018-03-04 20:41:20.371993 7f0a3a88f700 -1 Traceback (most recent call last):
  File "/usr/lib64/ceph/mgr/dashboard/module.py", line 1070, in serve
    cherrypy.engine.start()
  File "/usr/lib/python2.7/site-packages/cherrypy/process/wspbus.py", line 250, in start
    raise e_info
ChannelFailures: IOError("Port 7000 not bound on '::'",)

Это потому, что mgr пытается слушать ipv4 и ipv6 сокеты по умолчанию, что в моем случае невозможно т.к. ipv6 выключен.

Что бы mgr слушал только на ipv4 интерфейсах:

$ ceph config-key set mgr/dashboard/server_addr 0.0.0.0

Так же можно задать и порт отличный от дефолтного:

$ ceph config-key set mgr/dashboard/server_port xxx

Про ceph config-key

ceph config-key ls|get|set|dump|del|etc, эта утилита реализует интерфейс для работы с key/value хранилищем расположенным в базе мониторов ceph(мониторы ceph используют leveldb). Все настройки модулей mgr хранятся в этой базе.

Посмотреть все текущие параметры:

$ ceph confg-key dump

{
    "mgr/dashboard/server_addr": "0.0.0.0"
}

RESTful module

Управление Ceph через REST. Это замена штуковины под названием: ceph-rest-api — ceph RESTlike administration server которая теперь считается устаревшей.

У нас например много своей автоматизации вокруг Ceph и с этой версии(Luminous) мы планируем заменить местами вызовы команд на REST, по этому лично для нас этот модуль будет очень полезен.

Включение RESTful:

$ ceph mgr module enable restful

После этого в логах появится:

1 mgr[restful] server not running: no certificate configured

Нужно задать или сгенерить сертификат.

Если сделать так как говорят в инструкции:

$ ceph restful create-self-signed-cert

то будет сгенерен серт, и установлен для текущего экземпляра mgr.
Например на текущем сервере у вас работает mgr.a, убедиться(после выполнения команды выше), что для него задан серт можно так:

$ ceph config-key get mgr/restful/a/crt

Для остальных нужно будет генерить серты отдельно с помощью ceph restful create-self-signed-certна каждом сервере с mgr. В итоге у всех mgr будут разные самоподписанные серты и это не оч. Плюс при вводе новых mgr нужно будет им тоже не забывать генерить серы и это тоже не оч.

В общем, утилита ceph restfulнастраивает mgr только на текущем сервер и это не совсем то чего хотелось бы.

Я рекомендую сделать иначе:

Сгенерить один серт:

openssl req -new -nodes -x509 \
  -subj "/O=IT/CN=ceph-mgr-restful" \
  -days 3650 -keyout restful.key -out restful.crt -extensions v3_ca

И установить его для всех экземпляров mgr в том числе и для новых, что могут появиться в будущем:

$ ceph config-key set mgr/restful/crt -i restful.crt
$ ceph config-key set mgr/restful/key -i restful.key

После этого нужно перезапустить все экземпляры mgr что бы они перечитали параметры и начали использовать серт.

Теперь нам доступен REST(только на активном mgr):

$ curl -k https://ip-of-active-mgr:8003/

{
    "api_version": 1,
    "auth": "Use \"ceph restful create-key <key>\" to create a key pair, pass it as HTTP Basic auth to authenticate",
    "doc": "See /doc endpoint",
    "info": "Ceph Manager RESTful API server"
}

Осталось создать пользователя:

$ ceph restful create-key admin
b7eb4ceb-7726-49ae-81c8-350a0b16f86c
$ ceph restful list-keys
{
  "admin": "b7eb4ceb-7726-49ae-81c8-350a0b16f86c"
}

Теперь можно работать c Ceph через REST:

$ curl --silent --user admin:b7eb4ceb-7726-49ae-81c8-350a0b16f86c -k 'https://172.20.32.115:8003/pool/'

С помощью config-key можно так же задать ip и порт на котором должен быть доступен REST:

Для конкретного mgr:

$ ceph config-key set mgr/restful/{mgr-id}/server_addr {ip}
$ ceph config-key set mgr/restful/{mgr-id}/server_port {port}

Для всех:

$ ceph config-key set mgr/restful/server_port {port}

Zabbix module

Мы используем Zabbix для мониторинга Ceph и раньше мы разбирали JSON что выплевывал ceph -s и тем самым мониторили основные показатели кластера. Теперь в этом практически отпала необходимость т.к. данная функциональность стала доступной из коробки.

Сейчас mgr может сам отправлять основную статистику в zabbix c помощью zabbix_sender.

Настройки Zabbix сервера.

Нужно создать новый host и установить ему Host name, например ceph и установить для этого хоста официальный шаблон — https://github.com/ceph/ceph/blob/master/src/pybind/mgr/zabbix/zabbix_template.xml

Все, в zabbix больше ничего делать не нужно.

Настройка mgr:

Нужно установить на все серверы с ролью mgr пакет zabbix-sender(если это rhel-based).

В /etc/zabbix/zabbix_agentd.conf должен быть задан параметр:

ServerActive={ip-of-zabbix-server}

Активировать модуль:

$ ceph mgr module enable zabbix

Настроить модуль:

$ ceph config-key set mgr/zabbix/identifier ceph (Host name в Zabbix)
$ ceph config-key set mgr/zabbix/zabbix_host {ip-of-zabbix-server}
$ ceph config-key set mgr/zabbix/interval {send-interval} (по умолчанию 60 сек)

После этого нужно перезапустить все экземпляры mgr и на этом все.

В официальной инструкции рекомендуют использовать ceph zabbix config-set identifier|zabbix_host|intervalдля настройки параметров модуля zabbix. Но как и в случае с ceph restful эта утилита настроит параметры только для текущего экземпляра mgr на текущем сервере, остальные экземпляры нужно будет настраивать отдельно, по этому я рекомендую устанавливать параметры для всех mgr сразу путем правки базы напрямую.

status module

Этот модуль, похоже еще в зачаточном состоянии. Сейчас, судя по коду он добавляет(после включения) несколько новых команд:

$ ceph osd status
$ ceph fs status

Вывод этих команд довольно симпатичный, но нужен ли он кому, хз:

balancer module

Этот модуль, будучи активированным занимается фоновым балансированием PG по OSD. Реализовано несколько политик балансирования но я если честно совсем не изучал как это работает, по этому сказать ничего не могу. Как я понимаю это должно помочь добиться более равномерного распределения данных по OSD.