Имя кластера: ceph. На каждом узле обеспечено распознавание:
hostname -s hostname -f hostname -d hostname -i hostname -I
apt install ceph-mon
Главный конфигурационный файл (достаточно трех параметров):
cat > /etc/ceph/ceph.conf << EOF [global] fsid = $(cat /proc/sys/kernel/random/uuid) mon_host = $(hostname -i) public_network = $(ip r | grep $(hostname -i) | awk '{print $1}') EOF cat /etc/ceph/ceph.conf
Ключ Администратора кластера:
ceph-authtool --create-keyring /etc/ceph/ceph.client.admin.keyring \ --gen-key --name client.admin \ --cap mon 'allow *' \ --cap osd 'allow *' \ --cap mds 'allow *' \ --cap mgr 'allow *'
Временное хранилище ключей (keyring) для первого MON:
ceph-authtool --create-keyring /tmp/ceph.mon.keyring \ --gen-key --name mon. \ --cap mon 'allow *' ceph-authtool /tmp/ceph.mon.keyring --import-keyring /etc/ceph/ceph.client.admin.keyring
Начальная карта мониторов:
monmaptool --create \ --add $(hostname -s) $(hostname -i) \ --fsid $(grep "^fsid" /etc/ceph/ceph.conf | cut -d "=" -f 2 | xargs) \ /tmp/monmap monmaptool --print /tmp/monmap
Создание и запуск первого MON:
mkdir -pv /var/lib/ceph/mon/ceph-$(hostname -s) ceph-mon --mkfs --id $(hostname -s) --monmap /tmp/monmap --keyring /tmp/ceph.mon.keyring chown -Rv ceph:ceph /var/lib/ceph/mon systemctl enable ceph-mon.target systemctl --now enable ceph-mon@$(hostname -s)
Проверка и настройка некоторых параметров:
ceph -s ceph daemon mon.$(hostname -s) config show | grep auth_allow_insecure_global_id_reclaim ceph config set mon auth_allow_insecure_global_id_reclaim false ceph mon enable-msgr2 ceph -s ceph daemon mon.$(hostname -s) mon_status
На новом узле:
apt install ceph-mon
Скопировать с «боевого» MON конфигурационный файл и (если разрешено) ключ администратора:
scp {MON1}:/etc/ceph/ceph.conf /etc/ceph/ scp {MON1}:/etc/ceph/ceph.client.admin.keyring /etc/ceph/
Где есть ключ администратора получить (и отправить на узел нового MON):
ceph auth get mon. -o /tmp/ceph.mon.keyring ceph mon getmap -o /tmp/monmap
Создание и запуск нового MON:
mkdir -pv /var/lib/ceph/mon/ceph-$(hostname -s) ceph-mon --mkfs --id $(hostname -s) --monmap /tmp/monmap --keyring /tmp/ceph.mon.keyring chown -Rv ceph:ceph /var/lib/ceph/mon systemctl enable ceph-mon.target systemctl --now enable ceph-mon@$(hostname -s)
Добавить в конфигурацию /etc/ceph/ceph.conf и растиражировать:
mon_host = ..., ...
Не забывать про кворум (большинство)
Если хост «живой», то на нем:
systemctl --now disable ceph-mon@$(hostname -s) rm -rfv /var/lib/ceph/mon/ceph-$(hostname -s)
На любом «живом»:
ceph mon remove <id_монитора = имя хоста удаляемого MON>
Убрать в /etc/ceph/ceph.conf упоминания об удаленном MON и растиражировать на все оставшиеся
Остановить мониторы на всех доступных узлах, выбрать из них самый «любимый» и на нем выполнить:
ceph-mon -i $(hostname -s) --extract-monmap /tmp/monmap
Удалить все MON из файла карты, оставив один «любимый»:
monmaptool /tmp/monmap --rm <id_монитора>
Вернуть измененную карту обратно:
ceph-mon -i $(hostname -s) --inject-monmap /tmp/monmap
Запустить теперь единственный MON и пересоздать остальные (не забывая актуализировать /etc/ceph/ceph.conf)
Обязательный (но можно пережить потерю)
Нужно хранилище для его собственного пула .mgr
На новом узле:
apt install ceph-mgr ceph-mgr-dashboard python3-distutils
Если на этом узле не будет ключа администратора, то там где он есть - создать ключ bootstrap-а и разместить его:
ceph auth get client.bootstrap-mgr -o /var/lib/ceph/bootstrap-mgr/ceph.keyring
Создать каталог и keyring:
mkdir -pv /var/lib/ceph/mgr/ceph-$(hostname -s) # Если есть ключ администратора, то ceph auth get-or-create mgr.$(hostname -s) \ mon 'allow profile mgr' \ osd 'allow *' \ mds 'allow *' \ -o /var/lib/ceph/mgr/ceph-$(hostname -s)/keyring # Если нет ключа администратора, а есть bootstrap ключ, то ceph -n client.bootstrap-mgr -k /var/lib/ceph/bootstrap-mgr/ceph.keyring \ auth get-or-create mgr.$(hostname -s) \ mon 'allow profile mgr' \ osd 'allow *' \ mds 'allow *' \ -o /var/lib/ceph/mgr/ceph-$(hostname -s)/keyring chown -Rv ceph:ceph /var/lib/ceph/mgr
Запуск:
systemctl enable ceph-mgr.target systemctl --now enable ceph-mgr@$(hostname -s)
ceph mgr module ls ceph mgr module enable dashboard ceph dashboard create-self-signed-cert echo "password" > /tmp/password.txt ceph dashboard ac-user-create admin -i /tmp/password.txt administrator ss -lntp | grep 8443
. . .
apt install ceph-osd ceph-volume
ceph auth get client.bootstrap-osd -o /var/lib/ceph/bootstrap-osd/ceph.keyring ceph-volume lvm create --data /dev/...
Основные команды для получения информации (часть команд "зависнет" если нет ни одного пула):
ceph osd tree — выводит иерархическую структуру OSD, привязку к хостам, их текущий статус (up/down) и вес в алгоритме CRUSH.
ceph osd status — показывает краткую сводку по всем OSD: состояние, использование объема и основные метрики производительности.
ceph osd dump — отображает детальную техническую информацию, включая эпохи карты OSD, список пулов и флаги управления.
ceph osd df — предоставляет статистику по использованию дискового пространства (общий объем, занято, свободно) и вариацию заполнения между OSD.
Статусы OSD:
Up / Down: запущен ли процесс демона и доступен ли он по сети.
In / Out: включен ли OSD в кластер для хранения данных (если out, данные с него переносятся на другие узлы)
loop ---- pvcreate /dev/loop0 vgcreate ceph-vg-loop /dev/loop0 lvcreate -l 100%FREE -n <logical_volume_name> <volume_group_name> ceph-volume lvm create --data ceph-vg-loop/ceph-lv-loop
Способ 2: Ручной (если первый способ не сработал)
Если автоматика дает сбой, идем по шагам:
Пометьте OSD как out (чтобы начался перенос данных на живые диски):
bash
ceph osd out <ID>
Используйте код с осторожностью.
Остановите службу на узле, где физически находится диск:
bash
systemctl stop ceph-mon@<ID>
Используйте код с осторожностью.
Удалите OSD из CRUSH-карты, чтобы она не занимала место в иерархии:
bash
ceph osd crush remove osd.<ID>
Используйте код с осторожностью.
Удалите ключ аутентификации:
bash
ceph auth del osd.<ID>
Используйте код с осторожностью.
Удалите саму OSD из списка:
bash
ceph osd rm <ID>
Используйте код с осторожностью.
220 ceph config set global osd_pool_default_size 1 221 ceph config set global osd_pool_default_min_size 1
# astra-version -b; ceph -v 1.8.4.48 ceph version 17.2.6 quincy (stable)
Идея заключается в установке работоспособного хранилища на один узел.
Начать можно даже не с боевого хоста, а с временного рабочего места администратора - узла без настоящих дисков хранилища, но с ПО управления (MON+MGR)
Затем, добавляя/удаляя хосты и службы MON/MGR/OSD, можно выйти на необходимую рабочую конфигурацию.
Можно развернуть на отдельной ВМ, создать с его помощью хранилище, а потом - удалить.
Потребуется отдельный диск или раздел для первого OSD, например:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS vda 252:0 0 8G 0 disk ├─vda1 252:1 0 6G 0 part / └─vda2 252:2 0 2G 0 part
На административном (или первом) узле будут три обязательные сущности: MON, OSD и MGR.
Поэтому можно установить метапакет и несколько вспомогательных:
apt install ceph \
ceph-volume ceph-mgr-dashboard python3-distutils
reboot
Основной конфигурационный файл:
CEPH="ceph" UUID="$(cat /proc/sys/kernel/random/uuid)" HOST="$(hostname -s)" ADDR="$(hostname -i)" CNET="$(ip r | grep $ADDR | awk '{print $1}')" PNET="$CNET" cat > /etc/ceph/$CEPH.conf << EOF [global] fsid = $UUID mon initial members = $HOST mon host = $ADDR public network = $PNET cluster network = $CNET auth_allow_insecure_global_id_reclaim = false osd_pool_default_pg_autoscale_mode = on osd_pool_default_size = 1 osd_pool_default_min_size = 1 EOF
Создание администратора кластера/ключа с помощью ceph-authtool (ceph auth использовать не получится, т.к. кластера еще нет):
ceph-authtool --create-keyring /etc/ceph/$CEPH.client.admin.keyring \ --gen-key --name client.admin \ --cap mon 'allow *' \ --cap osd 'allow *' \ --cap mds 'allow *' \ --cap mgr 'allow *'
Хранилище ключей (во временном каталоге, можно удалить после создания MON):
ceph-authtool --create-keyring /tmp/$CEPH.mon.keyring \ --gen-key --name mon. \ --cap mon 'allow *' ceph-authtool /tmp/$CEPH.mon.keyring --import-keyring /etc/ceph/$CEPH.client.admin.keyring
Начальная карта:
monmaptool --create --add $HOST $ADDR --fsid $UUID /tmp/monmap monmaptool --print /tmp/monmap
Запуск:
mkdir -pv /var/lib/ceph/mon/$CEPH-$HOST ceph-mon --mkfs --id $HOST --monmap /tmp/monmap --keyring /tmp/$CEPH.mon.keyring chown -Rv ceph:ceph /var/lib/ceph/mon systemctl enable ceph-mon.target systemctl --now enable ceph-mon@$HOST
Проверки и настройки:
ceph -s
ceph mon enable-msgr2
ceph auth list
Дополнительное право будущему MGR:
ceph auth get client.bootstrap-osd ceph auth caps client.bootstrap-osd mon 'profile bootstrap-osd' mgr 'allow r' ceph auth get client.bootstrap-osd
Получить ключ и создать OSD:
ceph auth get client.bootstrap-osd -o /var/lib/ceph/bootstrap-osd/$CEPH.keyring ceph auth get client.bootstrap-osd -o /var/lib/ceph/bootstrap-osd/ceph.keyring ceph-volume lvm create --data /dev/vda2
Нужен OSD для собственного пула .mgr
mkdir -pv /var/lib/ceph/mgr/$CEPH-$HOST ceph auth get-or-create mgr.$HOST \ mon 'allow profile mgr' \ osd 'allow *' \ mds 'allow *' \ -o /var/lib/ceph/mgr/$CEPH-$HOST/keyring chown -Rv ceph:ceph /var/lib/ceph/mgr
Запуск:
systemctl enable ceph-mgr.target systemctl --now enable ceph-mgr@$HOST
ceph mgr module ls ceph mgr module enable dashboard ceph dashboard create-self-signed-cert echo 'password' > /tmp/password.txt ceph dashboard ac-user-create admin -i /tmp/password.txt administrator ss -lntp | grep 443
Browser -> https://host:8443 -> admin/password
# ceph osd pool ls .mgr # ceph osd pool set .mgr size 3 set pool 1 size to 3
ceph osd tree ceph osd ls ceph osd df ceph osd dump +OSD ---- См. выше -OSD ----
Название RBD-пула:
POOL="libvirt"
Создание:
ceph osd pool create $POOL ceph osd pool set $POOL pg_autoscale_mode on ceph osd pool application enable $POOL rbd rbd pool init $POOL #ceph auth get-or-create client.$POOL mon "allow r" osd "allow rwx pool=$POOL" #ceph auth get-or-create client.$POOL mon "profile rbd" osd "profile rbd pool=$POOL" echo; ceph auth get-key client.$POOL; echo; echo
Последняя строка - это значение SECRET (см. далее)
Подготовка libvirt:
apt install libvirt-daemon-driver-storage-rbd qemu-block-extra
systemctl restart libvirtd
Регистрация «секрета»:
SECRET='(см.выше)' SECRET_UUID="$(cat /proc/sys/kernel/random/uuid)" virsh secret-list cat > /tmp/secret.xml << EOF <secret ephemeral='no' private='no'> <uuid>$SECRET_UUID</uuid> <usage type='ceph'> <name>client.libvirt secret</name> </usage> </secret> EOF virsh secret-define /tmp/secret.xml virsh secret-set-value --secret $SECRET_UUID --base64 "$SECRET" virsh secret-list
Подключение :
MON="<mon-ip>" POOL="libvirt" virsh pool-define-as ceph-pool rbd \ --source-host $MON \ --source-name $POOL \ --auth-type ceph \ --auth-username libvirt \ --secret-uuid $SECRET_UUID virsh pool-start ceph-pool virsh pool-autostart ceph-pool virsh pool-info ceph-pool
Пример:
<pool type="rbd"> <name>ceph-pool</name> <uuid>f33ffc11-5258-42d9-a3b4-29d56deae4d4</uuid> <capacity unit="bytes">16101933056</capacity> <allocation unit="bytes">4096</allocation> <available unit="bytes">16073302016</available> <source> <host name="192.168.0.1" port='6789'/> <host name="192.168.0.2"/> <host name="192.168.0.3"/> <name>libvirt</name> <auth type="ceph" username="libvirt"> <secret uuid="fd293801-a4c6-486a-a741-430a947f2824"/> </auth> </source> </pool>
ceph config set global mon_allow_pool_delete true ceph osd pool ls ceph osd pool delete libvirt libvirt --yes-i-really-really-mean-it ceph osd pool ls
/var/lib/ceph/crash
# systemctl status ceph-crash
○ ceph-crash.service - Ceph crash dump collector
Loaded: loaded (/lib/systemd/system/ceph-crash.service; disabled; preset: enabled)
Active: inactive (dead)
<pool type='rbd'>
<name>my_rbd_pool</name>
<source>
<name>rbd_pool_name_in_ceph</name>
<host name='monitor1.example.org' port='6789'/>
<host name='monitor2.example.org' port='6789'/>
<auth type='ceph' username='libvirt_user'>
<secret usage='libvirt_user_secret'/>
</auth>
</source>
<target>
<path>/dev/rbd/rbd_pool_name_in_ceph</path>
</target>
</pool>
ceph mgr module disable restful