Full Stack in The Wild

. . . или проекты старого сисадмина

Инструменты пользователя

Инструменты сайта


astra:ceph-draft

Ceph

Имя кластера: ceph. На каждом узле обеспечено распознавание:

hostname -s
hostname -f
hostname -d
hostname -i
hostname -I

MON

создание кластера

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

Обязательный (но можно пережить потерю)
Нужно хранилище для его собственного пула .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)

dashboard

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

удаление

. . .

OSD

FIXME FIXME FIXME FIXME

Добавление

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

Удаление

Ceph

# 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

ADM

Основной конфигурационный файл:

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 #1

Хранилище ключей (во временном каталоге, можно удалить после создания 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 #1

Получить ключ и создать 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

MGR #1

Нужен 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

Dashboard

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

Добавление/удаление MON/OSD/MGR

# 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
----

Подключение к libvirt

Название 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