Данная статья расскажет о том, как установить 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
Если в процессе инициализации никаких ошибок не произошло, то можно приступить к следующему шагу.
Установка необходимого софта для Cephceph-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 - должен содержать пароль. Файл можно сразу удалить после создания пользователя.
После чего, можете попробовать открыть Dashboardhttps://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 -
Добавляем репозитарий OpenNebulaecho "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 -
Добавляем репозитарий OpenNebulaecho "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.confNAME = "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.confNAME = 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 listID 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