Full Stack in The Wild

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

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

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


vse:start

VSE (черновики)

Ceph

Называть кластер: ceph (иначе баги и путаница)

MON

Важные советы:
    Нечетное количество: Всегда держите нечетное число мониторов (3 или 5) для обеспечения кворума и предотвращения ситуации "split-brain".
    Сеть: Убедитесь, что новый хост имеет доступ к public_network кластера.
    Конфиг: После добавления обновите ceph.conf на всех узлах, добавив IP нового монитора в секцию mon_host.

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

apt install ceph-mon
FSID="$(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 = $FSID
mon_initial_members = $HOST
mon_host = $ADDR
cluster_network = $CNET
public_network = $PNET
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
 
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 $HOST $ADDR --fsid $FSID /tmp/monmap
monmaptool --print /tmp/monmap

Создание и запуск первого MON:

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

Настройки:

sed -i "/mon_initial_members/d" /etc/ceph/ceph.conf
ceph mon enable-msgr2

Проверки:

ceph -s
 
ceph mon dump
ceph daemon mon.$(hostname -s) mon_status
ceph daemon mon.$(hostname -s) config show
 
ceph auth list

Добавление

apt install ceph-mon

Скопировать ключ администратора и конфигурационный файл:

# /etc/ceph/ceph.client.admin.keyring
# /etc/ceph/ceph.conf
scp h1:/etc/ceph/ceph.* /etc/ceph/
ceph auth get mon. -o /tmp/ceph.mon.keyring
ceph mon getmap -o /tmp/monmap
HOST=$(hostname -s)
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

Добавить в конфигурацию /etc/ceph/ceph.conf и растиражировать:

mon_host = 10.0.1.11, 10.0.1.12

Удаление

Если хост «живой»:

systemctl --now disable ceph-mon@$(hostname -s)
rm -rfv /var/lib/ceph/mon/ceph-$(hostname -s)

На любом «живом»:

ceph mon remove <id_монитора>

Убрать в /etc/ceph/ceph.conf упоминания об удаленном MON на всех оставшихся

OSD

Добавление

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, данные с него переносятся на другие узлы)

Удаление

FIXME

MGR

Обязательный…, нужно хранилище для своего пула .mgr, …

Добавление

apt install ceph-mgr ceph-mgr-dashboard python3-distutils
Безадмин
--------
ceph auth get client.bootstrap-mgr -o /var/lib/ceph/bootstrap-mgr/ceph.keyring

==>

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

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
 
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 443
 
Browser -> https://host:8443 -> admin/password

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

Подключение FIXME:

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