Данная статья расскажет о том, как установить Ceph на несколько нод и установить Opennebula, а так же произвести интеграцию Opennebula с Ceph RDB, CephFS

 ВНИМАНИЕ !!!

В продакшине не рекомендуется смешивать OSD ноды и ноды, где будет запускаться KVM машины

Ну... поехали....

Вводная информация

Для тестирования OpenNebula+Ceph было взято 6 серверов из них 3 монитора, две KVM ноды (тут мы будем запускать KVM машины, а так же OSD) и один сервер под управляющую ноду OpenNebula.

На серверах, где будет крутиться OSD был подготовлен отдельный раздел размером /dev/sdb: 320 GiB - для Ceph

Для простоты восприятия мы назовем хосты вот так

192.168.10.2 mon1
192.168.10.3 mon2
192.168.10.4 mon3
192.168.10.5 open-mgr (она же у нас будет ceph-admin)
192.168.10.6 kvm-node1
192.168.10.7 kvm-node2

Первое, что мы сделаем это apt-get update(и затем reboot)  на всех серверах и конечно же проверим, что время у нас синхронизируется(проверим настройки ntpd.conf или chronyd.conf) и конечно проверим время на серверах.

Развертывание Ceph:

Заходим на сервер open-mgr и добавляем ключ репозитария (под пользователем root или можно через sudo)
wget -q -O- 'https://download.ceph.com/keys/release.asc' | apt-key add -

После успешного добавления ключа - добавляем репозитарий для ceph:
echo deb https://download.ceph.com/debian-nautilus/ $(lsb_release -sc) main | tee /etc/apt/sources.list.d/ceph.list

Все команды будем запускать только на open-mgr

Уставливаем ceph-deploy
apt updateapt -y install ceph-deploy

Теперь нам необходимо подобавить на всех серверах, где у нас будет крутиться ceph - добавить юзера ceph-admin.

Для этого нам необходимо запустить вот эти команды на каждом сервере и после проверить, что под юзером ceph-admin - можно выполнять команды sudo без ввода пароля:

export USERPASS="нужен_сложный_пароль" - обычно я генерирую и длину пароля ставлю 32 символа
export USERNAME="ceph-admin"
sudo useradd --create-home -s /bin/bash ${USERNAME}
echo "${USERNAME}:${USERPASS}" | sudo chpasswd
echo "${USERNAME} ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/${USERNAME}
sudo chmod 0440 /etc/sudoers.d/${USERNAME}

Возвращаемся на open-mgr и для генерации ssh-ключений проваливаемся в ceph-admin

su - ceph-admin
и запускаем команду:
ssh-keygen

Создаем файлик /home/ceph-admin/.ssh/config со следующей конфиграцией

Host kvm-node1
      Hostname kvm-node1
     User ceph-admin
 Host kvm-node2
      Hostname kvm-node2
      User ceph-admin
 Host mon1
      Hostname mon1
      User ceph-admin
 Host mon2
      Hostname mon2
      User ceph-admin
 Host mon3
      Hostname mon3
      User ceph-admin

Копируем ключ на все сервера:

 for i in mon1 mon2 mon3 kvm-node1 kvm-node2; do
      ssh-copy-id $i
 done

Переходим к деплою ceph.

Создаем директорию

 mkdir ceph-deploy и переходим в нее
 cd ceph-deploy

В данной директории будет храниться конфигурация для ceph.

Для инициализации мониторов нужно запустить команду:
 
ceph-deploy new mon1 mon2 mon3

Во время запуска может выдать ошибку:

[ceph_deploy][ERROR ] RuntimeError: AttributeError: module 'platform' has no attribute 'linux_distribution'

Решается установкой новой версии ceph-deploy:

 pip3 install git+https://github.com/ceph/ceph-deploy.git

Если в процессе инициализации никаких ошибок не произошло, то можно приступить к следующему шагу.

Установка необходимого софта для Ceph

ceph-deploy install mon1 mon2 mon3 kvm-node1 kvm-node2

Пройдет некоторое время и установка софта будет завершина

Теперь нужно начать инциализацию установки мониторов

ceph-deploy mon create-initial

и произвести деплой демонов

ceph-deploy mgr create mon1 mon2 mon3 

после добавить Metadata сервера

ceph-deploy mds create mon1 mon2 mon3

Копируем конфиг файлы и админ ключ на сервера

ceph-deploy admin mon1 mon2 mon3 kvm-node1 kvm-node2

Как я уже говорил ранее, на сервера kvm-node1 kvm-node2 по разделу /dev/sdb - 320GB

Поэтому запускаем простой скрипт для создание OSD:

for j in kvm-node1 kvm-node2; do
        ceph-deploy osd create --data /dev/sdb $j
 done

B проверяем здоровье нашего кластера 
ceph health

У Вас будет парочка Warnings:
HEALTH_WARN mons are allowing insecure global_id reclaim; и о том, что у вас OSD < 3 (т.к. у нас тестовый кластер, то мы можем добавить еще один OSD, и диск, который по размеру меньше с сервер mon1)

ceph-deploy osd create --data /dev/sdb mon1

Для удобства мы запустим Ceph Дэшборд

Для этого на мониторах нужно установить пакет: ceph-mgr-dashboard  на всех трех серверах mon1, mon2, mon3

for j in mon1 mon2 mon3 do
        ssh -t $j sudo apt install ceph-mgr-dashboard
 done


После чего на open-mgr запускаем

sudo ceph mgr module enable dashboard
sudo ceph dashboard create-self-signed-cert 
sudo ceph dashboard ac-user-create admin administrator -i /home/ceph/pass.txt

Файл pass.txt - должен содержать пароль. Файл можно сразу удалить после создания пользователя.

После чего, можете попробовать открыть Dashboard
https://192.168.10.2:8443

На этом установка Ceph завершена.

Если, что-то пошло не так в процессе установки, то вы всегда можете удалить все и начать заново:

ceph-deploy purge mon1 mon2 mon3 kvm-node1 kvm-node2
ceph-deploy purgedata mon1 mon2 mon3 kvm-node1 kvm-node2
ceph-deploy forgetkeysrm ceph.*

Установка OpenNebula FrontEnd

Заходим по ssh на сервер open-mgr и добавляем ключ репозитария opennebula:

wget -q -O- https://downloads.opennebula.org/repo/repo.key | sudo apt-key add -

Добавляем репозитарий OpenNebula

echo "deb https://downloads.opennebula.org/repo/6.2/Ubuntu/20.04 stable opennebula" | sudo tee /etc/apt/sources.list.d/opennebula.list

Обновляем пакеты и уставим mySQL-сервер

sudo apt update
sudo apt -y install mariadb-server
и
sudo mysql_secure_installation

После установки mySQL сервера, необходима создать юзера для подключения к mySQL:

CREATE DATABASE opennebula;
GRANT ALL PRIVILEGES ON opennebula.* TO 'oneadmin' IDENTIFIED BY 'очень_сложный_пароль';
FLUSH PRIVILEGES;EXIT;

Теперь ставим необходимые пакеты для FrontEnd:

sudo apt install opennebula opennebula-sunstone opennebula-gate opennebula-flow

И после установки ставим Руби-модули:

sudo /usr/share/one/install_gems

После уставноки всех модулей нужно настоить OpenNebula для работы с mySQL, для этого необходимо отредактировать файлик: /etc/one/oned.conf закомментировава строку связанную с sqllite и добавив

DB = [ backend = "mysql",
 server = "localhost",
 port = 0,
 user = "oneadmin",
 passwd = "очень_сложный_пароль",
 db_name = "opennebula" ]

Создадим пароль для oneadmin (вход в WebUI).

sudo su - oneadmin echo "oneadmin:ваш_пароль" > ~/.one/one_auth

если на сервере стоит фаервол, то добавляем правило:

sudo ufw allow proto tcp from any to any port 9869

После чего включаем и запускаем сервисы:

sudo systemctl start opennebula opennebula-sunstone sudo systemctl enable opennebula opennebula-sunstone

Если Все сделано было правильно, то можно зайти на WebUI:
https://192.168.10.5:9869

Установка OpenNebula KVM-Node

Заходим по ssh на сервера kvm-node1, kvm-node2 и  добавляем ключ репозитария opennebula 

wget -q -O- https://downloads.opennebula.org/repo/repo.key | sudo apt-key add -

Добавляем репозитарий OpenNebula

echo "deb https://downloads.opennebula.org/repo/6.2/Ubuntu/20.04 stable opennebula" | sudo tee /etc/apt/sources.list.d/opennebula.list

Теперь на kvm-node1 и kvm-node2 нужно установить пакеты

apt-get install opennebula-node-kvm openvswitch-switch

После успешной установки нужно отредактировать файлик :  /etc/libvirt/libvirtd.conf
Установив следующие значения:

unix_sock_group = "oneadmin"
unix_sock_rw_perms = "0777"

После чего нам необходимо перезапустить сервисы:

systemctl restart libvirtd.service libvirtd.socket 

Теперь вернемся на open-mgr
 и станем юзером oneadmin:
 sudo su - oneadmin

и выполним команды:

ssh-keyscan open-mgr kvm-node1 kvm-node2 >> /var/lib/one/.ssh/known_hosts

 for j in open-mgr kvm-node1 kvm-node2 do
       scp -rp /var/lib/one/.ssh $j:/var/lib/one/
done

Проверьте, что Вы можете зайти на все сервера без пароля(по ключу).

Добавление KVM-хоста

Необходимо зайти http://ip_вашего_сервера:9869 под учетной записью: oneadmin и перейти  Infrastructure -> Hosts и нажать иконку с "+"

Укажите Тип : KVM и IP сервера. Нажмите на Create - если все было сделано верно - статус Хоста изменится на ON. Повторите это действие для второго сервера.

И так мы настроили Ceph и OpenNebula и осталось самое маленькое - сделать интеграцию этих двух продуктов. Делается это не так сложно(когда путь пройден):

Первое, что нам нужно, так это создать пул - и назовем мы его "one" это можно сделать либо из консоли либо через веб-интерфейс Ceph. Давайте сделаем это через Web-интерфейс. Зайдите под адресу:
https://mon1:8443/ и зайдите юзером admin.
После чего перейдите в раздел Pool и нажмите Create:

Задайте значения для полей:
NAME: one, 
Applications: rdb, 
Pool type: replicated и укажите размер пула и нажмите: Create Pool.
Нужно немного подождать, чтобы пул создался и стал зелененьким. Теперь возращаем на сервер open-mgr и заходим в юзера ceph-admin:
Переходим в директори ceph-deploy и выполняем команду:

 ceph auth get-or-create client.oneadmin mon 'profile rbd' osd 'profile rbd pool=one' > /etc/ceph/ceph.client.oneadmin.keyring

Создаем файлик ключ:

cat /etc/ceph/ceph.client.oneadmin.keyring | grep key | awk '{print $3}' >>  /etc/ceph/oneadmin.key

Копируем оба файлика (/etc/ceph/ceph.client.oneadmin.keyring  и /etc/ceph/oneadmin.key) на Kvm-node1, Kvm-node2

На KVM-node1 запускаем генерацию uuidgen и создаем файл sec.xml:

<secret ephemeral='no' private='no'>
  <uuid>значение_uuid (результат uuidgen)</uuid>
   <usage type='ceph'>
     <name>client.oneadmin строка из файла  /etc/ceph/oneadmin.key</name>
   </usage>
</secret>

Запускаем две команды:

virsh secret-define --file sec.xml 
virsh secret-set-value --secret UUID --base64 $(cat /etc/ceph/oneadmin.key)

UUID - результат uuidgen

Cкопируйте этот файлик (sec.xml) и на вторую ноду и сделайте такие же действия:

virsh secret-define --file sec.xml 
virsh secret-set-value --secret UUID --base64 $(cat /etc/ceph/oneadmin.key)

UUID - результат uuidgen

Проверьте, что необходимые изменения внесены:

 virsh secret-list

Перезапустим сервис на обеих нодах:

systemctl restart libvirtd.service

Выполним команду:

rbd ls -p one --id oneadmin на обоих KVM нодах

Команда должна исполниться, но так как ни чего пока не создано - вернутся пустая строка.

И так теперь нам нужно создать System DataStore(тут хранится - контексты, конфига для VM) и Image DataStore (тут будет хранится образы VM). Очень Важно - если мы хотим HA, то нам нужно, чтобы System DataStore был shared. Для этого необходимо создать cephfs (я на это потратил если честно очень много времени).

Для создание ImageDS можно использовать простой конфиг:

Cоздайте файле image_ds.conf

NAME = "cephds"
DS_MAD = ceph
TM_MAD = ceph
DISK_TYPE = RBD
POOL_NAME = one
CEPH_HOST = "mon1:6789 mon2:6789 mon3:6789"
CEPH_USER = oneadmin
CEPH_SECRET = "secret"
BRIDGE_LIST = "open-mgr"

secret = колонка UUID при выполнении команды virsh secret-list

Выполните : onedatastore create image_ds.conf

Перейдиту в WebUI в раздел DataStores - там вы увидите cephds - проверьте, что размер раздела верный.

Теперь необходимо создать SystemDS, но уже shared. Для этого, как выше я написал нужно создать cephfs. Для этого достаточно испольнить команду

ceph osd pool create cephfs-data
ceph osd pool create cephfs-metadata
ceph fs new cephfs cephfs-metadata cephfs-data

Выдаем права foo - юзеру для работу с данным пулом

sudo ceph auth get-or-create client.foo mon 'allow r' mds 'allow rw' osd 'allow rw pool=data' > /etc/ceph/ceph.client.foo.keyring

Получаем ключ доступ для юзера foo:
sudo ceph auth get client.foo

Захраните полученный ключ в файле /etc/ceph/ceph.client.foo.secret и скопируйте его на kvm-node1 и kvm-node2,open-mgr в директорию /etc/ceph/

Теперь необходимо смонтировать данную FS:

Для этого, сначала копируем содержимое /var/lib/one/datastores/ в какой либо каталог (это на ноде open-mgr)
и монтируем

mount -t ceph mon1:6789,mon2:6789,mon3:6789:/ /var/lib/one/datastores/ -o name=foo,secretfile=/etc/ceph/ceph.client.foo.keyring (это нужно сделать на open-mgr, kvm-node1, kvm-node2)

Незабудьте добавить монтирование в /etc/fstab.

Создайте файл ds_shared.conf

NAME = shared_system
TM_MAD = shared
TYPE = SYSTEM_DS

и выполните onedatastore create ds_shared.conf

Проверьте, что ДатаСтор создался.  Теперь давайте попробуем создать VM. Для начала нужно загрузить IMAGE Операционной системы - я использовать qcow2-image

Теперь необходимо создать  Шаблон для VM - для этого перейдите в раздел Templates  и нажмите плюсик, выберите CREATE

Указаываем название, тип виртуализации, размер памяти, CPU. После чего переходим в раздел Storage - и выбираем Image

Жмем Create (на данном этапе мы сетку не указываем, если сеть уже создана - то можно указать в разделе Network).

Наш Шаблон создался и теперь мы можем создать виртуальную Машину: Переходим в раздел Instances и кликаем VM - жмем на "+" и выбираем Шаблон

Указываем Имя и выбираем Deploy VM on Specific DataStore  и выбираем shared_system и жмем Create. Через некоторое время статус VM - станет RUNNING

Теперь осталось самое вкусное - это HA VM, при падении хоста, где ранится VM - она должна смигрировать на другой хост и запуститься уже там.

По документации все выглядит легко и просто.. Нужно просто добавить HOOK на status: ERROR у хоста и все будет работать, на самом деле это не так. Первое, что нужно учитывать - должен быть shared сторадж - мы его создали, иначе получим ошибку, при падении хоста будет попытка скопировать данные с умершего сервера на новый по ssh - а это не возможно будет.

Второе нужно правильно настроить файл:

 /var/lib/one/remotes/hooks/ft/fence_host.sh

Закомментируйте строку:

echo ""Fence host not configured, please edit ft/fence_host.sh"" && exit 1

И добавьте строку:

fence_heuristics_ping --ping-count=2 --ping-good-count=2 --ping-maxfail=1 --ping-targets=$FENCE_IP -o off && exit 0

После строк

if [ -z "$FENCE_IP" ]; then
echo "Fence ip not found"
exit 1
fi

FENCE_IP - нужно задать в свойствах Host

сохраняем и ставим пакет:

sudo apt install fence-agents  -y

Теперь посмотрим файл-HOOK "/usr/share/one/examples/host_hooks/error_hook"

ARGUMENTS = "$TEMPLATE -m -p 2"
ARGUMENTS_STDIN = "yes"
COMMAND = "/var/lib/one/remotes/hooks/ft/host_error.rb"
NAME = "host_error"
STATE = "ERROR"
REMOTE = "no"
RESOURCE = HOST
TYPE = state

тут изначаль p=5 - но я поставил 2. Это означает, что Хост будет проверян два раза в течении 120 сек - на состояние живой не живой.

Регистрируем наш HOOK:

onehook create /usr/share/one/examples/host_hooks/error_hook

для проверки onehook list

open-mgr:$ onehook list

ID NAME TYPE
7 host_error state

Все вроде бы сделано. Осталось проверить, работает ли миграция VM. Допустим, что ВМ у Вас запущена на kvm-node1. Заходим на kvm-node1 и блокируем весь траффик (я делал DROP для подсети, где расположены open-mgr). 

Как только хост перейдет в состояние: ERROR

Запустить HOOK:

[HOST 1][I] Hook launched - запуск хука
[HOST 1][I] hostname: kvm-node1- хост, который ушел в ERROR
[HOST 1][I] Wait 2 cycles. - ждем два цикла  - p=2
[HOST 1][I] Sleeping 120 seconds. - спим 120 сек
[HOST 1][I] Fencing enabled - включаем механизм Fence
[HOST 1][I] Success: Powered OFF  говорим - что машина OFF
[HOST 1][I] Fencing success
[HOST 1][I] states: 3, 5, 8
[HOST 1][I] vms: ["VMID"] - на этом этапе происходит миграция VM на другой хост
[HOST 1][I] resched VMID - запуск VM
[HOST 1][I] Hook finished
 

Если зайти в Instances -> VM - то мы увидим, что VM перешла на другой хост.

Следующая статья, я очень надеюсь, будет о OneProvision

Комментарии (0)