Лабораторная работа 1. Запуск кластера Ceph
Подготовка системы
-
Запустить 3 инстанса с характеристиками:
- Имена инстансов: ceph-01, ceph-02, ceph-03
- Источник: Образ Ubuntu-server-20.04
- Тип инстанса: small
- Сети: ???
-
Создать 3 диска по 2 Гб, подключить каждый к созданным инстансам попарно.
-
На каждом хосте добавить записи в файл /etc/hosts:
192.168.0.21 ceph-01 192.168.0.22 ceph-02 192.168.0.23 ceph-03
-
Создать пару ключей на ceph-01 для соединения между узлами и скопировать публичный ключ ceph-01 на каждый хост кластера:
ssh-keygen ssh-copy-id ceph-01 ssh-copy-id ceph-02 ssh-copy-id ceph-03
Запуск кластера Ceph
Установка Ceph
На данном этапе необходимо установить пакет ceph на каждый узел.
Для этого нужно предварительно добавить ключ безопасности репозитория в список
доверенных и добавить репозиторий для скачивания указанных пакетов.
-
Для этого на каждом узле выполнить следующие команды:
sudo apt update sudo apt install -y ca-certificates wget -q -O- 'https://download.ceph.com/keys/release.asc' | sudo apt-key add - sudo apt-add-repository 'deb https://download.ceph.com/debian-quincy/ focal main' sudo apt update && sudo apt install ceph ceph-mds -y
-
Либо использовать скрипт:
Скрипт для запуска на ceph-01
#!/bin/bash for NODE in ceph-01 ceph-02 ceph-03 do ssh $NODE \ "sudo apt update; \ sudo apt install -y ca-certificates; \ wget -q -O- 'https://download.ceph.com/keys/release.asc' | sudo apt-key add -; \ sudo apt-add-repository 'deb https://download.ceph.com/debian-quincy/ focal main'; \ sudo apt update && sudo apt install ceph ceph-mds -y" done
-
-
Проверить статус установки можно с помьщью команды:
ceph -v
Запуск демонов ceph-mon, ceph-mgr, ceph-osd, ceph-mds
Подготовка к запуску демонов
На узле ceph-01 необходимо выполнить следующие действия:
-
Получить уникальный идентификатор для кластера (можно с помощью команды
uuidgen
):
ad56ab6d-7f7a-4ee4-8b02-9c7ef1ddb438
- используется в качетсве примера -
Создать файл конфигурации для кластера по пути /etc/ceph/ceph.conf. Необходимо вставить свои значения параметров: fsid, адреса ???.
vi /etc/ceph/ceph.conf
:
[global]
fsid = ad56ab6d-7f7a-4ee4-8b02-9c7ef1ddb438
mon initial members = ceph-01, ceph-02, ceph-03
mon host = <ceph-01 ext-ip>, <ceph-02 ext-ip>, <ceph-03 ext-ip>
cluster network = 192.168.0.0/24
public network = 172.17.5.0/24
auth cluster required = cephx
auth service required = cephx
auth client required = cephx
osd journal size = 1024
osd pool default size = 3
osd pool default min size = 2
osd pool default pg num = 64
osd pool default pgp num = 64
osd crush chooseleaf type = 1
-
Создать связку ключей для своего кластера и сгенерировать секретный ключ монитора. Также создать связку ключей администратора,
client.admin
пользователя и добавить пользователя в связку ключей. Создать связку ключей bootstrap-osd,client.bootstrap-osd
пользователя и добавить пользователя в связку ключей:sudo ceph-authtool --create-keyring /tmp/ceph.mon.keyring --gen-key -n mon. --cap mon 'allow *' sudo ceph-authtool --create-keyring /etc/ceph/ceph.client.admin.keyring \ --gen-key -n client.admin --cap mon 'allow *' --cap osd 'allow *' \ --cap mds 'allow *' --cap mgr 'allow *' sudo ceph-authtool --create-keyring /var/lib/ceph/bootstrap-osd/ceph.keyring \ --gen-key -n client.bootstrap-osd --cap mon 'profile bootstrap-osd' \ --cap mgr 'allow r'
-
Добавить сгенерированные ключи в связку
ceph.mon.keyring
:sudo ceph-authtool /tmp/ceph.mon.keyring --import-keyring /etc/ceph/ceph.client.admin.keyring sudo ceph-authtool /tmp/ceph.mon.keyring --import-keyring /var/lib/ceph/bootstrap-osd/ceph.keyring
-
Сгенерировать карту мониторов, используя имена хостов, адреса хостов и FSID. Сохранить как /tmp/monmap:
monmaptool --create --fsid ad56ab6d-7f7a-4ee4-8b02-9c7ef1ddb438 \ --add ceph-01 <ceph-01 ext-ip> --add ceph-02 <ceph-02 ext-ip> \ --add ceph-03 <ceph-03 ext-ip> /tmp/monmap
Запуск ceph-mon
-
Необходимо скопировать файлы
/etc/ceph/ceph.conf
,/etc/ceph/ceph.client.admin.keyring
,/tmp/monmap
,/tmp/ceph.mon.keyring
,/var/lib/ceph/bootstrap-osd/ceph.keyring
с ceph-01 на ceph-02 и ceph-03.-
Примеры выполнения данного пункта:
Пошаговые действия с описанием
-
Создадим папку
/tmp/ceph_files
и скопируем в неё все необходимые файлы:mkdir /tmp/ceph_files sudo cp /etc/ceph/ceph.conf /tmp/ceph_files/ceph.conf sudo cp /etc/ceph/ceph.client.admin.keyring /tmp/ceph_files/ceph.client.admin.keyring sudo cp /tmp/monmap /tmp/ceph_files/monmap sudo cp /tmp/ceph.mon.keyring /tmp/ceph_files/ceph.mon.keyring sudo cp /var/lib/ceph/bootstrap-osd/ceph.keyring /tmp/ceph_files/ceph.keyring
-
Далее добавим общие права на чтение для всех файлов в папке и отправим эти файлы на ceph-02 и ceph-03. Удалим созданную ранее папку:
sudo chmod 644 /tmp/ceph_files/* scp -r /tmp/ceph_files/ ceph-02:~ scp -r /tmp/ceph_files ceph-03:~ sudo rm -rf /tmp/ceph_files
-
На ceph-02 и ceph-03 выполняем следующие команды (возвращаем файлам их исходные права, копируем их по нужным путям и удаляем полученные файлы:
cd ~/ceph_files sudo chmod 600 ceph.client.admin.keyring ceph.mon.keyring ceph.keyring sudo cp ceph.conf /etc/ceph/ceph.conf sudo cp ceph.client.admin.keyring /etc/ceph/ceph.client.admin.keyring sudo cp monmap /tmp/monmap sudo cp ceph.mon.keyring /tmp/ceph.mon.keyring sudo cp ceph.keyring /var/lib/ceph/bootstrap-osd/ceph.keyring cd .. rm -rf ceph_files
Cкрипт для запуска на ceph-01
#!/bin/bash mkdir /tmp/ceph_files sudo cp /etc/ceph/ceph.conf /tmp/ceph_files/ceph.conf sudo cp /etc/ceph/ceph.client.admin.keyring /tmp/ceph_files/ceph.client.admin.keyring sudo cp /tmp/monmap /tmp/ceph_files/monmap sudo cp /tmp/ceph.mon.keyring /tmp/ceph_files/ceph.mon.keyring sudo cp /var/lib/ceph/bootstrap-osd/ceph.keyring /tmp/ceph_files/ceph.keyring sudo chmod 644 /tmp/ceph_files/* scp -r /tmp/ceph_files/ ceph-02:~ scp -r /tmp/ceph_files ceph-03:~ sudo rm -rf /tmp/ceph_files for NODE in ceph-02 ceph-03 do ssh $NODE \ "cd ~/ceph_files; \ sudo chmod 600 ceph.client.admin.keyring ceph.mon.keyring ceph.keyring; \ sudo cp ceph.conf /etc/ceph/ceph.conf; \ sudo cp ceph.client.admin.keyring /etc/ceph/ceph.client.admin.keyring; \ sudo cp monmap /tmp/monmap; \ sudo cp ceph.mon.keyring /tmp/ceph.mon.keyring; \ sudo cp ceph.keyring /var/lib/ceph/bootstrap-osd/ceph.keyring; \ cd ..; \ rm -rf ceph_files" done
-
-
-
Далее создадим каталог для данных мониторов на хостах. Заполним демоны монитора картой мониторов и набором ключей. Это можно сделать с помощью следующих команд на каждом хосте:
sudo chown ceph:ceph /tmp/ceph.mon.keyring sudo -u ceph mkdir /var/lib/ceph/mon/ceph-$HOSTNAME sudo -u ceph ceph-mon --mkfs -i $HOSTNAME \ --monmap /tmp/monmap --keyring /tmp/ceph.mon.keyring sudo systemctl enable ceph-mon@$HOSTNAME --now
-
Либо использовать скрипт:
Скрипт для запуска на ceph-01
#!/bin/bash for NODE in ceph-01 ceph-02 ceph-03 do ssh $NODE \ "sudo chown ceph:ceph /tmp/ceph.mon.keyring; \ sudo -u ceph mkdir /var/lib/ceph/mon/ceph-$NODE; \ sudo -u ceph ceph-mon --mkfs -i $NODE \ --monmap /tmp/monmap --keyring /tmp/ceph.mon.keyring; \ sudo systemctl enable ceph-mon@$NODE --now" done
-
-
Включим протокол
MESSENGER V2
, отключим небезопасное использование клиентами глобальных идентификаторов и установим вывод предупреждений о малом свободном пространстве на основном диске хоста при остакте в 10% (иначе без этих параметров кластер может иметь статус HEALTH_WARN). Также установим параметр, позволяющий удалять пулы, в значениеtrue
:sudo ceph mon enable-msgr2 sudo ceph config set mon auth_allow_insecure_global_id_reclaim false sudo ceph config set mon mon_data_avail_warn 10 sudo ceph config set mon mon_allow_pool_delete true
-
Так как ещё не добавлено никаких устройств хранения, то в выводе состояния нас интересует только образовавшийся кворум мониторов:
sudo ceph -s
Запуск ceph-mgr
На каждом узле, где вы запускаете демон ceph-mon, вы также должны настроить демон ceph-mgr. Сначала
создадим ключ аутентификации для демона, поместим этот ключ в путь
/var/lib/ceph/mgr/ceph-$HOSTNAME/keyring
и запустим демон ceph-mgr.
-
Для этого небоходимо выполнить данные действия на каждом хосте:
sudo ceph auth get-or-create mgr.$HOSTNAME mon 'allow profile mgr' osd 'allow *' mds 'allow *' sudo ceph auth get-or-create mgr.$HOSTNAME > /tmp/mgr.admin.keyring sudo -u ceph mkdir /var/lib/ceph/mgr/ceph-$HOSTNAME sudo cp /tmp/mgr.admin.keyring /var/lib/ceph/mgr/ceph-$HOSTNAME/keyring sudo chown -R ceph. /var/lib/ceph/mgr/ceph-$HOSTNAME sudo systemctl enable --now ceph-mgr@$HOSTNAME
-
Либо использовать скрипт:
Скрипт для запуска на ceph-01
#!/bin/bash for NODE in ceph-01 ceph-02 ceph-03 do MGR_PATH=/var/lib/ceph/mgr/ceph-$NODE; ssh $NODE \ "sudo ceph auth get-or-create mgr.$NODE \ mon 'allow profile mgr' osd 'allow *' mds 'allow *'; \ sudo ceph auth get-or-create mgr.$NODE > /tmp/mgr.admin.keyring; \ sudo -u ceph mkdir $MGR_PATH; \ sudo cp /tmp/mgr.admin.keyring $MGR_PATH/keyring; \ sudo chown -R ceph. $MGR_PATH; \ sudo systemctl enable --now ceph-mgr@$NODE" done
-
-
На данном этапе мы можем увидеть статус запуска демонов менеджеров:
sudo ceph -s
Запуск ceph-osd
Ceph предоставляет ceph-volume
утилиту, которая может подготовить логический том, диск или раздел
для использования с Ceph. Утилита ceph-volume
создает идентификатор OSD путем увеличения
индекса. Кроме того, ceph-volume
добавит новый OSD в карту CRUSH хоста.
-
На каждом хосте выполнить:
sudo ceph-volume lvm create --data /dev/vdb
-
Либо использовать скрипт:
Скрипт для запуска на ceph-01
#!/bin/bash for NODE in ceph-01 ceph-02 ceph-03 do ssh $NODE "sudo ceph-volume lvm create --data /dev/vdb" done
-
-
На данном этапе кластер должен иметь статус HEALTH_OK:
sudo ceph -s
Запуск ceph-mds
Чтобы услуга Ceph FS работала для клиентов, необходимо запустить демон сервера метаданных (MDS). Для этого создадим папку для демона, пользователя Ceph и запустим службу ceph-mds.
- Запустить демоны MDS на хостах ceph-02, ceph-03:
sudo mkdir -p /var/lib/ceph/mds/ceph-$HOSTNAME sudo ceph-authtool --create-keyring /var/lib/ceph/mds/ceph-$HOSTNAME/keyring \ --gen-key -n mds.$HOSTNAME sudo chown -R ceph. /var/lib/ceph/mds/ceph-$HOSTNAME sudo ceph auth add mds.$HOSTNAME osd "allow rwx" mds "allow" mon "allow profile mds" \ -i /var/lib/ceph/mds/ceph-$HOSTNAME/keyring sudo systemctl enable --now ceph-mds@$HOSTNAME
-
Либо использовать скрипт:
Скрипт для запуска на ceph-01
#!/bin/bash for NODE in ceph-02 ceph-03 do MDS_PATH=/var/lib/ceph/mds/ceph-$NODE; ssh $NODE \ "sudo mkdir -p $MDS_PATH; \ sudo ceph-authtool --create-keyring $MDS_PATH/keyring \ --gen-key -n mds.$NODE; \ sudo chown -R ceph. $MDS_PATH; \ sudo ceph auth add mds.$NODE osd 'allow rwx' mds 'allow' mon 'allow profile mds' \ -i $MDS_PATH/keyring; \ sudo systemctl enable --now ceph-mds@$NODE" done
-
Интеграция Ceph и libvirt
Установка libvirt
sudo apt install -y qemu-kvm virtinst libvirt-clients libvirt-daemon-system
Добавление пула Ceph в libvirt
-
Во-первых, нам нужно создать пул Ceph OSD специально для использования хранилища kvm, qemu, libvirt:
sudo ceph osd pool create libvirt-pool 64 64 sudo rbd pool init libvirt-pool
-
Во-вторых, нам нужен пользователь Ceph для манипулирования только что созданным пулом.
sudo ceph auth get-or-create "client.libvirt" mon "profile rbd" osd "profile rbd pool=libvirt-pool"
Выполнить пункты 3-6 на каждом узле
-
Нам нужно добавить файл с секретом libvirt для аутентификации.
uuidgen
->e6ca4cff-bf4f-4444-9089-8bd1304b3500
- для libvirt секрета
sudo vi /tmp/libvirt-secret.xml
:<secret ephemeral='no' private='no'> <uuid>e6ca4cff-bf4f-4444-9089-8bd1304b3500</uuid> <usage type='ceph'> <name>client.libvirt secret</name> </usage> </secret>
-
Встраиваем ключ авторизации пользователя Ceph в файл с секретом с указанным uuid.
sudo virsh secret-define --file "/tmp/libvirt-secret.xml" sudo rm -f "/tmp/libvirt-secret.xml" sudo virsh secret-set-value --secret "e6ca4cff-bf4f-4444-9089-8bd1304b3500" \ --base64 "$(sudo ceph auth get-key client.libvirt)"
-
Нам также необходимо определить пул хранения RBD в libvirt. Сначала нам нужно создать файл определения пула хранения:
vi /tmp/libvirt-rbd-pool.xml
:<pool type="rbd"> <name>libvirt-pool</name> <source> <name>libvirt-pool</name> <host name='ceph-01' port='6789' /> <host name='ceph-02' port='6789' /> <host name='ceph-03' port='6789' /> <auth username='libvirt' type='ceph'> <secret uuid='e6ca4cff-bf4f-4444-9089-8bd1304b3500'/> </auth> </source> </pool>
-
Теперь мы можем определить и запустить пул.
sudo virsh pool-define "/tmp/libvirt-rbd-pool.xml" sudo rm -f "/tmp/libvirt-rbd-pool.xml" sudo virsh pool-autostart "libvirt-pool" sudo virsh pool-start "libvirt-pool"
Запуск ВМ с использованием Ceph FS
Запуск файловой системы
На любом узле кластера необходимо выполнить следующие команды:
-
Чтобы запустить файловую систему ceph, нужно создать два пула: пул для данных и пул для метаданных:
sudo ceph osd pool create cephfs_data 64 sudo ceph osd pool create cephfs_metadata 64
-
Создадим файловую систему:
sudo ceph fs new cephfs cephfs_metadata cephfs_data
С помощью данных команд можно просмотреть статус файловой системы:
sudo ceph fs ls sudo ceph mds stat sudo ceph fs status cephfs
-
Создадим пользователя для подключения к файловой системе и запишем ключ пользователя в отдельный файл:
sudo ceph fs authorize cephfs client.fsclient / rw -o /etc/ceph/ceph.client.fsclient.keyring sudo ceph auth get-or-create-key client.fsclient -o /etc/ceph/fsclient.secret
-
Необходимо скопировать файлы
/etc/ceph/fsclient.secret
и/etc/ceph/ceph.client.fsclient.keyring
на остальные узлы.
Монтирование Ceph FS
-
На каждом узле кластера необходимо выполнить следующие команды:
sudo mkdir /mnt/cephfs sudo mount -t ceph fsclient@.cephfs=/ /mnt/cephfs -o secretfile=/etc/ceph/fsclient.secret
-
Проверить статус монтирования:
df -hT
Запуск ВМ
-
Скачать образ cirros и скопировать его в
/mnt/cephfs/
, где примонтирована Ceph FSwget http://download.cirros-cloud.net/0.5.1/cirros-0.5.1-x86_64-disk.img sudo cp cirros-0.5.1-x86_64-disk.img /mnt/cephfs/cirros.img
-
Создать Ceph RBD как дополнительное хранилище для виртуальной машины:
sudo virsh vol-create-as libvirt-pool cirros-img --capacity 1G --format raw
-
Создать ВМ:
sudo virt-install --name Test-VM --graphics none \ --vcpus 1 --memory 128 --disk "path=/mnt/cephfs/cirros.img" \ --disk "vol=libvirt-pool/cirros-img" --import --autostart
-
Проверить работоспособность запущенной ВМ:
sudo virsh list --all sudo virsh console Test-VM
Настройка динамической миграции
Установка Pacemaker/Corosync
- На всех узлах нужно установить требуемые пакеты и запустить демон
pcsd
:udo apt install pacemaker corosync pcs resource-agents udo systemctl enable --now pcsd ``
Запуск кластера
-
Задать пароль пользователя
hacluster
на всех узлах (в примере используется парольpassword
):sudo passwd hacluster
-
Отредактировать раздел nodelist файла
/etc/corosync/corosync.conf
(на одном из узлов):nodelist { node { name: ceph-01 nodeid: 1 ring0_addr: 172.17.5.237 } node { name: ceph-02 nodeid: 2 ring0_addr: 172.17.5.232 } node { name: ceph-03 nodeid: 3 ring0_addr: 172.17.5.251 } }
-
С помощью pcs создать кластер (на одном из узлов):
sudo pcs host auth ceph-01 addr=172.17.5.237 \ ceph-02 addr=172.17.5.232 ceph-03 addr=172.17.5.251 \ -u hacluster -p password sudo pcs cluster setup newcluster ceph-01 ceph-02 ceph-03 --force sudo pcs cluster start --all
-
Отключить fencing (в рамках работы он не рассматривается):
sudo pcs property set stonith-enabled=false
-
Включить автозапуск сервисов на всех трех машинах:
sudo systemctl enable pacemaker corosync
-
Просмотреть информацию о кластере и кворуме:
sudo pcs status sudo corosync-quorumtool
Создание ресурса
-
Создать дамп созданной ВМ и затем удалить её:
sudo virsh dumpxml Test-VM | tee vm_conf.xml sudo virsh undefine Test-VM sudo virsh destroy Test-VM
-
Скопировать дамп с ceph-01 на ceph-02 и ceph-03:
scp vm_conf.xml ceph-02:~ scp vm_conf.xml ceph-03:~
-
На ceph-01, ceph-02 и ceph-03 переместить файл в /etc/pacemaker/
sudo mv vm_conf.xml /etc/pacemaker/ sudo chown hacluster:haclient /etc/pacemaker/vm_conf.xml
-
Теперь добавить сам ресурс:
sudo pcs resource create test-vm VirtualDomain \ config="/etc/pacemaker/vm_conf.xml" \ migration_transport=tcp meta allow-migrate=true
-
Просмотреть список добавленных ресурсов:
sudo pcs status sudo pcs resource config test-vm
-
Проверить список виртуальных машин на узле, на котором запустился ресурс:
sudo virsh list --all
-
Проверить, что ресурс успешно запустился.
Настройка миграции
Выполнить действия на всех узлах
-
Необходимо отредактировать файл
/etc/libvirt/libvirtd.conf
:listen_tls = 0 listen_tcp = 1 auth_tcp = "none"
-
Отредактировать файл
/etc/default/libvirtd
:libvirtd_opts="--config /etc/libvirt/libvirtd.conf"
-
Запустить сокет
libvirt-tcp
:sudo systemctl stop libvirtd && sudo systemctl start libvirtd-tcp.socket
Миграция ресурса
-
Нужно переместить ресурс на
ceph-02
:sudo pcs resource move test-vm ceph-02
-
На ceph-02 посмотреть статус кластера, и проверить список запущенных гостевых машин можно следующими командами:
sudo pcs status sudo virsh list --all
-
Команда move добавляет ресурсу правило, заставляющее его запускаться только на указанном узле. Для того, чтобы очистить все добавленные ограничения - clear:
sudo pcs resource clear test-vm