Настройка кластера Ceph на Ubuntu

Обновлено и опубликовано Опубликовано:

Используемые термины: CephUbuntu, Docker.

В данной инструкции рассмотрим основные команды для настройки и запуска кластера Ceph. Также приведем примеры полезных настроек. В итоге мы получим:

  • Кластерное хранилище из трех серверов.
  • Веб-интерфейс для просмотра состояния и изменения некоторых настроек.
  • Доступ к хранилищу по S3. Проксирование через nginx.

Мы будем работать на системе Ubuntu 24.04. Во много, данные команды подойдут для Debian.

Требования к инфраструктуре

Прежде чем начать, необходимо проговорить, что потребуется на нодах для создания кластера 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

Создадим файловую систему, которую можно будет примонтировать на клиенте. Для этого сначала необходимо:

  1. Развернуть демон метаданных (mds).
  2. Создать новый логический пул.
  3. Создать файловую систему 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

Читайте также

Другие полезные материалы:

1. Балансировка нагрузки с помощью NGINX.

2. Установка Docker на Linux.

3. Настройка GlusterFS в Astra Linux.

# Ubuntu # Серверы
Дмитрий Моск — частный мастер
Была ли полезна вам эта инструкция?

Да            Нет

Дмитрий Моск
— IT-специалист.
Настройка серверов, услуги DevOps.

Заказать настройку кластера

Нужна бесплатная консультация?

Мини-инструкции

Как установить и настроить SambaDC (Active Directory) на Linux Ubuntu

Как установить систему для удаленного управления устройствами MeshCentral на Linux

Установка и настройка кластера Ceph на Ubuntu для организации дискового хранилища

Настройка Dovecot Solr для ускорения поиска по почте

Установка и настройка Signaling Server (High-performance backend) для Nextcloud Talk на Ubuntu Server

Как установить и настроить сервис S3 на базе Minio на Linux

Организация сервиса календаря и адресной книги Baikal на Linux Debian

Другие инструкции

Все статьи

Нужна помощь? Пишите:






Реклама