Настройка кластера Ceph на Ubuntu
Опубликовано:
Используемые термины: Ceph, Ubuntu, Docker.
В данной инструкции рассмотрим основные команды для настройки и запуска кластера Ceph. Также приведем примеры полезных настроек. В итоге мы получим:
- Кластерное хранилище из трех серверов.
- Веб-интерфейс для просмотра состояния и изменения некоторых настроек.
- Доступ к хранилищу по S3. Проксирование через nginx.
Мы будем работать на системе Ubuntu 24.04. Во много, данные команды подойдут для Debian.
Требования к ноде для использования в кластере
Подготовка системы
Развертывание docker на нодах
Сборка кластера
Настройка метода Erasure Coding
Веб интерфейс
Использование CephFS
Настройка S3
Добавление еще одного сервера к кластеру
Дополнительные материалы
Требования к инфраструктуре
Прежде чем начать, необходимо проговорить, что потребуется на нодах для создания кластера Ceph.
1. Диски
Проверить, что нужные нам диски на месте, можно командой:
lsblk
Для создания объектных хранилищ Ceph потребуется выделить диск целиком, на котором нет других разделов или файловых систем.
2. Docker
На момент обновления данной инструкции, актуальным методом развертывания был запуск сервисов в контейнерах docker с помощью cephadm. Таким образом, в процессе работы мы будем устанавливать и настраивать Docker.
3. Роли серверов в кластере
В боевой среде стоит тщательно спланировать распределение ролей между серверами таким образом, чтобы узлы управления, мониторинга и хранения были на разных нодах. Для обеспечения кворума рекомендуется использовать от 3 серверов.
В нашем примере будет использоваться всего 3 сервера, на которых будут устанавливаться все роли.
Предварительная настройка
Подготовим наши узлы будущего кластера к работе.
1. Установка lvm2
Для подготовки дисковой структуры ceph использует lvm2. Обновляем кэш репозитория и ставим пакет:
apt update
apt install lvm2
2. Чистим диск
Для Ceph необходимо подготовить диск, очистив его от всех доступных сигнатур файловых систем, RAID или таблиц разделов.
Для начала посмотрим на список дисков, доступных серверу:
lsblk
Выбираем диски и для каждого, который хотим задействовать для кластера, выполняем команду:
wipefs -a /dev/sdX
* меняем X на букву вашего диска.
Очень важно не перепутать букву, так как команда может привести к потере разметки диска.
Данная команда подготавливает диск к новому форматированию или разметке, удаляя следы предыдущих файловых систем или таблиц разделов, делая их невидимыми для системы.
Установка и настройка Docker
На момент обновления инструкции приложение, управляющее кластером Ceph запускается в docker. Значит необходимо его установить и настроить.
Выполняем команду для установки Docker Engine:
apt install docker.io
Создадим каталог для хранения конфигурации:
mkdir -p /etc/docker
Создадим конфигурационный файл:
vi /etc/docker/daemon.json
{
"storage-driver": "overlay2",
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
},
"default-ulimits": {
"nofile": {
"Name": "nofile",
"Hard": 262144,
"Soft": 262144
}
},
"default-address-pools": [
{
"base": "172.17.0.0/16",
"size": 24
}
]
}
* в данном примере мы задаем лимиты nofile и указываем подсети, которые будут получать контейнеры docker. В данном примере будут раздаваться адреса из диапазона 172.17.0.0/16, а сами сети для контейнеров будет выдаваться с маской 24 (по умолчанию 16, что слишком много).
Для применения настроек перезапускаем службу:
systemctl restart docker
Сборка кластера
В моем примере в кластере будут участвовать три сервера:
- ceph01 (192.168.1.201) — mon + osd.
- ceph02 (192.168.1.202) — mon + osd.
- ceph03 (192.168.1.203) — mon + osd.
Роль монитора и датастора объединены на одном сервере. В больших продуктивных средах все роли лучше разделять, выделяя под них отдельные серверы.
Инициализация компонента монитора
Данная роль служит «коллективным мозгом» и единственным источником информации о состоянии всего кластера. Без данного компонента ceph работать не будет.
На одной из нод, допустим 192.168.1.201, выполняем команду:
apt install cephadm
* данный компонент является полнофункциональным оркестратором для управления жизненным циклом кластера Ceph.
** его можно установить на любой узел сети. Не обязательно, ноду кластера.
Выполняем начальную настройку кластера:
cephadm bootstrap --mon-ip 192.168.1.201
* данная команда создаст кластер из одного узла, указанного в опции mon-ip.
В итоге, мы должны увидеть что-то на подобие:
...
Ceph Dashboard is now available at:
URL: https://ceph01:8443/
User: admin
Password: 99b5bho4uw
Enabling client.admin keyring and conf on hosts with "admin" label
Enabling autotune for osd_memory_target
You can access the Ceph CLI as following in case of multi-cluster or non-default config:
sudo /usr/sbin/cephadm shell --fsid 3668ff92-cb6b-11f0-a214-00155d016513 -c /etc/ceph/ceph.conf -k /etc/ceph/ceph.client.admin.keyring
...
* нам нужно зафиксировать логин и пароль для подключения к веб-интерфейсу, а также команду подключения к узлу управления.
Для нашего удобства создадим алиас:
echo 'alias cs="/usr/sbin/cephadm shell --fsid 3668ff92-cb6b-11f0-a214-00155d016513 -c /etc/ceph/ceph.conf -k /etc/ceph/ceph.client.admin.keyring"' >> ~/.bashrc
source ~/.bashrc
* мы создадим алиас cs, который использует длинную команду подключения к контейнеру управления кластером. Многие команды для изменения конфигурации ceph мы будем выполнять с ее помощью.
Вводим созданный алиас:
cs
Командная оболочка должна поменять. Попробуем ввести команду:
ceph -s
Данная команда вернет сводку о состоянии кластера. Мы должны увидеть один добавленных хост.
Теперь посмотрим список хостов, зарегистрированных как участники кластера:
ceph orch host ls
Мы должны получить что-то на подобие:
HOST ADDR LABELS STATUS
ceph01 192.168.1.201 _admin
1 hosts in cluster
* в данном примере мы видим, что у нас в кластере один сервер ceph01 (192.168.1.201). Ему присвоен лейбл управляющего сервера (_admin).
Присвоим ему также лейбл сервера монитора:
ceph orch host label add ceph01 mon
Важно отметить, что данные лейблы служат только для удобства работы с кластером. Реальная роль сервера не зависит от значения лейблов.
Еще раз проверяем список хостов:
ceph orch host ls
Мы должны увидеть, что серверу присвоена новая метка:
...
ceph01 192.168.1.201 _admin mon
Выйти с сервера управления можно командой:
exit
Добавление серверов к кластеру
И так, мы создали одноузловой кластер. Добавим в него другие ноды.
Читаем содержимое сертификата на первой управляющей ноде:
cs -- ceph cephadm get-pub-key 2>/dev/null
Мы должны увидеть последовательность, на подобие:
ssh-rsa AAAAB3NzaC...0155d016513
Фиксируем данное содержимое.
Подключаемся по SSH на все ноды, которые хотим добавить в кластер в файл:
vi /root/.ssh/authorized_keys
... добавляем скопированную последовательность ключа.
Теперь возвращаемся на сервер управления и вводим нашу команду-алиас:
cs
Мы должны перейти в командную оболочку на контейнере управления. Добавляем остальные ноды в кластер:
ceph orch host add ceph02 192.168.1.202
ceph orch host add ceph03 192.168.1.203
И для удобства добавим всем трем серверам метки osd (object storage daemon):
ceph orch host label add ceph01 osd1
ceph orch host label add ceph02 osd2
ceph orch host label add ceph03 osd3
Еще раз смотрим хосты кластера:
ceph orch host ls
Мы должны увидеть все три ноды.
Добавление дисков
В начале инструкции мы специально готовили диски, которые будут участвовать в хранении данных ceph. Чтобы кластер их мог использовать, необходимо выполнить несколько действий.
Предположим, что на каждой из наших нод мы планируем использовать дисковые устройства:
- /dev/sdb
- /dev/sdс
Текущее состояние дисков ceph можно увидеть командой:
ceph osd tree
Мы должны увидеть пустой список, так как диски мы еще не добавляли.
Диски сервера ceph01 добавим командами:
ceph orch daemon add osd ceph01:/dev/sdb
ceph orch daemon add osd ceph01:/dev/sdc
* в нашем примере мы назвали сервер ceph01.
Для следующего сервера:
ceph orch daemon add osd ceph02:/dev/sdb
ceph orch daemon add osd ceph02:/dev/sdc
И на третьем:
ceph orch daemon add osd ceph03:/dev/sdb
ceph orch daemon add osd ceph03:/dev/sdc
Еще раз смотрим список дисков ceph:
ceph osd tree
Проверяем общее состояние кластера:
ceph -s
Следующая команда покажет сводку по дисковому пространству:
ceph df
И наконец, смотрим, все ли в порядке с кластером, в целом:
ceph health detail
Мы должны увидеть:
HEALTH_OK
Кластер собран и готов к работе.
Erasure Coding
Если кратко, Erasure Coding — это метод защиты данных, который разбивает файл на фрагменты, добавляет к ним избыточные данные и распределяет их по разным узлам системы. По умолчанию, в ceph используются пулы Replicated, которые требуют больше дисков. Например, если у нас есть 3 диска по 1 Тб, то Replicated дадут 1 Тб чистого пространства для хранения. Erasure Coding позволяет настроить более экономичную схему хранения, например, 2 (данные) + 1 (блоки четности) уже дадут 2 Тб дискового пространства.
Из минусов, Erasure Coding потребляет больше ресурсов процессора и оперативной памяти.
И так, если нам необходимо использовать пул Erasure Coding, переходим к управлению Ceph:
cs
Предположим, у нас 3 диска. Нам необходимо создать профиль командой:
ceph osd erasure-code-profile set myprofile k=2 m=1 crush-failure-domain=host
* где:
- myprofile — произвольное имя профиля.
- k=2 — 2 фрагмента данных.
- m=1 — 1 избыточный (кодирующий) фрагмент.
- crush-failure-domain=host — гарантирует, что два фрагмента не будут храниться на одном хосте.
После создания профиля можно создать пул, который будет его использовать:
ceph osd pool create ec_data_pool erasure myprofile
* в моем примере будет создан пул с названием ec_data_pool.
По умолчанию пулы с Erasure Coding поддерживают только полную запись объектов (используются, например, для Rados Gateway/S3). Для использования с RBD (блочные устройства) или CephFS (файловая система) необходимо явно разрешить частичную запись (allow_ec_overwrites):
ceph osd pool set ec_data_pool allow_ec_overwrites true
Смотрим информацию о пулах и объемах:
ceph df
Ceph Web Dashboard
Ceph предоставляет удобную веб-панель, через которую можно полностью управлять кластером. Она работает сразу после начальной настройки кластера. Данные для подключения были показаны сразу после команды cephadm bootstrap.
Если мы утеряли логин с паролем, то мы можем его сбросить. Для этого подключаемся к консоли управления кластером:
cs
Создаем временный файл, в который добавляем строку с паролем:
echo "my_strong_password" > /tmp/pwd
Сбрасываем пароль с помощью команды ceph и использованием созданного файла:
ceph dashboard ac-user-set-password admin -i /tmp/pwd
После, файл с паролем удаляем:
rm -f /tmp/pwd
Зайти на веб-интерфейс можно по ссылке https://<IP-адрес>:8443/
CephFS
Создадим файловую систему, которую можно будет примонтировать на клиенте. Для этого сначала необходимо:
- Развернуть демон метаданных (mds).
- Создать новый логический пул.
- Создать файловую систему CephFS.
Также рассмотрим пример ее подключения к клиенту.
Создание файловой системы
Переходим к управлению кластером:
cs
Смотрим список всех демонов метаданных:
ceph orch ps | grep mds
Команда должна вернуть пустую строку, так как мы еще не создали ни одного сервиса метаданных.
Запускаем его на наших серверах:
ceph orch apply mds my_data --placement="ceph01 ceph02 ceph03"
* где my_data — произвольное имя сервиса метаданных; ceph01, ceph02, ceph03 — узлы ceph, на которых разворачиваем сервис.
Управляющий узел запланирует операцию по развертыванию демонов. Это займет какое-то время.
Наблюдаем за процессом:
ceph orch ps | grep mds
Когда развертывание будет завершено, мы увидим, примерно, следующее:
mds.my_data.ceph01.ajvdrs ceph01 running (50s) 42s ago 50s 16.5M - 16.2.15 3c4eff6082ae 3c617349b39d
mds.my_data.ceph02.xcxqmz ceph02 running (49s) 43s ago 49s 12.0M - 16.2.15 3c4eff6082ae 52d76c0c7e85
mds.my_data.ceph03.bjkjux ceph03 running (48s) 43s ago 48s 16.6M - 16.2.15 3c4eff6082ae 578d85595563
Создаем пул данных:
ceph osd pool create cephfs_my_data 64
* где будет создан пул с именем cephfs_my_data и количеством логических групп размещения данных 64.
Создаем пул для метаданных:
ceph osd pool create cephfs_my_metadata 64
* будет создан пул cephfs_my_metadata и количеством логических групп размещения данных 64.
Создаем файловую систему CephFS:
ceph fs new my_data cephfs_my_metadata cephfs_my_data
* команда создает новую файловую систему CephFS с названием my_data, объединяя созданные ранее пулы в единую структуру.
Увидеть список файловых систем можно командой:
ceph fs ls
Подключение диска на клиенте
Предположим, нам нужно подключить диск ceph с созданной файловой системой тоже на Linux Ubuntu / Debian.
Для начала установим пакет ceph-common:
apt install ceph-common
На сервере ceph смотрим содержимое следующих файлов:
cat /etc/ceph/ceph.client.admin.keyring
cat /etc/ceph/ceph.conf
Фиксируем.
Возвращаемся на клиента и по очереди создаем файлы:
vi /etc/ceph/ceph.keyring
* с содержимым из файла ceph.client.admin.keyring.
vi /etc/ceph/ceph.conf
* с содержимым из файла ceph.conf.
Создаем файл:
vi /etc/ceph/admin.secret
* содержимое файла ceph.client.admin.keyring (только то, что идет после key =).
Создаем каталог, в который будем монтировать файловую систему ceph:
mkdir -p /mnt/cephfs
И монтируем ее:
mount -t ceph 192.168.1.201:6789,192.168.1.202:6789,192.168.1.203:6789:/ /mnt/cephfs -o name=admin,secretfile=/etc/ceph/admin.secret,fs=my_data
Для автоматического монтирования в файл fstab добавляем:
vi /etc/fstab
192.168.1.201:6789,192.168.1.202:6789,192.168.1.203:6789:/ /mnt/cephfs ceph name=admin,secretfile=/etc/ceph/admin.secret,fs=my_data,_netdev 0 0
Доступ по S3
Для включения поддержки S3 в кластере Ceph необходимо развернуть и настроить Ceph Object Gateway (RGW - RADOS Gateway).
Для этого устанавливаем пакет:
apt install radosgw
На узлах, которые хотим сделать с ролью gateway задаем переменную:
RGWDN=s3.dmosk.ru
* где s3.dmosk.ru — имя узла, по которому в вашей сети должен отвечать s3.
В конфигурацию ceph.conf добавим следующее:
cat <<EOF >> /etc/ceph/ceph.conf
[client.radosgw.gateway]
host = `hostname -f`
keyring = /etc/ceph/keyring.radosgw.gateway
rgw socket path = /var/run/ceph/ceph.radosgw.gateway.fastcgi.sock
log file = /var/log/ceph/client.radosgw.gateway.log
rgw dns name = ${RGWDN}
rgw frontends = "fastcgi socket=/var/run/ceph/ceph.radosgw.gateway.fastcgi.sock port=7480"
EOF
Теперь подключаемся к консоли управления кластером (в нашем примере на сервере 192.168.1.201):
cs
Создаем пользователя rgw и получаем ключ:
ceph auth get-or-create client.radosgw.gateway mon 'allow rw' osd 'allow *' -o /etc/ceph/keyring.radosgw.gateway
* данная команда:
- выдает пользователю «возможности» на уровне мониторов (MON).
- allow rw позволяет шлюзу читать конфигурацию кластера и записывать данные о своем состоянии.
Устанавливаем права доступа к файлу ключа:
chown root:ceph /etc/ceph/keyring.radosgw.gateway
chmod 640 /etc/ceph/keyring.radosgw.gateway
Выводим список всех физических или виртуальных узлов (хостов), которые добавлены в кластер:
ceph orch host ls
Мы должны увидеть список всех наших хостов.
Копируем на другие, которые также хотим сделать узлами кластера s3, сертификат для gateway:
scp /etc/ceph/keyring.radosgw.gateway 192.168.1.202:/etc/ceph/keyring.radosgw.gateway
scp /etc/ceph/keyring.radosgw.gateway 192.168.1.203:/etc/ceph/keyring.radosgw.gateway
Развертываем сервис RGW (RADOS Gateway) для предоставления объектного хранилища s3:
ceph orch apply rgw gwfors3 --placement="ceph01 ceph02 ceph03"
Смотрим итоговый список сервисов ceph:
ceph orch ps
Мы должны увидеть что-то на подобие:
rgw.gwfors3.ceph01.uwjhqi minio-test-01 *:80 running (86s) 79s ago 86s 19.3M - 16.2.15 3c4eff6082ae c3802ade96a7
rgw.gwfors3.ceph01.lcivpx minio-test-02 *:80 running (85s) 80s ago 85s 17.4M - 16.2.15 3c4eff6082ae 9ceb9842bf68
rgw.gwfors3.ceph01.fmezov minio-test-03 *:80 running (86s) 80s ago 87s 16.2M - 16.2.15 3c4eff6082ae 96285af81d40
Создадим пользователя для доступа к данным по s3:
radosgw-admin user create --uid="s3user" --display-name="User For S3"
* в данном примере мы создадим пользователя s3user.
На экране отобразится access_key и secret_key, которые нужно зафиксировать — они нам нужны для подключения по s3:
...
"keys": [
{
"user": "s3user",
"access_key": "43T4A41OQCODJZD7IK7M",
"secret_key": "errOM3viKUXQng8DyvOnAggZIXkgUUSrwruX8NwV"
}
],
...
Создаем баккет через веб, так как встроенной утилиты нет. Посмотреть список бакетов можно командой:
radosgw-admin bucket list
Можно пробовать подключаться по s3. В качестве адреса можно использовать любой из IP-адресов сервера, где была установлена роль Gateway.
NGINX Proxy для S3
Мы настроили несколько узлов для работы в качестве кластера s3. Для обеспечения отказоустойчивости, правильнее всего иметь nginx прокси, который будет ссылаться на эти узлы.
В данном разделе просто приведем пример конфигурационного файла:
upstream ceph {
server 192.168.1.201:80;
server 192.168.1.202:80;
server 192.168.1.203:80;
}
server {
listen 80;
server_name s3.dmosk.ru;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name s3.dmosk.ru;
ssl_certificate /etc/nginx/ssl/cert.pem;
ssl_certificate_key /etc/nginx/ssl/cert.key;
location / {
proxy_pass http://ceph;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 600s;
proxy_send_timeout 600s;
proxy_read_timeout 600s;
client_max_body_size 0;
}
}
* в данном примере мы создаем апстрим,
Чтобы применить настройку, перезапускаем nginx:
nginx -t && nginx -s reload
Добавление сервера к кластеру
Готовим новый сервер. Отображаем дисковые накопители сервера:
lsblk
Готовим их к работе:
wipefs -a /dev/sdX
* команда wipefs выполнит очистку все метаданных, делая носитель /dev/sdX чистым.
Устанавливаем docker engine:
apt install docker.io
И создаем файл конфигурации:
mkdir -p /etc/docker
vi /etc/docker/daemon.json
{
"storage-driver": "overlay2",
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
},
"default-ulimits": {
"nofile": {
"Name": "nofile",
"Hard": 262144,
"Soft": 262144
}
},
"default-address-pools": [
{
"base": "172.17.0.0/16",
"size": 24
}
]
}
Перезапускаем службу docker:
systemctl restart docker
На основном сервере посмотрим последовательность сертификата:
cs -- ceph cephadm get-pub-key 2>/dev/null
Мы увидим что-то на подобие:
ssh-rsa AAAAB3NzaC...0155d016513
Копируем ее и открываем на добавляемой ноде в файл:
vi /root/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC...0155d016513
Теперь возвращаемся на сервер управления и вводим нашу команду-алиас:
cs
Добавляем ноду в кластер:
ceph orch host add ceph04 192.168.1.204
Для удобства добавим метку osd (object storage daemon):
ceph orch host label add ceph04 osd4
Добавляем диски новой ноды в кластер:
ceph orch daemon add osd ceph04:/dev/sdb
ceph orch daemon add osd ceph04:/dev/sdc
Читайте также
Другие полезные материалы: