2026-09-18
Настройка кластера Ceph на Ubuntu: OSD, CephFS, S3 и Dashboard

Настройка кластера Ceph на Ubuntu: OSD, CephFS, S3 и Dashboard

Ceph — распределённое программно-определяемое хранилище: объектное (S3), блочное (RBD) и файловое (CephFS). В этой инструкции — сборка кластера из трёх серверов через cephadm, веб-Dashboard, Erasure Coding, CephFS и доступ по S3 с проксированием через NGINX.

Работаем на Ubuntu 24.04; большинство команд подойдут и для Debian.


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

1. Диски

lsblk

Для OSD выделяется диск целиком — без разделов и файловых систем.

2. Docker

Актуальный метод развёртывания — контейнеры через cephadm, поэтому Docker будет установлен и настроен.

3. Роли серверов

В продакшене роли управления, мониторинга и хранения разносят по узлам; для кворума нужно минимум 3 сервера. В примере — 3 сервера со всеми ролями.


Предварительная настройка

1. Установка lvm2

apt update
apt install lvm2

2. Очистка диска

lsblk

Для каждого диска под кластер:

wipefs -a /dev/sdX

Меняйте X на букву вашего диска. Команда удаляет сигнатуры ФС, RAID и таблиц разделов — не перепутайте диск, данные будут потеряны.


Установка и настройка Docker

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 и пул адресов для контейнеров: диапазон 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.

Роль монитора и датастора объединены; в больших средах роли разделяют.

Инициализация монитора

На одной ноде (192.168.1.201):

apt install cephadm

cephadm — оркестратор управления жизненным циклом кластера; ставится на любой узел сети, не обязательно на ноду кластера.

cephadm bootstrap --mon-ip 192.168.1.201

Создаёт одноузловой кластер с указанным mon-ip.

Ceph Dashboard is now available at:
             URL: https://ceph01:8443/
             User: admin
         Password: 99b5bho4uw
...
You can access the Ceph CLI as following ...:
        sudo /usr/sbin/cephadm shell --fsid 3668ff92-... -c /etc/ceph/ceph.conf -k /etc/ceph/ceph.client.admin.keyring

Зафиксируйте логин/пароль Dashboard и команду подключения.

Создаём алиас:

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 — сокращение для подключения к управляющему контейнеру.

cs
ceph -s
ceph orch host ls
HOST          ADDR           LABELS  STATUS
ceph01        192.168.1.201  _admin
1 hosts in cluster

Один хост ceph01 с лейблом _admin.

ceph orch host label add ceph01 mon
ceph orch host ls

Лейблы — только для удобства; реальная роль от них не зависит.

exit

Добавление серверов

Читаем публичный ключ кластера:

cs -- ceph cephadm get-pub-key 2>/dev/null
ssh-rsa AAAAB3NzaC...0155d016513

На каждой добавляемой ноде добавляем ключ в /root/.ssh/authorized_keys:

vi /root/.ssh/authorized_keys

Возвращаемся на управляющий узел:

cs
ceph orch host add ceph02 192.168.1.202
ceph orch host add ceph03 192.168.1.203
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

Добавление дисков

Планируем использовать /dev/sdb и /dev/sdc на каждой ноде.

ceph osd tree

Пока пусто — диски не добавлены.

ceph orch daemon add osd ceph01:/dev/sdb
ceph orch daemon add osd ceph01:/dev/sdc
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 osd tree
ceph -s
ceph df
ceph health detail
HEALTH_OK

Кластер собран и готов к работе.


Erasure Coding

Erasure Coding разбивает файл на фрагменты, добавляет избыточные данные и распределяет их по узлам. По умолчанию пулы Replicated требуют больше дисков: 3 диска по 1 Тб → 1 Тб полезного пространства. Схема 2+1 даёт 2 Тб.

Минус: больше нагрузки на CPU и RAM.

cs
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 по умолчанию поддерживают только полную запись объектов (S3/RGW). Для RBD и CephFS разрешаем частичную запись:

ceph osd pool set ec_data_pool allow_ec_overwrites true
ceph df

Ceph Web Dashboard

Панель работает сразу после cephadm bootstrap; данные подключения показаны в его выводе.

Сброс пароля:

cs
echo "my_strong_password" > /tmp/pwd
ceph dashboard ac-user-set-password admin -i /tmp/pwd
rm -f /tmp/pwd

Вход: https://<IP-адрес>:8443/.


CephFS

Порядок: развернуть MDS → создать пулы → создать файловую систему → примонтировать на клиенте.

Создание файловой системы

cs
ceph orch ps | grep mds

Пусто — сервис метаданных ещё не создан.

ceph orch apply mds my_data --placement="ceph01 ceph02 ceph03"

где my_data — имя сервиса метаданных, ceph01 ceph02 ceph03 — узлы.

ceph orch ps | grep mds
mds.my_data.ceph01.ajvdrs  ceph01  running (50s)  42s ago  50s  16.5M  -  16.2.15  ...
mds.my_data.ceph02.xcxqmz  ceph02  running (49s)  43s ago  49s  12.0M  -  16.2.15  ...
mds.my_data.ceph03.bjkjux  ceph03  running (48s)  43s ago  48s  16.6M  -  16.2.15  ...
ceph osd pool create cephfs_my_data 64
ceph osd pool create cephfs_my_metadata 64
ceph fs new my_data cephfs_my_metadata cephfs_my_data
ceph fs ls

где 64 — количество групп размещения (PG), my_data — имя CephFS.

Подключение на клиенте

apt install ceph-common

На сервере Ceph читаем:

cat /etc/ceph/ceph.client.admin.keyring
cat /etc/ceph/ceph.conf

На клиенте создаём файлы с этим содержимым:

vi /etc/ceph/ceph.keyring
vi /etc/ceph/ceph.conf
vi /etc/ceph/admin.secret

В admin.secret — только значение после key = из ceph.client.admin.keyring.

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

Автомонтирование — в /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 (RADOS Gateway)

apt install radosgw

На узлах-шлюзах задаём имя:

RGWDN=s3.imaxis.ru

Добавляем в /etc/ceph/ceph.conf:

cat >> /etc/ceph/ceph.conf <<EOF

[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
cs
ceph auth get-or-create client.radosgw.gateway mon 'allow rw' osd 'allow *' -o /etc/ceph/keyring.radosgw.gateway
chown root:ceph /etc/ceph/keyring.radosgw.gateway
chmod 640 /etc/ceph/keyring.radosgw.gateway
ceph orch host ls

Копируем keyring на остальные узлы S3:

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:

ceph orch apply rgw gwfors3 --placement="ceph01 ceph02 ceph03"
ceph orch ps
rgw.gwfors3.ceph01.uwjhqi  ...  *:80  running (86s) ...

Создаём пользователя S3:

radosgw-admin user create --uid="s3user" --display-name="User For S3"
    "keys": [
        {
            "user": "s3user",
            "access_key": "43T4A41OQCODJZD7IK7M",
            "secret_key": "errOM3viKUXQng8DyvOnAggZIXkgUUSrwruX8NwV"
        }
    ],

Зафиксируйте access_key и secret_key.

radosgw-admin bucket list

Бакет удобнее создавать через сторонний S3-клиент (например, s3cmd или aws-cli) — встроенной утилиты для этого нет.

NGINX-прокси для S3

Для отказоустойчивости ставим NGINX перед узлами RGW:

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.imaxis.ru;
    return 301 https://$host$request_uri;
}

server {
    listen       443 ssl;
    server_name  s3.imaxis.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;
    }
}

client_max_body_size 0 — без ограничения размера загружаемых объектов.

nginx -t && nginx -s reload

Добавление нового сервера

lsblk
wipefs -a /dev/sdX
apt install docker.io
mkdir -p /etc/docker
vi /etc/docker/daemon.json

Содержимое daemon.json — как выше.

systemctl restart docker

На управляющем сервере:

cs -- ceph cephadm get-pub-key 2>/dev/null

Копируем ключ в /root/.ssh/authorized_keys на новой ноде, затем:

cs
ceph orch host add ceph04 192.168.1.204
ceph orch host label add ceph04 osd4
ceph orch daemon add osd ceph04:/dev/sdb
ceph orch daemon add osd ceph04:/dev/sdc

Тонкости и подводные камни

  • wipefs -a необратима — перепроверяйте букву диска.
  • Кворум MON — минимум 3 монитора для отказоустойчивости.
  • Replicated vs Erasure — EC экономит место, но требует CPU/RAM и allow_ec_overwrites для RBD/CephFS.
  • cephadm shell — большинство команд выполняются внутри контейнера через алиас cs.
  • Dashboard 8443 — не забудьте сертификат и ограничение доступа.
  • CephFS secret — в admin.secret только значение после key =.
  • S3 доступaccess_key/secret_key показываются один раз; храните их.
  • RGW fastcgi — в новых версиях Ceph больше используется beast frontend; сверяйтесь с версией.
  • NGINX и S3 — обязателен проброс Host, иначе имя бакета в поддомене не распознается.

Шпаргалка

apt install lvm2 docker.io cephadm
wipefs -a /dev/sdb
cephadm bootstrap --mon-ip 192.168.1.201
# alias cs -> cephadm shell ...
ceph orch host add ceph02 192.168.1.202
ceph orch daemon add osd ceph01:/dev/sdb
ceph osd erasure-code-profile set myprofile k=2 m=1 crush-failure-domain=host
ceph fs new my_data cephfs_my_metadata cephfs_my_data
ceph orch apply rgw gwfors3 --placement="ceph01 ceph02 ceph03"
radosgw-admin user create --uid="s3user" --display-name="User For S3"

Проверено на: Ubuntu 24.04 + Ceph (cephadm, Reef/Squid).
Дата: Сентябрь 2026.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *