====== Создание отказоустойчивых Linux решений 2022 ======
===== Программа курса =====
* [[http://www.specialist.ru/course/un5|Linux. Уровень 6. Создание отказоустойчивых кластерных решений.]]
===== Цель курса =====
* Научиться настраивать отказоустойчивую конфигурацию сервисов Linux на "железном" оборудовании в сети предприятия.
===== Модуль 0. Подготовка стенда в классе =====
* Узнать свой номер стенда
* Удалить виртуалки
* Удалить профили putty
* Отключить не используемые адаптеры
* Записать логин пароль и IP (сообщить преподавателю) рабочей станции
* Проверить наличие дистрибутивов и образов
===== Модуль 1. Развертывание систем и сети кластера =====
==== Теория ====
* [[http://www.team.ru/server/stbl_compare.shtml|Сравнение кластера надежности и "обычного" сервера]]
* [[https://ru.wikipedia.org/wiki/%D0%9E%D1%82%D0%BA%D0%B0%D0%B7%D0%BE%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D1%8B%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80|Отказоустойчивый кластер]]
* [[https://ru.wikipedia.org/wiki/%D0%92%D0%B5%D1%80%D0%BE%D1%8F%D1%82%D0%BD%D0%BE%D1%81%D1%82%D1%8C_%D0%B1%D0%B5%D0%B7%D0%BE%D1%82%D0%BA%D0%B0%D0%B7%D0%BD%D0%BE%D0%B9_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B|Вероятность безотказной работы]]
* [[https://www.youtube.com/watch?v=-izJHCPKvCg|youtube Отказоустойчивый микрокластер своими руками / Виталий Гаврилов (Ленвендо)]] Схема сети на 4-й минуте
* [[https://ru.wikipedia.org/wiki/VRRP|VRRP]]
==== Лабораторные работы ====
=== 1.1 Импорт VM Linux ===
Запустите с правами Administrator
C:\cmder\cmder.exe
bash
cd
test -d conf && rm -r conf
git clone http://val.bmstu.ru/unix/conf.git
cd conf/virtualbox/
!!! 6 - это номер курса, вместо X укажите Ваш номер стенда, если не знаете его, спросите преподавателя !!!
./setup.sh X 6
=== 1.2 Аппаратная настройка систем node1 и node2 ===
* Адаптер 1 - eth0 - Виртуальный адаптер хоста (LAN)
* Адаптер 2 - eth1 - Сетевой мост (ISP1) только для node1 и node2
* 2, а если есть возможность, 4 Gb RAM
* Жесткий диск размер 4G уже добавлен
=== 1.3 Импорт VM Windows ===
=== 1.4 Исходная настройка сети шлюза ===
ubuntu# sh net_gate.sh
ubuntu# init 6
* PuTTY !!!
gate# sh conf/dhcp.sh
=== 1.5 Тестирование сети ===
windows> ping 1.1.1.1
=== 1.6 Подготовка отказоустойчивой конфигурации ===
* [[Сервис Keepalived]] (сервис не перезапускать!)
gate# cat /etc/network/interfaces
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.X.1
netmask 255.255.255.0
auto eth1
iface eth1 inet manual
up ip link set eth1 up
#auto eth2
#iface eth2 inet manual
# up ip link set eth2 up
gate# cat /etc/hostname
node1.corpX.un
gate# cat /etc/hosts
127.0.0.1 localhost
192.168.X.1 node1.corpX.un node1
192.168.X.2 node2.corpX.un node2
gate# init 6
=== 1.7 Тестирование сети ===
node1# ping ya.ru
windows> ping 1.1.1.1
==== Вопросы ====
- НА кластер используется для повышения ...
- НP кластер используется для повышения ...
- Вероятность безотказной работы группы объектов равна ...
===== Модуль 2. Синхронизация файлов конфигураций узлов =====
==== Теория ====
* [[https://habr.com/en/post/120702/|csync2 или как облегчить работу с кластером]]
* [[https://ru.wikipedia.org/wiki/Ansible|Ansible]]
==== Лабораторные работы ====
=== 2.1 Запуск node2 ===
=== 2.2 Синхронизация с использованием сервиса SSH ===
* Настройка доступа по протоколу ssh пользователя root с node1 на node2 ([[Сервис SSH#Разрешение доступа пользователя root на основании адреса клиента]])
* Настройка беспарольного доступа пользователя root с node1 на node2 ([[Сервис SSH#Аутентификация с использованием ключей ssh]])
node2# ifconfig eth0 inet 192.168.X.2/24
node1# ping node2
node1# ssh-keygen
...
Enter passphrase (empty for no passphrase): Пароль на ключ пустой!!!
...
node1# ssh-copy-id node2
Проверка:
node1#
scp /etc/hosts node2:/etc/
scp /etc/hostname node2:/etc/
scp /etc/network/interfaces node2:/etc/network/
node1# ssh node2 route add default gw 192.168.X.254
node1# ssh node2 apt update
node1# ssh node2 apt install keepalived
scp /etc/keepalived/keepalived.conf node2:/etc/keepalived/keepalived.conf
scp /usr/local/bin/vrrp.sh node2:/usr/local/bin/vrrp.sh
* Правим файлы конфигурации на node2, перезапускаем, тестируем сеть
node1# ssh node2
ubuntu# cat /etc/hostname
node2.corpX.un
node2# cat /etc/network/interfaces
...
address 192.168.X.2
...
node2# cat /etc/keepalived/keepalived.conf
...
# state MASTER
state BACKUP
...
node2# init 6
=== 2.3 Использование BASH алиасов и функций для удобства ===
* [[Настройка командных интерпретаторов#bash]] алиасы и функции
node1# scn2 /etc/sysctl.conf
node1# ssn2 sysctl -f
или
node1# scn2 /etc/sysctl.d/20-my-forward.conf
node1# ssn2 sysctl -p --system
=== 2.4 Синхронизация с использованием пакета CSYNC2 ===
**Сценарий:** настроить DNS на node1, на node2 конфигурация появится автоматически
* [[Финальная настройка DNS сервера]] (как это было на "ЛИН СЕРВ")
* Устанавливаем и ЗАПУСКАЕМ на двух узлаx, настраиваем на node1
node1# sh conf/dns.sh
node1# cat /etc/bind/corpX.un
$TTL 3h
@ SOA ns root.ns 1 1d 12h 1w 3h
NS ns
ns A 192.168.X.1
ns A 192.168.X.2
;node1 A 192.168.X.1
;node2 A 192.168.X.2
$GENERATE 1-9 node$ A 192.168.X.$
gate A 192.168.X.254
node1# named-checkconf -z
node1# ssn2 apt install bind9
* [[Локализация системы#Локализация временной зоны]]
* [[Пакет CSYNC2]]
node1# csync2 -xv
node1# host ns node1
node1# host ns node2
nodeN# cat /etc/resolv.conf
search corpX.un
nameserver 192.168.X.1
nameserver 192.168.X.2
nodeN# host ns
=== 2.5 Синхронизация с использованием пакета Ansible ===
**Сценарий:** на обоих узлах создаем пользователя user1 с uid=10001
**Примечание:** выполнить в 5-м модуле
* [[Сервис Ansible]]
==== Вопросы ====
- Команда ssh-copy-id копирует ...
- Где располагается файл с публичными ключами пользователей ssh?
- На каком узле будет сохранен файл в результате выполнения команды ssh node2 iptables-save > /etc/iptables.rules
- Что определяет параметр конфигурации auto younger в пакете csync2
- Перечислите известные Вам варианты тиражирования файлов конфигурации в кластере?
===== Модуль 3. Развертывание сервисов с интегрированной поддержкой отказоустойчивости =====
==== Теория ====
* [[https://www.communigate.ru/CommuniGatePro/russian/Clusters.html|Кластеры Communigate Pro]]
* man dhcpd.conf (DHCP FAILOVER)
==== Лабораторные работы ====
=== 3.1 Отказоустойчивый DHCP сервер ===
* [[Сервис DHCP#Установка]] cервиса DHCP
node2# sh conf/dhcp.sh
* [[Сервис DHCP#Отказоустойчивая конфигурация]] cервиса DHCP
* [[Сервис DHCP#Проверка конфигурации и запуск]] cервиса DHCP
* [[Сервис DHCP#Мониторинг выданных адресов]] cервиса DHCP
Примечание: в первый момент необходимо запустить оба сервера чтобы они синхронизировались.
=== 3.2 Проверка ===
* !!! Тестирование отказоустойчивости выполнить в лабораторной работе 4.2
windows> ipconfig /release
windows> ipconfig /renew
windows> ipconfig /all
windows> ping ya.ru
==== Вопросы ====
- Есть ли необходимость в использовании дополнительного ПО для реализации отказоустойчивой конфигурации пакета isc-dhcp?
- Сколько узлов может быть в отказоустойчивой конфигурации isc-dhcp?
- Какие условия необходимы на начальном этапе развертывания отказоустойчивой конфигурации isc-dhcp?
- Какие преимущества отказоустойчивой конфигурации isc-dhcp перед двумя независимыми dhcp серверами?
===== Модуль 4. Развертывание отказоустойчивого шлюза в Internet =====
==== Теория ====
* [[https://ru.wikipedia.org/wiki/VRRP|VRRP]]
* [[https://ru.wikipedia.org/wiki/CARP|CARP]]
* [[https://ru.wikipedia.org/wiki/Iproute2|Iproute2]]
==== Лабораторные работы ====
==== 4.1 Отказоустойчивый gate ====
* [[Протокол CARP]]
* [[Сервис Keepalived]]
windows> ping gate
==== 4.2 Отказоустойчивый nat ====
* Настроить NAT трансляцию для сети 192.168.X/24 в реальный адрес ISP ([[Сервис NAT]])
* После этого **преподавателю** отключить маршруты в локальные сети стендов
* !!! Либо протестировать отказоустойчивый шлюз с одним провайдером на этом этапе, либо совместить с выполнением лабораторной работы 4.3.1
==== 4.3 Балансировка нагрузки и отказоустойчивость при использовании нескольких ISP ====
* Дополнительная лабораторная работа
=== 4.3.1 Добавление сетевых карт для подключения к ISP2 ===
root@nodeN:~# cat /etc/network/interfaces
...
auto eth2
iface eth2 inet manual
up ip link set eth2 up
* [[Сервис Keepalived]] - добавляем eth2
* По очереди останавливаем узлы и добавляем Адаптер 3 - eth2 - Сетевой мост (ISP2)
nodeN# ip a | grep eth2
=== 4.3.2 Модификация настроек dns сервера ===
node1# cat /etc/bind/named.conf
...
forwarders {
172.16.1.254;
172.16.2.254;
};
...
node1# csync2 -xv
=== 4.3.3 Тестирование ISP2 ===
node1# ip a | grep 172.16.2
node1# ping 172.16.2.254
node1# ip route del default
node1# ip route add default via 172.16.2.254
node1# ping ya.ru
node1# tracepath ya.ru
node1# ip route del default
=== 4.3.4 Использование PBR для балансировки нагрузки ===
**Сценарий:**
* Настроить NAT на два ISP ([[Сервисы Gateway и routing#Использование iproute2 для управления выбором ISP]])
* PBR в "ручном" режиме ([[Сервисы Gateway и routing#NetFilter iproute2 (Linux)]])
=== 4.3.5 Автоматизация балансировки/отказоустойчивости выбора ISP ===
* [[Сервис Keepalived]] - добавляем таблицы 101 и 102
node1# ip route show table 101
node1# ip route show table 102
nodeN# cat set_isp.sh
#!/bin/sh
case $1 in
ISP1)
ip rule del from 192.168/16 to 192.168/16 table main
while ip rule del from any table 101;do true;done
while ip rule del from any table 102;do true;done
ip route delete default
ip rule add from 192.168.X.0/24 table 101
ip rule add from 192.168/16 to 192.168/16 table main
ip route add default via 172.16.1.254
/sbin/ip route flush cache
/usr/sbin/conntrack -F
;;
ISP2)
ip rule del from 192.168/16 to 192.168/16 table main
while ip rule del from any table 101;do true;done
while ip rule del from any table 102;do true;done
ip route delete default
ip rule add from 192.168.X.0/24 table 102
ip rule add from 192.168/16 to 192.168/16 table main
ip route add default via 172.16.2.254
/sbin/ip route flush cache
/usr/sbin/conntrack -F
;;
ISP1ISP2)
ip rule del from 192.168/16 to 192.168/16 table main
while ip rule del from any table 101;do true;done
while ip rule del from any table 102;do true;done
ip route delete default
ip rule add from 192.168.X.0/25 table 101
ip rule add from 192.168.X.128/25 table 102
ip rule add from 192.168/16 to 192.168/16 table main
ip route add default via 172.16.1.254
#ip route add default via 172.16.2.254
/sbin/ip route flush cache
/usr/sbin/conntrack -F
;;
esac
nodeN# chmod +x set_isp.sh
node1# /root/set_isp.sh ISP1ISP2
node1# ip rule show
node2# tracepath ya.ru
windows> tracert -d ya.ru
nodeN# cat select_isp.sh
#!/bin/sh
ip a | grep -q '192.168.*254' || exit 0
TESTIP=1.1.1.1
ISP=''
ip route del $TESTIP
ip route add $TESTIP via 172.16.1.254
ping -c3 $TESTIP && ISP=ISP1
ip route del $TESTIP
ip route add $TESTIP via 172.16.2.254
ping -c3 $TESTIP && ISP=${ISP}ISP2
ip route del $TESTIP
echo $ISP
# exit 0
touch /tmp/current_isp
test $ISP = "`cat /tmp/current_isp`" && exit 0
echo $ISP > /tmp/current_isp
/root/set_isp.sh $ISP
nodeN# chmod +x select_isp.sh
node1# /root/select_isp.sh
node1# cat /tmp/current_isp
nodeN# crontab -l
* * * * * /root/select_isp.sh >/dev/null 2>&1
master_node# ip rule show
==== Вопросы ====
- Перечислите протоколы отказоустойчивого шлюза.
- Для какой операционной системы впервые появилась реализация протокола CARP?
- Какая утилита из набора iproute2 позволяет назначить/удалить IP адрес на интерфейсе?
- В чем отличие поведения мастер хоста от других в протоколе CARP/VRRP?
- Поддерживает ли протокол CARP/VRRP отказоустойчивость соединений?
- Поддерживает ли протокол CARP/VRRP балансировку нагрузки?
- Что такое ucarp?
- В каком пакете в Debian содержатся современные сетевые утилиты, пришедшие на смену классическим UNIX утилитам ifconfig, route, arp, netstat?
- Какая утилита из набора iproute2 заменяет команду arp?
- В какой пакет входит утилита send_arp в Debian, для чего нужна и какой вид трафика использует?
- Какой командой можно очистить таблицу ARP в Linux?
- В чем принцип работы механизма PBR?
- Можно ли балансировать трафик одного соединения между двумя ISP при использовании NAT?
- Необходим ли маршрут "по умолчанию" на шлюзе для прохождения пользовательского трафика?
- Согласно какой таблице маршрутизации в Linux обрабатывается пакет, если для него нет правила, определяющего обработку в конкретной таблице?
- Что следует сделать с текущими активными соединениями после изменения правил PBR?
===== Модуль 5. Использование систем управления ресурсами кластера =====
==== Теория ====
* [[https://github.com/voxpupuli/puppet-corosync/issues/32|Corosync vs Pacemaker: wrong usage of "Corosync"]]
* [[https://stackoverflow.com/questions/22502495/which-one-is-the-official-command-line-package-of-pacemaker-crmsh-or-pcs|which one is the official command line package of pacemaker? crmsh or pcs?]]
* [[https://clusterlabs.org/pacemaker/doc/2.1/Pacemaker_Administration/html/pcs-crmsh.html|Quick Comparison of pcs and crm shell]]
* [[https://clusterlabs.org/pacemaker/doc/|ClusterLabs Pacemaker Documentation]]
==== Лабораторные работы ====
Сценарий: отказоустойчивое ftp хранилище пользовательских файлов с web доступом
* Содержимое домашних каталогов мастер сервера периодически копируется на резервный.
* В случае временной остановки или выхода из строя главного сервера автоматически становится доступным резервный.
* Не преднамеренный запуск мастер сервера не должен менять ролей серверов.
==== 5.1 Синхронизация каталогов ====
=== 5.1.1 Установка и запуск сервера Apache ===
* В зону corpX.un добавляем запись www A 192.168.X.10
node1# cat /etc/bind/corpX.un
...
www A 192.168.X.10
node1# named-checkconf -z
node1# csync2 -xv
* На обоих узлах [[Сервис HTTP#Установка и запуск сервера Apache]] (можно через Ansible)
* На обоих узлах создаем пользователя user1 с uid=10001 ([[Управление учетными записями в Linux]]) (можно через Ansible)
* На обоих узлах включаем [[Сервис HTTP#Использование домашних каталогов]] (можно через Ansible)
* Использование [[Сервис Ansible]] для автоматизации задач (финальные работы 8.1 и 8.2 выполнить утром 3-го дня)
* Устанавливаем сервер ftp на node1 и запускаем его ([[Сервис FTP#Сервер ftp]])
* Копируем любые файлы, подключаясь user1 по протоколу протокол ftp на node1
Проводник: ftp://node1
l: user1
p: password1
Каталог: public_html
В Браузере: http://node1.corpX.un/~user1
=== 5.1.2 Синхронизация пользовательских данных ===
* [[Пакет RSYNC]]
* Можно автоматизировать, ([[Планирование выполнения заданий в Linux]]), но, пока не нужно.
==== 5.2 Автоматизация смены ролей узлов кластера ====
=== 5.2.1 Установка и сервера FTP ===
* Устанавливаем ftp сервис на node2 ([[Сервис FTP#Сервер ftp]])
* На обоих узлах отключаем автоматический запуск ftp сервиса ([[Управление сервисами в Linux]])
nodeN# service proftpd stop
nodeN# update-rc.d -f proftpd remove
или
debian11# systemctl disable proftpd
=== 5.2.2 Настройка менеджера кластера ===
* [[Пакет HEARTBEAT]] (Демонстрирует преподаватель в методических целях)
* [[Пакет Corosync]]
* [[Пакет Pacemaker]]
* [[Пакет PCS]] (сделать резервную копию /etc/corosync/corosync.conf)
Проводник: ftp://www
В Браузере: http://www.corpX.un/~user1
=== 5.2.3 Автоматическая синхронизация домашних каталогов ===
* Настроить автоматическую синхронизацию домашних каталогов с мастер узла на резервный
node2# ssh-keygen
node2# ssh-copy-id node1
nodeN# crontab -l
...
* * * * * ps ax | grep -q '[p]roftpd: (accepting connections)' && /usr/bin/rsync -az --delete /home/ nodeM:/home/
==== Вопросы ====
- В чем преимущество использования rsync по сравнению с scp?
- Что определяют разделители : и :: в команде rsync?
- Реализацией какой части классического пакета heartbeat является пакет pacemaker?
- Какие задачи классического пакета heartbeat НЕ решает пакет corosync?
- В каком формате хранятся файлы конфигурации пакета corosync?
- В каком формате хранятся файлы конфигурации пакета pacemaker?
- По какой причине не следует редактировать файлы конфигурации пакета pacemaker в текстовом редакторе?
- Для чего используется утилита crm должна ли она быть установлена на все узлы кластера?
- Для чего используется утилита crm_mon и есть ли она на всех узлах кластера?
- Что надо настроить в пакете pacemaker, что бы все части, из которых состоит ресурс, запускались на одном узле кластера?
- Какой тип трафика может использоваться для связи узлов кластера corosync?
- Что нужно сделать для сервисов, управляемых менеджером кластера?
===== Модуль 6. Развертывание отказоустойчивых файловых сервисов =====
==== Теория ====
* [[https://ru.wikipedia.org/wiki/DRBD|Distributed Replicated Block Device]]
* [[https://ru.wikipedia.org/wiki/%D0%A1%D0%B5%D1%82%D1%8C_%D1%85%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85|Сеть хранения данных (англ. Storage Area Network, SAN)]]
* [[https://ru.wikipedia.org/wiki/NAS|Cервер для хранения данных (англ. Network Attached Storage, NAS)]]
==== Лабораторные работы ====
**Сценарий**: Создаем отказоустойчивый корпоративный файловый сервер. Первый узел кластера должен использоваться сервером по умолчанию.
==== 6.1 Развертывание распределенного RAID 1 =====
* Подключаем к обоим узлам по дополнительному диску
* [[Решение DRBD]]
==== 6.2 Автоматизация смены ролей узлов кластера ====
* Pacemaker [[Пакет Pacemaker#Удаление ресурсов]]
* Pacemaker [[Пакет Pacemaker#Управление конфигурацией]] (уменьшение вероятности split-brain)
* [[Решение DRBD#DRBD и Pacemaker]] (оставить приклрепление к node1)
* Можно показать на отдельном стенде [[Решение DRBD#Конфигурация с двумя primaries]]
==== 6.3 Настройка NAS сервера SMB/CIFS ====
* В зону corpX.un добавляем запись fs A 192.168.X.20
node1# cat /etc/bind/corpX.un
...
fs A 192.168.X.20
node1# named-checkconf -z
node1# csync2 -xv
* Устанавливаем на оба узла (лучше, отдельно на каждом) пакет samba ([[Файловый сервер SAMBA]])
* Отключаем автоматический запуск сервиса
root@nodeN:~#
service smbd stop
service nmbd stop
systemctl disable smbd
systemctl disable nmbd
* Настраиваем на обоих узлах [[Файловый сервер SAMBA#Публичный каталог доступный на запись]]
* Создаем каталог /disk2/samba на мастер узле
* Настраиваем менеджер кластера на монтирование на мастер узле зеркалируемого раздела в каталог /disk2, назначение ip адреса 192.168.X.20 и запуск сервера samba
node1# crm configure
crm(live)configure# primitive pr_srv_smbd systemd:smbd
crm(live)configure# primitive pr_ip_smbd ocf:heartbeat:IPaddr2 params ip=192.168.X.20 cidr_netmask=32 nic=eth0
crm(live)configure# group gr_ip_fs pr_fs_r0 pr_ip_smbd pr_srv_smbd
или
crm(live)configure# group pr_fs_r0 pr_ip_smbd pr_srv_smbd
или
crm(live)configure# edit gr_ip_fs
crm(live)configure# commit
=== Тестирование ===
slave# watch cat /proc/drbd
slave# crm_mon
* Останавливаем MASTER сервер и дожидаемся монтирования на SLAVE узле "половины" зеркалируемого раздела в каталог /disk2, назначение ip адреса 192.168.X.20 и запуск сервера samba
* Запускаем бывший MASTER узел и дожидаемся восстановления целостности зеркала
* !!! (Лучше после демонстрации SplitBrain в конце лабораторной работы 7.1.1) Останавливаем группу ресурсов кластера и [[Пакет Pacemaker#Удаление ресурсов]]
master# crm resource stop pr_srv_smbd pr_ip_smbd
master# crm configure delete pr_srv_smbd pr_ip_smbd gr_ip_fs
==== Вопросы ====
- Какое решение можно использовать для блочной синхронизации дисковых устройств по сети?
- При каком условии можно монтировать распределенное блочное хранилище на запись сразу на нескольких, содержащих его узлах?
- Что определяет параметр wfc-timeout в пакете DRBD?
- В каком состоянии будет DRBD RAID1 если узлы, входящие в него, в разное время поработали, независимо друг от друга, с разделом, в течение времени превышающем wfc-timeout?
- Чем отличаются системы NAS и SAN
- В чем фундаментальное отличие протоколов CIFS и iSCSI?
===== Модуль 7. Развертывание контейнеров в отказоустойчивой конфигурации =====
==== Теория ====
* [[https://ru.wikipedia.org/wiki/LXC|Linux Containers]]
* [[https://www.thomas-krenn.com/en/wiki/HA_Cluster_with_Linux_Containers_based_on_Heartbeat,_Pacemaker,_DRBD_and_LXC|HA Cluster with Linux Containers based on Heartbeat, Pacemaker, DRBD and LXC]]
==== Лабораторные работы ====
==== 7.1 Linux Containers в зеркалируемом разделе ====
* В зону corpX.un добавляем запись server1 A 192.168.X.31
node1# cat /etc/bind/corpX.un
...
server1 A 192.168.X.31
server2 A 192.168.X.32
@ MX 10 server1
node1# named-checkconf -z
node1# csync2 -xv
=== 7.1.1 Настройка bridge на узлах и сервисах ===
* [[Технология LXC#Подготовка сети]] для LXC на одной системе
nodeN# apt install bridge-utils
nodeN# cat /etc/network/interfaces
...
auto br0
iface br0 inet static
bridge_ports eth0
#bridge_hw 08:00:27:12:34:0N #if generate same mac on nodes (Debian11)
address 192.168.X.N
...
* [[Сервис Keepalived]] и bridge
* Сервис DHCP и bridge
nodeN# cat /etc/default/isc-dhcp-server
...
INTERFACESv4="br0"
nodeN# init 0
* Для режима bridge в lxc понадобиться включить "неразборчивый режим" первом адаптере обеих виртуальных машин
* Проверки после запуска
nodeN# ip a
node1# mount | egrep 'ext|ocfs'
nodeN# cat /proc/drbd
* Может понадобиться [[Решение DRBD#Решение ситуации Split-Brain]] или, в нашем случае [[Решение DRBD#Решение ситуации Split-Brain при использовании Pacemaker]]
=== 7.1.2 Подготовка виртуальных машин ===
* [[Технология LXC#Установка и настройка lxc]] на обоих узлах
* Готовимся все, относящееся к виртуальным системам, хранить на зеркалируемом разделе
* [[https://www.claudiokuenzler.com/blog/1206/debian-bullseye-11.3-lxc-container-static-ip-config-not-working|LXC containers with static IP in config not working anymore after Debian Bullseye 11.3 update]]
root@nodeN:~# rmdir /var/lib/lxc/
root@nodeN:~# ln -s /disk2/var/lib/lxc/ /var/lib/lxc
* Создание ветки дочерней системы/шаблона (в большой группе занимает 5 минут, попробовать настроить proxy через [[Переменные окружения]])
root@node1.corpX.un:~# mkdir -p /disk2/var/lib/lxc/
root@node1.corpX.un:~# lxc-create -t download -n server-template -- -d ubuntu -r focal -a amd64
* Установка ПО в дочерней системе/шаблоне
root@node1.corpX.un:~# chroot /var/lib/lxc/server-template/rootfs/ /bin/bash
root@node1:/# PS1='server-template:\w# '
server-template:/# apt update
server-template:/# apt purge netplan.io
server-template:/# apt install nano ssh
* !!! Методическая рекомендация - запустить процесс установки Ceph (лабораторная работа 8.3) настроив proxy через [[Переменные окружения]] и [[Сервис Ansible#Использование модулей]] Ansible
* Настраиваем hostname, hosts, DNS client и учетную запись root в гостевой системе/шаблоне
server:/# cat /etc/hostname
server-template.corpX.un
server-template:/# cat /etc/hosts
127.0.0.1 localhost
192.168.X.30 server-template.corpX.un server-template
server-template:/# cat /etc/systemd/resolved.conf
[Resolve]
DNS=192.168.X.1 192.168.X.2
server-template:/# passwd ubuntu
Ctrl-D
* Настраиваем lxc для запуска гостевой системы/шаблона в контейнере
root@node1.corpX.un:~# cat /var/lib/lxc/server-template/config
...
lxc.rootfs.path = dir:/var/lib/lxc/server-template/rootfs
lxc.uts.name = server-template
...
lxc.net.0.type = veth
lxc.net.0.link = br0
lxc.net.0.flags = up
lxc.net.0.ipv4.address = 192.168.X.30/24
lxc.net.0.ipv4.gateway = 192.168.X.254
* Создание системы из шаблона
root@node1.corpX.un:~#
SRC_CONTAINER=server-template
DST_CONTAINER=server1
SRC_IP=192.168.X.30
DST_IP=192.168.X.31
time cp -rp /var/lib/lxc/$SRC_CONTAINER/ /var/lib/lxc/$DST_CONTAINER/
find /var/lib/lxc/$DST_CONTAINER/rootfs/etc/ -type f -exec sed -i'' -e "s/$SRC_CONTAINER/$DST_CONTAINER/" -e "s/$SRC_IP/$DST_IP/" {} \;
sed -i'' -e "s/$SRC_CONTAINER/$DST_CONTAINER/" -e "s/$SRC_IP/$DST_IP/" /var/lib/lxc/$DST_CONTAINER/config
* Тестируем работу виртуальной системе на MASTER узле
root@node1.corpX.un:~# lxc-info -n server1
root@node1.corpX.un:~# systemctl start lxc@server1
root@node1.corpX.un:~# ssh ubuntu@server1
root@node1.corpX.un:~# systemctl stop lxc@server1
==== 7.2 Интеграция контейнеров с менеджером кластера ====
=== Pacemaker ===
#primitive pr_lxc_server1 systemd:lxc@server1 meta resource-stickiness=100
primitive pr_lxc_server1 systemd:lxc@server1
group gr_fs_lxc pr_fs_r0 pr_lxc_server1
==== Настройка виртуальной системы как сервер электронной почты и тестирование отказоустойчивости ====
* [[Сервис SSH#PuTTY]]
server1$ sudo -i
server1# apt install ansible git
server1# git clone http://val.bmstu.ru/unix/conf.git
server1# ansible-playbook conf/ansible/roles/mail.yml
* Roundcube http://server1.corpX.un/mail
node1# crm configure delete location cli-prefer-pr_fs_r0
node1# crm resource move gr_fs_lxc node2
==== Вопросы ====
- Что лучше, контейнерная виртуализация или аппаратная?
===== Модуль 8. Распределенное отказоустойчивое хранилище Ceph =====
- Настройка IP на node3-7, [[Сервис Ansible#Настройка групп управляемых систем]], [[Сервис Ansible#Настройка транспорта ssh]] и [[Сервис Ansible#Использование модулей]] Ansible для тестирования связи с ними
- [[Сервис Ansible#Использование ролей]] Ansible для настройки файлов конфигурации сети на node3-7
- [[Сервис Ansible#Использование модулей]] Ansible для инсталляции Ceph на node3-7 (в большой группе ставится 45 минут)
- [[Ceph - просто добавь узлов!#Шаг 2. Установка и настройка Ceph]] сразу добавить 6-й узел как OSD
- [[Сервис iSCSI#iSCSI initiator]]
- [[Сервис multipath]]
===== Модуль 9. Кластерная файловая система OCFS2 =====
* !!! Методическая рекомендация - СРАЗУ после установки пакетов для ocfs запустить процесс установки пакетов для kvm
* [[Сервис OCFS2]]
===== Модуль 10. Система виртуализации KVM =====
* Методическая рекомендация - выключить win10 clientN (конфликт имен и путаница с ip адресами)
* Проверить, включена ли [[Технология VirtualBox#Вложенная виртуализация]] в VirtualBox
* [[Технология KVM]] (в большой группе ставится 10 минут)
===== Модуль 11. Тестирование отказоустойчивости =====
- Переместить все ресурсы на node1, обесточить его и убедиться что все ресурсы (winxp1 и server1) запустились на node2 (на winxp1 может начаться проверка диска)
- Остановить node2 (рекомендуется сперва корректно остановить winxp1)
- запустить node2, убедиться что все ресурсы (winxp1 и server1) запустились (можно node1 и проверить письмо про splitbrain)
- Выяснить, через какой узел подключается [[Сервис multipath]] на node2 по iSCSI к RBD Ceph
- Выполнить для этого узла [[Ceph - просто добавь узлов!#Шаг 4. Сценарий - авария узла]]