Настройка отказоустойчивого кластера OpenNebula

Настройка отказоустойчивого кластера OpenNebula

Roman Bogachev VMware Specialist | Drone Pilot | Traveler

Настройка High Available кластера на базе OpenNebula

Данная статья является продолжением серии предыдущих постов.
Я буду использовать pacemaker, corosync и crmsh.

Отключим автозапуск демонов OpenNebula на всех серверах

1
systemctl disable opennebula opennebula-sunstone opennebula-novnc
Добавим ha-clustering репозиторий

/etc/yum.repos.d/network:ha-clustering:Stable.repo

1
2
3
4
5
6
7
[network_ha-clustering_Stable]
name=Stable High Availability/Clustering packages (CentOS_CentOS-7)
type=rpm-md
baseurl=http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-7/
gpgcheck=1
gpgkey=http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-7/repodata/repomd.xml.key
enabled=1

Установим необходимые пакеты

1
yum install corosync pacemaker crmsh resource-agents -y

Если конфликтуют пакеты при установке resource-agents, установим дополнительно:

1
sudo yum install cifs-utils psmisc lvm2

На основном сервере KVM-1, редактируем файл corosync.conf и приводим его к следующему виду:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
totem {
version: 2
crypto_cipher: none
crypto_hash: none
interface {
ringnumber: 0
bindnetaddr: 192.168.2.0
broadcast: yes
mcastport: 5405
ttl: 1
}
}
logging {
fileline: off
to_stderr: no
to_logfile: yes
logfile: /var/log/cluster/corosync.log
to_syslog: yes
debug: off
timestamp: on
logger_subsys {
subsys: QUORUM
debug: off
}
}
quorum {
provider: corosync_votequorum
}
service {
name: pacemaker
ver: 1
}
nodelist {
node {
ring0_addr: KVM-1
nodeid: 1
}
node {
ring0_addr: KVM-2
nodeid: 2
}
node {
ring0_addr: KVM-3
nodeid: 3
}
}

Генерируем ключи:

1
2
cd /etc/corosync
corosync-keygen

Копируем конфигурационные файлы на другие сервера кластера:

1
2
scp /etc/corosync/{corosync.conf,authkey} oneadmin@KVM-2:/etc/corosync
scp /etc/corosync/{corosync.conf,authkey} oneadmin@KVM-3:/etc/corosync

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

1
2
sudo systemctl start pacemaker corosync
sudo systemctl enable pacemaker corosync

Если сервис стартует с ошибкой:

1
2
3
4
5
6
7
8
-- Unit corosync.service has begun starting up.
Aug 29 12:59:49 H1Ceph-node01 corosync[400894]: [MAIN ] Corosync Cluster Engine ('2.3.4'): started and ready to provide service.
Aug 29 12:59:49 H1Ceph-node01 corosync[400894]: [MAIN ] Corosync built-in features: dbus systemd xmlconf snmp pie relro bindnow
Aug 29 12:59:49 H1Ceph-node01 corosync[400894]: [MAIN ] Can't autogenerate multicast address
Aug 29 12:59:49 H1Ceph-node01 corosync[400894]: [MAIN ] Corosync Cluster Engine exiting with status 8 at main.c:1250.
Aug 29 12:59:49 H1Ceph-node01 corosync[400888]: Starting Corosync Cluster Engine (corosync): [FAILED]
Aug 29 12:59:49 H1Ceph-node01 systemd[1]: corosync.service: control process exited, code=exited status=1
Aug 29 12:59:49 H1Ceph-node01 systemd[1]: Failed to start Corosync Cluster Engine.

Выполняем даунгрейд sudo yum downgrade corosync corosynclib

Проверяем статус работы:

1
sudo crm status
1
2
3
4
5
6
7
8
Last updated: Fri Apr  8 13:25:09 2016          Last change: Fri Apr  8 13:24:50 2016 by hacluster via crmd on KVM-2
Stack: corosync
Current DC: KVM-2 (version 1.1.13-10.el7_2.2-44eb2dd) - partition with quorum
3 nodes and 0 resources configured

Online: [ KVM-1 KVM-2 KVM-3 ]

Full list of resources:

Отключим STONITH (механизм добивания неисправной ноды)
(В конце статьи присутствует ссылка на материал об этом).

1
crm configure property stonith-enabled=false

Если в работе используется только два сервера, необходимо отключить кворум, чтобы избежать splitbrain ситуации.

1
crm configure property no-quorum-policy=stop

Создаем ресурсы:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
crm

configure

primitive ClusterIP ocf:heartbeat:IPaddr2 params ip="192.168.2.111" cidr_netmask="24" op monitor interval="30s"

primitive opennebula_p systemd:opennebula op monitor interval=60s timeout=20s op start interval="0" timeout="120s" op stop interval="0" timeout="120s"

primitive opennebula-sunstone_p systemd:opennebula-sunstone op monitor interval=60s timeout=20s op start interval="0" timeout="120s" op stop interval="0" timeout="120s"

primitive opennebula-novnc_p systemd:opennebula-novnc op monitor interval=60s timeout=20s op start interval="0" timeout="120s" op stop interval="0" timeout="120s"

group Opennebula_HA ClusterIP opennebula_p opennebula-sunstone_p opennebula-novnc_p

exit

В данном случае мы создали виртуальный адрес 192.168.2.111, добавили три сервиса OpenNebula в кластер и объеденили их в группу Opennebula_HA.

Проверяем состояние:

1
sudo crm status
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Last updated: Fri Apr  8 13:32:44 2016          Last change: Fri Apr  8 13:32:10 2016 by root via cibadmin on KVM-1
Stack: corosync
Current DC: KVM-2 (version 1.1.13-10.el7_2.2-44eb2dd) - partition with quorum
3 nodes and 4 resources configured

Online: [ KVM-1 KVM-2 KVM-3 ]

Full list of resources:

Resource Group: Opennebula_HA
ClusterIP (ocf::heartbeat:IPaddr2): Started KVM-1
opennebula_p (systemd:opennebula): Started KVM-1
opennebula-sunstone_p (systemd:opennebula-sunstone): Started KVM-1
opennebula-novnc_p (systemd:opennebula-novnc): Started KVM-1

Настройка OpenNebula

На данном этапе необходимо добавить ноды, хранилище и виртуальные сети в наш кластер.

Веб-интерфейс Sunstone будет доступен по адресу http://192.168.2.111:9869:

  1. Создаем кластер;
  2. Добавляем ноды;

Если в процессе добавления хостов появится ошибка, то исправляем её повторной установкой /usr/share/one/install_gems, либо запускаем onehost sync --force.

1
Fri Apr 8 13:40:47 2016 : Error monitoring Host H1-KVM-1 (0):

Все ноды должны быть активны:

  1. Добавляем виртуальную сеть:
1
2
3
4
5
6
7
8
9
10
cat << EOT > ovs.net
NAME="Management"
BRIDGE="ovs-br0"
DNS="192.168.2.6"
GATEWAY="192.168.2.1"
NETWORK_ADDRESS="192.168.2.0"
NETWORK_MASK="255.255.255.0"
VLAN="NO"
VLAN_ID=""
EOT
1
onevnet create ovs.net
  1. Добавляем Ceph хранилище:

4.1) На Frontend ноде (KVM-ADMIN) создаем Ceph пользователя для работы с OpenNebula хостами. В данном примере имя пользователя client.libvirt (само имя пользователя libvirt, префикс client указывает на пользователя в Ceph).

4.2) Создаем пользователя с полными правами rwx для пула TEST:

1
ceph auth get-or-create client.libvirt mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=TEST'

4.3) Генерируем ключи:

1
2
3
4
ceph auth get-key client.libvirt | tee client.libvirt.key
ceph auth get client.libvirt -o ceph.client.libvirt.keyring
[client.libvirt]
key = AQB64QdXqZ5aFBAAH/00usPIZf35tZOt68N00g==

4.4) Теперь нам необходимо скопировать все файлы ключей на OpenNebula хосты.

  • ceph.client.libvirt.keyring должен быть размещен в директории /etc/ceph (на всех серверах в том числе и frontend).
  • client.libvirt.key может быть размещен в любом месте, где пользователь oneadmin имеет привилегии доступа и сможет создать секретные ключи libvirt.
1
2
3
for i in 2 3; do
scp ceph.client.libvirt.keyring root@KVM$i:/etc/ceph
done
1
2
3
for i in 2 3; do
scp client.libvirt.key oneadmin@KVM$i:/var/lib/one
done

4.5) Генериреум UUID конмадой uuidgen, полученное значение будет далее использоваться как $UUID.

1
2
[ceph@KVM-ADMIN ~]$ uuidgen
3c52b00c-f574-4c1c-af7f-2d4a483bf7b4

4.6) Создаем файл secret.xml

$UUID меняем на полученное значение из предыдущего пункта;

1
2
3
4
5
6
<secret ephemeral='no' private='no'>
<uuid>$UUID</uuid>
<usage type='ceph'>
<name>client.libvirt secret</name>
</usage>
</secret>

Копируем файл secret.xml между всеми KVM нодами OpenNebula.

4.7) Следующие команды должны быть выполнены на всех KVM нодах от пользователя oneadmin в директории с файлами secret.xml и client.libvirt.key.

Например:

1
2
[oneadmin@KVM-2 ~]$ virsh -c qemu:///system secret-define secret.xml
Секрет 3c52b00c-f574-4c1c-af7f-2d4a483bf7b4 создан
1
2
[oneadmin@KVM-2 ~]$ virsh -c qemu:///system  secret-set-value --secret $UUID --base64 $(cat client.libvirt.key)
Значение установлено

Проверить установленные значения можно следующей командой:

1
2
3
4
[oneadmin@KVM-2 ~]$ sudo virsh secret-list 
UUID Занято
--------------------------------------------------------------------------------
3c52b00c-f574-4c1c-af7f-2d4a483bf7b4 ceph client.libvirt AQB64QdXqZ5aFBAAH/00usPIZf35tZOt68N00g==

В завершении добавляем Ceph хранилище в OpenNebula

1
2
3
4
5
6
7
8
9
10
cat << EOT > rbd.conf
NAME = "cephds"
DS_MAD = ceph
TM_MAD = ceph
DISK_TYPE = RBD
POOL_NAME = TEST
BRIDGE_LIST ="192.168.2.67 192.168.2.68 192.168.2.69"
CEPH_HOST ="192.168.2.67:6789 192.168.2.68:6789 192.168.2.69:6789"
CEPH_SECRET ="3c52b00c-f574-4c1c-af7f-2d4a483bf7b4"
CEPH_USER = libvirt
1
onedatastore create rbd.conf

Также можно добавить Ceph в качестве системного хранилища.

1
2
3
4
5
6
7
8
NAME = "CephSystem"
TM_MAD = ceph
POOL_NAME = one
BRIDGE_LIST ="192.168.2.67 192.168.2.68 192.168.2.69"
CEPH_HOST ="192.168.2.67:6789 192.168.2.68:6789 192.168.2.69:6789"
CEPH_SECRET = "3c52b00c-f574-4c1c-af7f-2d4a483bf7b4"
CEPH_USER = libvirt
TYPE = SYSTEM_DS

Внимание! Данные действия будут работать только при условии активной cephx авторизации.

Драйвер Ceph работает нормально только с KVM.
По умолчанию используется формат RBD 2, пропишем данный параметр в конфигурационном файле ceph.conf

1
2
[global]
rbd_default_format = 2

Обновим конфигурацию на всех серверах:

1
ceph-deploy config push {host-name [host-name]...}

HA для виртуальных машин

Для настройки High Availability для виртуальных машин, следуем официальной документации OpenNebula

1
2
3
4
5
6
HOST_HOOK = [
name = "error",
on = "ERROR",
command = "ft/host_error.rb",
arguments = "$ID -m -p 5",
remote = "no" ]

Аргументы:
-m - миграция виртуального сервера на другой хост. Только для хостов в одном хранилище.
-r - удаление и пересоздание виртуального сервера. Все данные будут утеряны.
-d - удаление виртуального сервера с хоста.
-p <n> - избегать повторного представления хоста, если хост возвращается в строй после N-циклов мониторинга.

В версии 5.2 добавлен функционал fencing.
Читать на docs.opennebula.org

Скопируем конфигурационный файл на другие ноды кластера:

1
2
3
for i in 2 3; do
scp /etc/one/oned.conf oneadmin@KVM$i:/etc/one/oned.conf
done

Troubleshooting

Если появляется ошибка вида:

1
Error copying image in the datastore: Error registering images/one-3

То исправляем её установкой или обновлением пакета ceph-devel.

Список испольуземых материалов: