Ceph – программное обеспечение для организации высокодоступного распределенного кластера хранения данных на серверном оборудовании общего назначения. В ПК СВ "Брест" Ceph может быть использован для предоставления доступа к создаваемым в нем блочным устройствам RBD.

ТребованияLink to Требования

  • Имеется 2N+1 узлов для развертывания Сeph
  • На узлах установлен пакет python-minimal
  • На серверах развернута ОС в соответствии с Установка ОС


Для более надежной работы кластера рекомендуется в дальнейшем добавление четвертого сервера с сервисом OSD для хранения данных.

При расчете продуктовых кластеров Ceph рекомендуется резервировать по 4 Gb ОЗУ на каждый сервис OSD.

Установка и настройка кластера Ceph с помощью ceph-deployLink to Установка и настройка кластера Ceph с помощью ceph-deploy

Подготовка серверов ceph и серверов ПК СВ "Брест"Link to Подготовка серверов ceph и серверов ПК СВ "Брест"

Синхронизация времениLink to Синхронизация времени

На каждом сервере Ceph необходимо прописать в файл /etc/ntp.conf сервер для синхронизации времени:

server <dc-1-ip>
CODE

Далее перезапустить и сделать автозапуск после перезагрузки службы ntp на каждом сервере Ceph командами:

sudo systemctl  enable ntp

sudo systemctl restart ntp
CODE

Разрешение именLink to Разрешение имен

Для удобной работы с кластером Ceph необходимо чтобы все серверы инфраструктуры могли обращаться к узлам Ceph по доменным именам. В зависимости от типа используемого домена настройте разрешение имен:

Внести записи об узлах Ceph в DNS-сервисе FreeIPA, как указано в этом подразделе: Добавление записей в DNS

Создайте локальный файл со следующим содержимым:

nameserver <dc-1-ip>
CODE

Отредактировать локальные файлы на каждом узле Ceph как описано в разделе Разрешение имен

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

Создание пользователя ceph-admLink to Создание пользователя ceph-adm

На каждом сервере кластера Ceph, Front-end и узлах виртуализации добавить пользователя ceph-adm и разрешить ему Sudo без пароля следующими командами:

sudo adduser ceph-adm

echo "ceph-adm ALL = (root) NOPASSWD:ALL" |sudo tee /etc/sudoers.d/ceph-adm

sudo chmod 0440 /etc/sudoers.d/ceph-adm

sudo pdpl-user -i 63 ceph-adm
CODE

Если узел Ceph настраивается на Front-end, или узле виртуализации, выполнить команду:

sudo pdpl-user -i 127 ceph-adm
CODE

На сервере <ceph-1-hostname> настроить беспарольный доступ по ssh на все серверы Ceph, Front-end и узлы виртуализации (команды выполнять от пользователя <local-admin>):

ssh-keygen

ssh-copy-id ceph-adm@<server-N-ip>
CODE

Вариант использования циклов:

ssh-keygen

for node_id in $(seq 1 <X>); do ssh-copy-id ceph-adm@ceph-$node_id; done

for front_id in $(seq 1 <Y>); do ssh-copy-id ceph-adm@front-$front_id; done

for ceph_id in $(seq 1 <Z>); do ssh-copy-id ceph-adm@node-$ceph_id; done
CODE

для:

<X> узлов Сeph c именами вида ceph-1, ceph-2, и т.д.;

<Y> фронтальных машин с именами вида front-1, front-2, и т.д.;

<Z> узлов виртуализации c именами вида node-1, node-2, и т.д.;

Установка служб кластера Ceph на серверах ceph и серверах ПК СВ "Брест"Link to Установка служб кластера Ceph на серверах ceph и серверах ПК СВ "Брест"

Установить пакет ceph-deploy на сервер <ceph-1-hostname> командой:

sudo apt install ceph-deploy
CODE
Далее все команды с ceph-deploy выполнять строго из консоли сервера <ceph-1-hostname>, находясь в домашнем каталоге администратора.

Необязательно разворачивать монитор (MON) на каждом узле кластера Ceph, но количество мониторов должно быть 2N+1.

Запустить команду для установки Ceph компонент на серверах Ceph:

ceph-deploy --username ceph-adm install --mon --osd <ceph-1-hostname> <ceph-2-hostname> ...... <ceph-N-hostname>
CODE

Запустить команду для установки на сервере ceph1 компоненты ceph-mgr:

ceph-deploy --username ceph-adm install --mgr <ceph-1-hostname>
CODE

Запустить команду для создания нового кластера Ceph, при этом требуется указать в команде сервера кластера, на которых в дальнейшем будут инициализированы мониторы кластера:

ceph-deploy --username ceph-adm new <ceph-1-hostname> <ceph-2-hostname> ...... <ceph-N-hostname>
CODE

После выполнения команды будут созданы конфигурационный файл (по умолчанию ceph.conf) и keyring-файл мониторов

Запустить команду для инициализации мониторов на ранее указанных серверах кластера:

ceph-deploy --username ceph-adm mon create-initial
CODE

Важно знать, что после инициализации мониторов на хостах нельзя менять сетевой адрес, к которому будет привязана служба монитора кластера Ceph. Кластер перестанет быть доступен и работоспособен. Сменить сетевой адрес можно удалив службу монитора и инициализовать ее заново с новыми настройками сети.

Выполнить команду для запуска компоненты mgr на сервере <ceph-1-hostname>:

ceph-deploy --username ceph-adm mgr create <ceph-1-hostname>
CODE

Запустить команду для перезагрузки серверов Ceph:

for ceph_id in $(seq <X> -1 1); do ssh ceph-adm@<ceph-$ceph_id-hostname> sudo reboot; done
CODE

где:

<X> - количество узлов Ceph

Запустить команды для создания служб OSD на блочных устройствах /dev/sdb серверов кластера Ceph

ceph-deploy --username ceph-adm osd create --data /dev/sdb <ceph-1-hostname>

ceph-deploy --username ceph-adm osd create --data /dev/sdb <ceph-2-hostname>

...

ceph-deploy --username ceph-adm osd create --data /dev/sdb <ceph-N-hostname>
CODE

Для каждой службы OSD рекомендуется предоставлять один физический диск для хранения данных.

Запустить команды для установки утилиты управления кластером Ceph:

ceph-deploy --username ceph-adm install --cli <ceph-1-hostname> <ceph-2-hostname> ...... <ceph-N-hostname>

ceph-deploy --username ceph-adm install --cli <front-1-hostname> <front-2-hostname> ...... <front-N-hostname>

ceph-deploy --username ceph-adm install --cli <node-1-hostname> <node-2-hostname> ...... <node-N-hostname>
CODE

Запустить команду для копирования конфигурационного файла и keyring-файла администратора на сервер <ceph-1-hostname>:

ceph-deploy --username ceph-adm admin <ceph-1-hostname>
CODE

Запустить команду для проверки кластера Ceph на сервере <ceph-1-hostname>:

sudo ceph -s
CODE


Вывод команды будет содержать блок информации о кластере, блок информации о запущенных сервисах и блок информации о пулах данных.

Пример вывода команды:

  cluster:
    id:     6d4e04dd-2514-463c-8d91-98b37db7912c
    health: HEALTH_OK
 
  services:
    mon: 3 daemons, quorum ceph1,ceph2,ceph3
    mgr: ceph1(active)
    osd: 3 osds: 3 up, 3 in
 
  data:
    pools:   0 pools, 0 pgs
    objects: 0 objects, 0 bytes
    usage:   3164 MB used, 596 GB / 599 GB avail
    pgs:    
TEXT

Запустить команду для отправки конфигурационных файлов на сервера ПК СВ "Брест" и сервера Ceph:

ceph-deploy --username ceph-adm config push <ceph-1-hostname> <ceph-2-hostname> ...... <ceph-N-hostname>

ceph-deploy --username ceph-adm config push <front-1-hostname> <front-2-hostname> ...... <front-N-hostname>

ceph-deploy --username ceph-adm config push <node-1-hostname> <node-2-hostname> ...... <node-N-hostname>
CODE

ПроверкаLink to Проверка

Следующими командами можно получить информацию по работе служб мониторов на серверах кластера Ceph, команда запускается на сервере <ceph-1-hostname>:

sudo ceph mon stat

sudo ceph mon dump
CODE

Создание пула для организации и хранения данныхLink to Создание пула для организации и хранения данных

По формуле вычислить необходимое количество PGs для кластера Ceph: Total PGs = ((Total number of OSD * 100) / Max Replication Count) с округлением до ближайшей степени 2 в сторону увеличения. В случае для 3 узлов Ceph получится:

(3 OSD * 100) / 3 = 100 и округляем до 128.

На сервере <ceph-1-hostname> используйте следующие команды для создания пула с именем one и включаем возможность подключения к пулу по протоколу rbd:

sudo ceph osd pool create one 128

sudo ceph osd pool application enable one rbd
CODE

Будет создан пул one с уровнем репликации равным 3 (значение по-умолчанию).

Создание пользователя и ключей для доступа к пулу кластера CephLink to Создание пользователя и ключей для доступа к пулу кластера Ceph

Создать пользователя кластера Ceph, который будет иметь доступ к пулу one. Данный пользователь будет также использоваться libvirt для доступа к образам дисков:

sudo ceph auth get-or-create client.libvirt mon 'allow rwx' osd 'allow rwx pool=one'
CODE


Далее необходимо получить копию ключа данного пользователя для его дальнейшей передачи на сервера ПК СВ "Брест":

sudo ceph auth get-key client.libvirt | tee client.libvirt.key

sudo ceph auth get client.libvirt -o ceph.client.libvirt.keyring
CODE

Установка ключей на серверы ПК СВ "Брест" для доступа к данным на кластере CephLink to Установка ключей на серверы ПК СВ "Брест" для доступа к данным на кластере Ceph

Скопировать все файлы ключей на все серверы (Front-end и узлы виртуализации) и перенести в нужные каталоги следующими командами:

scp ceph.client.libvirt.keyring ceph-adm@<server-hostname>:/tmp
scp client.libvirt.key ceph-adm@<server-hostname>:/tmp
ssh ceph-adm@<server-hostname> "sudo mv /tmp/ceph.client.libvirt.keyring /etc/ceph"
ssh ceph-adm@<server-hostname> "sudo mv /tmp/client.libvirt.key /var/lib/one"
ssh ceph-adm@<server-hostname> "sudo ln -s /var/lib/one/client.libvirt.key /root/client.libvirt.key"
CODE


Далее требуется сгенерировать секретный ключ для Ceph пользователя и скопировать его на сервера ПК СВ "Брест" в каталог /var/lib/one

Запомнить универсальный уникальный идентификатор (UUID) для дальнейшего использования, команды выполняются на сервере <ceph-1-hostname>:

sudo apt install uuid-runtime

UUID=`uuidgen`

cat > secret.xml <<EOF
<secret ephemeral='no' private='no'>
	<uuid>$UUID</uuid>
	<usage type='ceph'>
		<name>client.libvirt secret</name>
	</usage>
</secret>
EOF
CODE

Скопировать полученный ключ на каждый сервер облака (Front-end и узлы виртуализации):

scp secret.xml ceph-adm@<server-hostname>:/tmp

ssh ceph-adm@<server-hostname> "sudo mv /tmp/secret.xml /var/lib/one"

ssh ceph-adm@<server-hostname> "sudo ln -s /var/lib/one/secret.xml /root/secret.xml"
CODE

Установить секретный ключ libvirt и удалить файлы ключа на всех серверах облака (переменная $UUID должна быть определена с предыдущих шагов):

ssh ceph-adm@<server-hostname> "sudo virsh -c qemu:///system secret-define /root/secret.xml"
BASE64=$(cat client.libvirt.key)
ssh ceph-adm@<server-hostname> "sudo virsh -c qemu:///system secret-set-value --secret $UUID --base64 $BASE64"
ssh ceph-adm@<server-hostname> "sudo rm /root/client.libvirt.key"
ssh ceph-adm@<server-hostname> "sudo rm /var/lib/one/client.libvirt.key"
CODE

ПроверкаLink to Проверка

Необходимо убедиться, что Ceph клиент имеет корректные настройки на серверах ПК СВ "Брест", выполнив команду для каждого сервера облака (результатом выполнения команды должен быть пустой вывод без ошибок):

ssh ceph-adm@<server-hostname> "sudo rbd ls -p one --id libvirt"
CODE


Установить пакет qemu-block-extra на все серверы облака, выполнив для каждого из них команду:

ssh ceph-adm@<server-hostname> "sudo apt install qemu-block-extra"
CODE

Для установки данного пакета в качестве репозитория необходимо использовать диск для разработчика ОС Astra Linux SE и соответствующее обновление безопасности.

Подключение кластера Ceph в ПК СВ "Брест"Link to Подключение кластера Ceph в ПК СВ "Брест"

Создание хранилища systemLink to Создание хранилища system

Перейдите по адресу http://<front-1-hostname>.<domain>, где front-1-hostname имя вашей фронтальной машины и нажмите кнопку Login

В меню слева развернуть вкладку Storage и выбрать пункт Datastores, далее перейти в настройки и нажать кнопку +


На следующей странице справа выбрать вариант настройки Advanced и внести конфигурацию хранилища:

NAME    = ceph_system
TM_MAD  = ceph
TYPE    = SYSTEM_DS
POOL_NAME = one
CEPH_HOST = "<ceph-1-hostname> <ceph-2-hostname> .... <ceph-N-hostname>"
CEPH_USER = libvirt
BRIDGE_LIST = "<node-1-hostname> <node-2-hostname> .... <node-N-hostname>  <front-1-hostname> <front-2-hostname> ... <front-N-hostname>"
CEPH_SECRET = "d86670c2-a7b3-4285-bbfd-9a8acce8cd24"
CODE

где:

NAME - имя хранилища

POOL_NAME - имя пула в кластере Ceph

CEPH_HOST - имена узлов мониторов

BRIDGE_LIST - имена узлов, которые получат доступ к хранилищу

CEPH_SECRET - UUID из файла secret.xml


Пример заполнения:


Нажать кнопку Create. Результат добавления нового хранилища в ПК СВ "Брест":

Создание хранилища imagesLink to Создание хранилища images

Нажать кнопку + и на следующей странице справа выбрать вариант настройки Advanced и внести конфигурацию хранилища:

NAME = "cephds"
DS_MAD = ceph
TM_MAD = ceph
DISK_TYPE = RBD
POOL_NAME = one
CEPH_HOST = "<ceph-1-hostname> <ceph-2-hostname> .... <ceph-N-hostname>"
CEPH_USER = libvirt
BRIDGE_LIST = "<node-1-hostname> <node-2-hostname> .... <node-N-hostname> <front-1-hostname> <front-2-hostname> ... <front-N-hostname>" 
CEPH_SECRET = "d86670c2-a7b3-4285-bbfd-9a8acce8cd24"
CODE


Пример заполнения:

Далее нажать кнопку Create

ПроверкаLink to Проверка

В результате добавления хранилищ в разделе Storage - Datastores веб-интерфейса должен отображаться объем хранилища Ceph (в примере - 189Гб):

Создание хранилищ из командной строкиLink to Создание хранилищ из командной строки

Кроме создания хранилищ через веб интерфейс вы можете воспользоваться следующими командами из терминала на Front-end, предварительно сформировав файлы описаний system-ds.txt и images-ds.txt:

Создать системное хранилище (CEPH_SECRET значение брать из файла secret.xml):

system-ds.txt

NAME    = ceph_system
TM_MAD  = ceph
TYPE    = SYSTEM_DS
POOL_NAME = one
CEPH_HOST = "<ceph-1-hostname> <ceph-2-hostname> .... <ceph-N-hostname>"
CEPH_USER = libvirt
BRIDGE_LIST = "<node-1-hostname> <node-2-hostname> .... <node-N-hostname> <front-1-hostname> <front-2-hostname> ... <front-N-hostname>"
CEPH_SECRET = "d86670c2-a7b3-4285-bbfd-9a8acce8cd24"
XML
sudo onedatastore create system-ds.txt
CODE

Создать хранилище образов (CEPH_SECRET значение брать из файла secret.xml):

images-ds.txt

NAME = "cephds"
DS_MAD = ceph
TM_MAD = ceph
DISK_TYPE = RBD
POOL_NAME = one
CEPH_HOST = "<ceph-1-hostname> <ceph-2-hostname> .... <ceph-N-hostname>"
CEPH_USER = libvirt
BRIDGE_LIST = "<node-1-hostname> <node-2-hostname> .... <node-N-hostname> <front-1-hostname> <front-2-hostname> ... <front-N-hostname>"
CEPH_SECRET = "d86670c2-a7b3-4285-bbfd-9a8acce8cd24"
XML
sudo onedatastore create images-ds.txt
CODE