Содержание

  1. Установка
  2. Полезные команды
  3. Замена OSD
  4. Docker RBD volume driver

Установка

CEPH - распределённое сетевое хранилище, которое выбрасывает S3, iSCSI, RBD etc. Классная вещь, документации много, но очень сильно подводит то, что не сразу ясно стало, как правильно установить.

Rook

Официально рекомендуемый способ установки в Kubernetes. Опыт ребят из Фланта-а можно почитать здесь.

Cephadm

Написал на основе этого Ansible playbook-и и успешно эксплуатировал кластер развёрнутый на хосте. По локалке принял в себя 40 Gib за 2 минуты и остался жив :)

Deprecated / not recommended

То, что я пробовал, а потом оказалось, что оно либо не рабочее, либо deprecated:

  • ceph-deploy где-то в документации нарывался на то, что этот способ не рекомендуется. Жаль потратил на него на тот момент уже пару дней. Ссылку привести не могу, у ребят истёк SSL сертификат и из-за HTST меня не пускает на сайт с документацией :)
  • ceph ansible - жирно, классно, много функционала, но master CentOS 7 уже не поддерживает, мониторы у меня так и не засинхронизировались, возможности поставить dashboard без мониторинга я не нашёл, реализовал сам, набрался опыта с Ansible, но потом полезли новые проблемы и я с этого комбайна слез на cephadm, чему очень рад.

Полезные команды

Ну прежде всего, вот понравившийся мне cheatsheet.
Посмотреть список используемых винтов по серверам:

ceph orch device ls
ceph device ls
ceph device ls-by-host ceph-server-0

Посмотреть сводку занимаемого места.

ceph osd df
ceph df
ceph df | grep -oE '[0-9.]+\s*[a-zA-Z]+$' | uniq | sort -n

Посмотреть состояние кластера.

ceph status
ceph -w

Посмотреть инфраструктуру, какие сервисы\контейнеры работают и где.

ceph orch ls
ceph orch ps

Замена OSD

Вот хорошая статья от тех же Флантов-цев и полезный комментарий под ней. Друг друга они хорошо дополняют.
OSD я пересоздавал когда на сервере (виртуалке) расширял блочное устройство, чтобы места в кластер добавить. Для себя вывел следующий алгоритм:

  1. Кластер должен быть в состоянии HEALTH_OK
  2. Выводим OSD из кластера
  3. Удаляем демон (контейнер по факту), который держит этот osd
  4. Делаем purge
  5. Очищаем раздел
  6. Подключаем снова
  7. Ждём HEALTH_OK
# OSD который мы хотим пересоздать
OSD='osd.0'

# находим хост
HOST="$(ceph device ls | awk "/${OSD}/{print \$2}" | cut -d: -f1)"

# и имя блочного устройства отведённого под OSD
DEV="/dev/$(ceph device ls | awk "/${OSD}/{print \$2}" | cut -d: -f2)"

# п.1
ceph health | grep -q 'HEALTH_OK'

# п.2
ceph osd out "$OSD"

# п.3
ceph orch daemon rm "$OSD" --force 

# п.4
ceph osd purge "$OSD" --force 

# п.5
ceph orch device zap "${HOST}:${DEV}" --force

# п.6
NEW_ID="osd.$(ceph orch daemon add osd "${HOST}:${DEV}' | awk '{print $3}')"
sleep 5
ceph osd crush reweight "$NEW_ID" 1

# п.7
while ! ceph health | grep -q 'HEALTH_OK'; do
  sleep 5
done

Из моего опыта, на замену OSD в котором было 15 GiB занято, уходит 30 минут. Тестировал на трёх CX21 Hetzner.

RBD and Docker

Запуск RBD и связка с Docker:

  1. Создать пул.
  2. Проинициализировать пул.
  3. Создать пользователя для запуска.
  4. Выключить лишние фичи. Дело в том, что в ядре линукс до 4.17 не поддерживается ряд фич для RBD, которые пришлось отключить. Посмотреть справку можно так:
ceph config help rbd_default_features
  1. Поставить Docker volume plugin.
  2. Проверить на контейнере.
  3. Примонтироваться и посмотреть, есть ли файл.
# п.1
ceph osd pool create rbd

# п.2
rbd pool init rbd

# п.3
ceph auth get-or-create client.rbd mon 'profile rbd' osd 'profile rbd pool=rbd' mgr 'profile rbd pool=rbd' > /etc/ceph/ceph.client.rbd.keyring

# п.4
ceph config set global rbd_default_features 7

Ставил вот этот volume driver. Всё остальное, что находилось, последний раз обновлялось 3-4 года назад (проект скорее мёртв, чем жив). Кроме того, этот драйвер не требует запуска чего либо на стороне, встраивается в сам Docker. Поставить можно так:

# п.5
docker plugin install wetopi/rbd \
  --alias=rbd \
  --grant-all-permissions \
  LOG_LEVEL=1 \
  RBD_CONF_POOL=rbd \
  RBD_CONF_CLUSTER=ceph \
  RBD_CONF_KEYRING_USER=client.rbd \
  MOUNT_OPTIONS='--options=noatime,discard'

Запустим простой docker-compose стек и примонтируем образ:

version: "3.8"

services:
  test:
    image: alpine
    command: sh -c 'cat /vol/test; date | tee /vol/test'
    volumes:
      - data-volume:/vol

volumes:
  data-volume:
    name: vol1
    driver: rbd
    driver_opts:
      size: 123  # MiB

Запускаем и проверяем:

# п.6
sudo docker-compose up

# п.7
rbd map vol1
mkdir /tmp/vol1
mount /dev/rbd0 /tmp/vol1
cd /tmp/vol1
ls -la 
cat test
cd /
umount /tmp/vol1 
rbd unmap /dev/rbd0