====== Создание отказоустойчивых Linux решений ====== ===== Программа курса ===== * [[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|Вероятность безотказной работы]] ==== Лабораторные работы ==== === 1.0 Импорт VM Linux === C:\cmder\cmder.exe bash cd git clone http://val.bmstu.ru/unix/conf.git cd conf/virtualbox/ ./setup.sh X 6 === 1.1 Аппаратная настройка систем === * Адаптер 1 - eth0 - Внутренняя сеть (LAN) * Адаптер 2 - eth1 - Сетевой мост (ISP1) * Адаптер 3 - eth2 - Сетевой мост (класс) * Адаптер 4 - eth3 - Сетевой мост (ISP2) * Жесткий диск размер 4G уже добавлен === 1.2 Настройка сети систем === * Методическая рекомендация - настроить только первый узел (node1). Второй узел настроить в следующем модуле. node1# ifconfig eth2 inet 10.5.1.100+X/24 nodeN# cat /etc/hostname nodeN.corpX.un nodeN# cat /etc/hosts 127.0.0.1 localhost 192.168.X.1 node1.corpX.un node1 192.168.X.2 node2.corpX.un node2 10.5.1.254 proxy nodeN# cat /etc/resolv.conf search corpX.un nameserver 192.168.X.1 nameserver 192.168.X.2 nodeN# cat /etc/network/interfaces auto lo iface lo inet loopback auto eth0 iface eth0 inet static address 192.168.X.N netmask 255.255.255.0 auto eth1 iface eth1 inet manual up ip link set eth1 up auto eth2 iface eth2 inet static address 10.5.1.N*100+X netmask 255.255.255.0 auto eth3 iface eth3 inet manual up ip link set eth3 up nodeN# cat /etc/sysctl.conf ... net.ipv4.ip_forward=1 ... nodeN# cat .bashrc ... export http_proxy=http://proxy:3128/ ... nodeN# init 6 === 1.3 Тестирование настроек сети === nodeN# ping proxy nodeN# apt update ==== Вопросы ==== - НА кластер используется для повышения ... - НP кластер используется для повышения ... - Вероятность безотказной работы группы объектов равна ... ===== Модуль 2. Синхронизация файлов конфигураций узлов ===== ==== Теория ==== * [[https://habr.com/en/post/120702/|csync2 или как облегчить работу с кластером]] * [[https://ru.wikipedia.org/wiki/Ansible|Ansible]] ==== Лабораторные работы ==== === 2.1 С использованием сервиса 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# ssh node2 hostname scp /etc/hosts node2:/etc/ scp /etc/resolv.conf node2:/etc/ scp /etc/sysctl.conf node2:/etc/ scp .bashrc node2: scp /etc/hostname node2:/etc/ scp /etc/network/interfaces node2:/etc/network/ * Павим файлы конфигурации на node2, перезапускаем, тестируем сеть * [[Настройка командных интерпретаторов#bash]] алиасы и функции === 2.2 С использованием пакета 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# ssn2 apt update node1# ssn2 apt install bind9 * [[Локализация системы#Локализация временной зоны]] * [[Пакет CSYNC2]] node1# csync2 -xv nodeN# host ns node1 nodeN# host ns node2 === 2.3 С использованием пакета 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.0 Импорт VM Windows === === 3.1 Отказоустойчивый DHCP сервер === * [[Сервис DHCP#Установка]] cервиса DHCP nodeN# sh conf/dhcp.sh * [[Сервис DHCP#Отказоустойчивая конфигурация]] cервиса DHCP * [[Сервис DHCP#Проверка конфигурации и запуск]] cервиса DHCP * [[Сервис DHCP#Мониторинг выданных адресов]] cервиса DHCP Примечания: * В качестве шлюза указан не существующий ip адрес 192.168.X.254, он будет назначаться в следующей лабораторной работе. * В первый момент необходимо запустить оба сервера чтобы они синхронизировались. === 3.2 Проверка === * Добавляем в стенд Windows client1, останавливаем по очереди узлы, перезагружаем client1. Должен выдаваться один и тот же адрес (можно отключать интерфейс Windows или ipconfig /release ... /renew) === 3.3 Отладка === # ntpdate -u proxy # grep dhcp /var/log/syslog ==== Вопросы ==== - Есть ли необходимость в использовании дополнительного ПО для реализации отказоустойчивой конфигурации пакета isc-dhcp? - Сколько узлов может быть в отказоустойчивой конфигурации isc-dhcp? - Какие условия необходимы на начальном этапе развертывания отказоустойчивой конфигурации isc-dhcp? - Какие преимущества отказоустойчивой конфигурации isc-dhcp перед двумя независимыми dhcp серверами? ===== Модуль 4. Развертывание отказоустойчивого шлюза в Internet ===== ==== Теория ==== * [[https://ru.wikipedia.org/wiki/CARP|CARP]] * [[https://ru.wikipedia.org/wiki/Iproute2|Iproute2]] ==== Лабораторные работы ==== ==== 4.1 Отказоустойчивый gate ==== * [[Протокол CARP]] * [[Протокол VRRP]] и [[Сервис Keepalived]] C:\>ping gate ==== 4.2 Отказоустойчивый nat ==== **Сценарий**: * Настроить NAT трансляцию для сети 192.168.X/24 в реальный адрес ISP ([[Сервис NAT]]) * Модифицировать скрипты up и down с целью назначения/удаления реального адреса ISP на внешнем интерфейсе и указания маршрута по умолчанию через провайдера для мастер узла и через мастер узел для резервного. nodeN# apt install fake nodeN# cat /usr/share/ucarp/vip-up #!/bin/sh /sbin/ifup $1:ucarp ip addr add 172.16.1.X/24 dev eth1 # send_arp 172.16.1.X `cat /sys/class/net/eth1/address` 172.16.1.254 ff:ff:ff:ff:ff:ff eth1 ip route delete default ip route add default via 172.16.1.254 nodeN# cat /usr/share/ucarp/vip-down #!/bin/sh /sbin/ifdown $1:ucarp ip addr del 172.16.1.X/24 dev eth1 ip route add default via 192.168.X.254 * [[Сигналы#Отправка сигнала]] masternode# killall -USR2 ucarp или masternode# init 6 ==== 4.3 Балансировка нагрузки и отказоустойчивость при использовании нескольких ISP ==== === 4.3.1 Добавление сетевых карт для подключения к ISP2 === * eth3 isp2 bridge to nic 172.16.2/24 root@nodeN:~# cat /etc/network/interfaces ... auto eth3 iface eth3 inet manual up ip link set eth3 up === 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 === nodeN# cat /usr/share/ucarp/vip-up #!/bin/sh ... ip addr add 172.16.2.X/24 dev eth3 # send_arp 172.16.2.X `cat /sys/class/net/eth3/address` 172.16.2.254 ff:ff:ff:ff:ff:ff eth3 ... ip route delete default #ip route add default via 172.16.1.254 nodeN# cat /usr/share/ucarp/vip-down ... ip addr del 172.16.2.X/24 dev eth3 ... masternode# killall -USR2 ucarp ... masternode# grep carp /var/log/syslog masternode# ip a | grep 172.16.2 * [[Настройка сети в Linux]] masternode# ping 172.16.2.254 masternode# ip route add default via 172.16.2.254 masternode# ping ya.ru masternode# ip route delete default === 4.3.4 Использование PBR для балансировки нагрузки === **Сценарий:** * Всем настроить NAT на два ISP ([[Сервисы Gateway и routing#Использование iproute2 для управления выбором ISP]]), iptables-restore можно "привязать" к интерфейсу eth0 * Преподавателю продемонстрировать PBR в "ручном" режиме ([[Сервисы Gateway и routing#NetFilter iproute2 (Linux)]]) === 4.3.5 Автоматизация балансировки/отказоустойчивости выбора ISP === nodeN# cat /usr/share/ucarp/vip-up ... ip route add default via 172.16.1.254 table 101 ip route add default via 172.16.2.254 table 102 #### /root/select_isp.sh masternode# killall -USR2 ucarp ... masternode# grep carp /var/log/syslog masternode# ip route show table all | grep 'table 10[12]' # 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 rule add from 192.168.X.0/24 table 101 ip rule add from 192.168/16 to 192.168/16 table main /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 rule add from 192.168.X.0/24 table 102 ip rule add from 192.168/16 to 192.168/16 table main /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 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 /sbin/ip route flush cache /usr/sbin/conntrack -F ;; esac nodeN# chmod +x set_isp.sh masternode# grep carp /var/log/syslog masternode# /root/set_isp.sh ISP1ISP2 masternode# ip rule show backupnode# traceroute -n ya.ru C:\Users\student>tracert ya.ru nodeN# cat select_isp.sh #!/bin/sh ip a | grep -q '192.168.*254' || exit 0 ip route delete default ISP='' ip route add default via 172.16.1.254 ping -c3 ya.ru && ISP=ISP1 ip route delete default ip route add default via 172.16.2.254 ping -c3 ya.ru && ISP=${ISP}ISP2 ip route delete default 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 masternode# /root/select_isp.sh masternode# cat /tmp/current_isp nodeN# crontab -l * * * * * /root/select_isp.sh >/dev/null 2>&1 master_node# ip route show table 101 master_node# ip route show table 102 master_node# ip rule show ==== Вопросы ==== - Перечислите протоколы отказоустойчивого шлюза. - Для какой операционной системы впервые появилась реализация протокола CARP? - Какая утилита из набора iproute2 позволяет назначить/удалить IP адрес на интерфейсе? - В чем отличие поведения мастер хоста от других в протоколе CARP? - Поддерживает ли протокол CARP отказоустойчивость соединений? - Поддерживает ли протокол CARP балансировку нагрузки? - Что такое 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]] ==== Лабораторные работы ==== Сценарий: отказоустойчивый www хостинг или 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# csync2 -xv * На обоих узлах [[Сервис HTTP#Установка и запуск сервера Apache]] (можно через Ansible) * На обоих узлах создаем пользователя user1 с uid=10001 ([[Управление учетными записями в Linux]]) (можно через Ansible) * На обоих узлах включаем [[Сервис HTTP#Использование домашних каталогов]] (можно через Ansible) * [[Сервис Ansible]] * Устанавливаем сервер ftp на node1 и запускаем его ([[Сервис FTP#Сервер ftp]]) * Создаем тестовую www страницу для пользователя user1 используя протокол ftp на node1 Проводник: ftp://node1 l: user1 p: password1 Каталог: public_html Файл: index.html (Можно любой :) В Браузере: http://node1/~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 * Представим, что узлы соединены кросс кабелем через eth2 интерфейсы === 5.2.2 Настройка менеджера кластера === * [[Пакет HEARTBEAT]] (Демонстрирует преподаватель в методических целях) * [[Пакет Corosync]] * [[Пакет Pacemaker]] * [[Пакет PCS]] Проводник: ftp://www В Браузере: http://www.corpX.un/~user1 === 5.2.3 Автоматическая синхронизация домашних каталогов === * Настроить автоматическую синхронизацию домашних каталогов с мастер узла на резервный node2# ssh-keygen node2# ssh-copy-id node1 nodeN# crontab -l ... * * * * * ps ax | grep -v grep | grep -q 'proftpd: (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#Удаление ресурсов]] * [[Решение DRBD#DRBD и Pacemaker]] (оставить приклрепление к node1) ==== 6.3 Настройка SAN сервера iSCSI ==== * Демонстрирует преподаватель * Устанавливаем на оба узла пакет [[Сервис iSCSI#iSCSI target]] nodeN# systemctl disable istgt node1# crm configure crm(live)configure# primitive pr_srv_istgt lsb:istgt crm(live)configure# primitive pr_ip_istgt ocf:heartbeat:IPaddr2 params ip=192.168.X.15 cidr_netmask=32 nic=eth0 crm(live)configure# group gr_ip_fs pr_fs_r0 pr_ip_istgt pr_srv_istgt crm(live)configure# commit * Настраиваем [[Сервис iSCSI#iSCSI initiator]] для Windows ==== 6.4 Настройка NAS сервера SMB/CIFS ==== * В зону corpX.un добавляем запись fs A 192.168.X.20 node1# cat /etc/bind/corpX.un ... fs A 192.168.X.20 node1# csync2 -xv * Устанавливаем на оба узла (лучше, отдельно на каждом) пакет samba ([[Файловый сервер SAMBA]]) * Отключаем автоматический запуск сервиса root@nodeN:~# service smbd stop root@nodeN:~# service nmbd stop root@nodeN:~# systemctl disable smbd root@nodeN:~# systemctl disable nmbd * Настраиваем на МАСТЕР узле [[Файловый сервер SAMBA#Публичный каталог доступный на запись]] в каталоге /disk2/samba * Копируем на BACKUP узел файл конфигурации 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# edit gr_ip_fs crm(live)configure# commit === Тестирование === master# cat /proc/drbd master# crm_mon -1 * Останавливаем MASTER сервер и дожидаемся монтирования на SLAVE узле "половины" зеркалируемого раздела в каталог /disk2, назначение ip адреса 192.168.X.20 и запуск сервера samba * Запускаем бывший MASTER узел и дожидаемся восстановления целостности зеркала * !!! (Лучше после демонстрации SplitBrain) Останавливаем группу ресурсов кластера и удаляем ее [[Пакет 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 добавляем запись server A 192.168.X.30 node1# cat /etc/bind/corpX.un ... server A 192.168.X.30 @ MX 10 server node1# csync2 -xv === 7.1.1 Настройка bridge на узлах и сервисах === * [[Технология LXC#Подготовка сети]] для LXC * Сервис CARP/[[Сервис Keepalived]] и bridge 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 #Debian11 generate same mac on nodes address 192.168.X.N netmask 255.255.255.0 ... iface br0:ucarp inet static address 192.168.X.254 netmask 255.255.255.255 ... * Сервис DHCP и bridge nodeN# cat /etc/default/isc-dhcp-server ... INTERFACESv4="br0" nodeN# init 0 * Для режима bridge в lxc понадобиться включить "неразборчивый режим" первом адаптере обеих виртуальных машин * Проверки после запуска nodeN# ps ax | grep carp nodeN# ps ax | grep dhcp node1# mount | grep ext nodeN# cat /proc/drbd * Может понадобиться [[Решение DRBD#Решение ситуации Split-Brain]] node2# service pacemaker stop node2# drbdadm invalidate r0 node2# service pacemaker start === 7.1.2 Подготовка виртуальных машин === * [[Технология LXC#Установка и настройка lxc]] на обоих узлах * Готовимся все, относящееся к виртуальным системам, хранить на зеркалируемом разделе root@nodeN:~# rmdir /var/lib/lxc/ root@nodeN:~# ln -s /disk2/var/lib/lxc/ /var/lib/lxc * Создание ветки дочерней системы root@node1.corpX.un:~# mkdir -p /disk2/var/lib/lxc/ node1 debian10 # lxc-create -t debian -n server -- -r buster root@node1.corpX.un:~# lxc-create -t debian -n server * Установка ПО в дочерней системе на MASTER узле root@node1.corpX.un:~# cp /etc/ssh/sshd_config /var/lib/lxc/server/rootfs/etc/ssh/sshd_config root@node1.corpX.un:~# cp /etc/hosts /var/lib/lxc/server/rootfs/etc/ root@node1.corpX.un:~# chroot /var/lib/lxc/server/rootfs/ /bin/bash root@node1:/# PS1='server:\w# ' server:/# apt update server:/# apt purge isc-dhcp-client server:/# apt install nano vim iputils-ping * Настраиваем hostname, hosts, DNS client и учетную запись root в гостевой системе server:/# cat /etc/hostname server.corpX.un server:/# cat /etc/hosts 127.0.0.1 localhost 192.168.X.30 server.corpX.un server server:/# passwd * Настраиваем lxc для запуска гостевой системы в контейнере на MASTER узле root@node1.corpX.un:~# cat /var/lib/lxc/server/config ... 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 * Тестируем работу виртуальной системе на MASTER узле root@node1.corpX.un:~# lxc-info -n server root@node1.corpX.un:~# lxc-start -n server root@node1.corpX.un:~# lxc-info -n server root@node1.corpX.un:~# lxc-attach -n server -- ps ax root@node1.corpX.un:~# ssh server root@node1.corpX.un:~# lxc-stop -n server root@node1.corpX.un:~# systemctl start lxc@server root@node1.corpX.un:~# systemctl stop lxc@server ==== 7.2 Интеграция контейнеров с менеджером кластера ==== === Pacemaker === primitive pr_lxc_server systemd:lxc@server group gr_fs_lxc pr_fs_r0 pr_lxc_server ==== Настройка виртуальной системы как сервер электронной почты ==== server# apt install ansible git * [[Сервис Ansible]] * [[Сервис Ansible#Использование ролей]] * [[Сервис Git#Клонирование и обновление локального репозитория из сетевого]] server# ansible-playbook conf/ansible/roles/mail.yml или node1# nano conf/ansible/roles/mail.yml node1# nano /etc/ansible/hosts node1# ansible-playbook conf/ansible/roles/mail.yml ==== Тестирование отказоустойчивости ==== * [[Сервис SSH#PuTTY]] * Roundcube http://server.corpX.un/mail * [[Thunderbird]] node1# crm resource move gr_fs_lxc node2 ==== Вопросы ==== - Что лучше, контейнерная виртуализация или аппаратная? ===== Модуль 8. Распределенное отказоустойчивое хранилище Ceph ===== * [[Сервис Ansible#Использование модулей]] * [[Ceph - просто добавь узлов!#Шаг 2. Установка и настройка Ceph]] ==== Дополнительные задания ====