====== Создание отказоустойчивых 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. Сценарий - авария узла]]