====== Создание отказоустойчивых UNIX решений ====== ===== Программа курса ===== * [[http://www.specialist.ru/course/un5|Linux/FreeBSD. Уровень 3. Создание отказоустойчивых кластерных решений]] ===== Цель курса ===== Научиться настраивать отказоустойчивую конфигурацию сервисов Linux/FreeBSD. ===== Модуль 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.1 Настройка систем ==== * 64 бита для Docker * Адаптер 1 - Внутренняя сеть (LAN) * Адаптер 2 - Сетевой мост (ISP1) * Адаптер 3 - Сетевой мост (класс) * Адаптер 4 - Сетевой мост (ISP2) * Добавить жесткий диск 2Gb === FreeBSD/Debian/Ubuntu === [nodeN:~] # cat /etc/resolv.conf search corpX.un nameserver 10.5.6.254 [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.6.254 proxy === Debian/Ubuntu === root@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.6.N*100+X netmask 255.255.255.0 auto eth3 iface eth3 inet manual up ip link set eth3 up root@nodeN:~# cat /etc/hostname nodeN.corpX.un [nodeN:~] # cat /etc/sysctl.conf ... net.ipv4.ip_forward=1 ... [nodeN:~] # cat .bashrc ... export http_proxy=http://proxy:3128/ ... root@nodeN:~# init 6 ... root@nodeN:~# apt update === FreeBSD === [nodeN:~] # cat /etc/rc.conf.local hostname="nodeN.corpX.un" ifconfig_em0="inet 192.168.X.N/24" ifconfig_em1="up" ifconfig_em2="inet 10.5.6.N*100+X/24" ifconfig_em3="up" [nodeN:~] # cat /etc/rc.conf gateway_enable="YES" sshd_enable="YES" [nodeN:~] # cat .cshrc ... setenv HTTP_PROXY http://proxy:3128 ... [nodeN:~] # init 6 ... [nodeN:~] # pkg update -f [nodeN:~] # pkg install pkg ==== 1.2 Тестирование ==== nodeN# ping node1 nodeN# ping node2 nodeN# ping proxy ===== Модуль 2. Синхронизация файлов конфигураций узлов ===== ==== Теория ==== * [[http://habrahabr.ru/tag/csync2/|csync2 или как облегчить работу с кластером]] * [[https://ru.wikipedia.org/wiki/Ansible|Ansible]] ==== Лабораторные работы ==== ==== 2.1 С использованием сервиса SSH === * Настройка доступа по протоколу ssh пользователя root с node1 на node2 ([[Сервис SSH#Разрешение доступа пользователя root на основании адреса клиента]]) * Настройка безпарольного доступа пользователя root с node1 на node2 ([[Сервис SSH#Аутентификация с использованием ключей ssh]]) node1# ssh-keygen ... Enter passphrase (empty for no passphrase): Пароль на ключ пустой!!! ... node1# ssh-copy-id -i .ssh/id_rsa.pub node2 Проверка: node1# scp /etc/hosts node2:/etc/ ==== 2.2 С использованием пакета CSYNC2 ==== * [[Финальная настройка DNS сервера]] (устанавливаем и ЗАПУСКАЕМ на двух узлаx, настраиваем на node1) **Сценарий:** настроить DNS на node1, на node2 конфигурация появится автоматически * [[Сервис NTP]] * [[Пакет CSYNC2]] node1# csync2 -xvv nodeN# cat /etc/resolv.conf search corpX.un nameserver 192.168.X.1 nameserver 192.168.X.2 ==== 2.3 С использованием пакета Ansible ==== **Сценарий:** на обоих узлах создаем пользователя user1 с uid=10001 **Примечание:** выполнить в модуле 5-ть * [[Сервис Ansible]] ===== Модуль 3. Развертывание сервисов с интегрированной поддержкой отказоустойчивости ===== ==== Теория ==== * [[http://www.communigate.com/CommunigatePro/russian/Clusters.html|Кластеры Communigate Pro]] * man dhcpd.conf (Dhcp Failover) ==== Лабораторные работы ==== ==== 3.1 Отказоустойчивый DHCP сервер ==== * [[Сервис DHCP#Установка]] cервиса DHCP * [[Сервис DHCP#Отказоустойчивая конфигурация]] cервиса DHCP * [[Сервис DHCP#Проверка конфигурации и запуск]] cервиса DHCP * [[Сервис DHCP#Мониторинг выданных адресов]] cервиса DHCP Примечания: * В качестве шлюза указан не существующий ip адрес 192.168.X.254, он будет назначаться в следующей лабораторной работе. * В первый момент необходимо запустить оба сервера чтобы они синхронизировались. Проверка: * Добавляем в стенд Windows client1, останавливаем по очереди узлы, перезагружаем client1. Должен выдаваться один и тот же адрес (можно отключать интерфейс Windows, ipconfig /renew не использовать) Вывод сообщений об ошибках: freebsd# tail -f /var/log/messages linux# tail -f /var/log/syslog ===== Модуль 4. Развертывание отказоустойчивого шлюза в Internet ===== ==== Теория ==== * [[https://ru.wikipedia.org/wiki/CARP|CARP]] * [[https://ru.wikipedia.org/wiki/Iproute2]] ==== Лабораторные работы ==== ==== 4.1 Отказоустойчивый gate ==== * [[Протокол CARP]] C:\>ping gate ==== 4.2 Отказоустойчивый nat ==== Сценарий: * Настроить NAT трансляцию для сети 192.168.X/24 в реальный адрес ISP ([[Сервис NAT]]) * Модифицировать скрипты up и down с целью назначения/удаления реального адреса ISP на внешнем интерфейсе и указания маршрута по умолчанию через провайдера для мастер узла и через мастер узел для резервного. === Debian/Ubuntu === root@nodeN:~# apt install fake root@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 route delete default route add default gw 172.16.1.254 root@nodeN:~# cat /usr/share/ucarp/vip-down #!/bin/sh /sbin/ifdown $1:ucarp ip addr del 172.16.1.X/24 dev eth1 route delete default route add default gw 192.168.X.254 === FreeBSD === [nodeN:~] # cat /usr/local/sbin/ucarp-up #!/bin/sh /sbin/ifconfig "$1" alias "$2" netmask 255.255.255.255 /sbin/ifconfig em1 inet 172.16.1.X/24 alias /sbin/route delete default /sbin/route add default 172.16.1.254 [nodeN:~] # cat /usr/local/sbin/ucarp-down #!/bin/sh /sbin/ifconfig "$1" -alias "$2" /sbin/ifconfig em1 inet 172.16.1.X/24 -alias /sbin/route delete default /sbin/route add default 192.168.X.254 ==== 4.3 Балансировка нагрузки и отказоустойчивость при использовании нескольких ISP ==== === 4.3.1 Добавление сетевых карт для подключения к ISP2 === * eth3 isp2 bridge to nic 172.16.2/24 **FreeBSD** [nodeN:~] # cat /etc/rc.conf ... ifconfig_em3="up" ... **Debian/Ubuntu** root@nodeN:~# cat /etc/network/interfaces ... auto eth3 iface eth3 inet manual up ip link set eth3 up === 4.3.2 Модификация настроек dns сервера === # cat named.conf ... forwarders { 172.16.1.254; 172.16.2.254; }; ... === 4.3.3 Использование маршрута по умолчанию для выбора ISP === **Debian/Ubuntu** 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 ... #route add default gw 172.16.1.254 nodeN# cat /usr/share/ucarp/vip-down ... ip addr del 172.16.2.X/24 dev eth3 ... **FreeBSD** nodeN# cat /usr/local/sbin/ucarp-up ... /sbin/ifconfig em3 inet 172.16.2.X/24 alias ... #/sbin/route add default 172.16.1.254 nodeN# cat /usr/local/sbin/ucarp-down ... /sbin/ifconfig em3 inet 172.16.2.X/24 -alias ... === 4.3.4 Использование PBR для балансировки нагрузки === * PBR с использованием [[Сервисы Gateway и routing#PF (FreeBSD)]] * PBR с использованием [[Сервисы Gateway и routing#NetFilter iproute2 (Linux)]] === 4.3.5 Автоматизация балансировки/отказоустойчивости выбора ISP === **Debian/Ubuntu** 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 nodeN# cat isp1_isp2.sh #!/bin/sh ip rule del from 192.168.X/24 to 192.168.X/24 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.X/24 to 192.168.X/24 table main /sbin/ip route flush cache /usr/sbin/conntrack -F nodeN# cat isp1.sh #!/bin/sh ip rule del from 192.168.X/24 to 192.168.X/24 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.X/24 to 192.168.X/24 table main /sbin/ip route flush cache /usr/sbin/conntrack -F nodeN# cat isp2.sh #!/bin/sh ip rule del from 192.168.X/24 to 192.168.X/24 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.X/24 to 192.168.X/24 table main /sbin/ip route flush cache /usr/sbin/conntrack -F **FreeBSD** nodeN# cat /etc/pf.conf table persist table persist nat on em1 from 192.168.X/24 to any -> 172.16.1.X nat on em3 from 192.168.X/24 to any -> 172.16.2.X pass in quick on em0 from 192.168.X.0/24 to 192.168.X.0/24 pass in on em0 route-to (em1 172.16.1.254) from to any pass in on em0 route-to (em3 172.16.2.254) from to any nodeN# cat isp1_isp2.sh #!/bin/sh /sbin/pfctl -t ISP1 -T flush /sbin/pfctl -t ISP2 -T flush /sbin/pfctl -t ISP1 -T add 192.168.X.0/25 /sbin/pfctl -t ISP2 -T add 192.168.X.128/25 /sbin/pfctl -F state nodeN# cat isp1.sh #!/bin/sh /sbin/pfctl -t ISP1 -T flush /sbin/pfctl -t ISP2 -T flush /sbin/pfctl -t ISP1 -T add 192.168.X.0/24 /sbin/pfctl -F state nodeN# cat isp2.sh #!/bin/sh /sbin/pfctl -t ISP1 -T flush /sbin/pfctl -t ISP2 -T flush /sbin/pfctl -t ISP2 -T add 192.168.X.0/24 /sbin/pfctl -F state **Debian/Ubuntu/FreeBSD** nodeN# cat select_isp.sh #!/bin/sh export PATH=/bin:/sbin:/usr/bin:/usr/sbin:$PATH ifconfig | grep -q 192.168.X.254 || exit 0 route delete default route add default gw 172.16.1.254 2>/dev/null || exit 0 # route add default 172.16.1.254 2>/dev/null || exit 0 ping -c3 ya.ru >/dev/null 2>&1 ALIVE1=$? route delete default route add default gw 172.16.2.254 # route add default 172.16.2.254 ping -c3 ya.ru >/dev/null 2>&1 ALIVE2=$? route delete default test $ALIVE1 -eq 0 && conf_name="isp1.sh" test $ALIVE2 -eq 0 && conf_name="isp2.sh" test $ALIVE1 -eq 0 && test $ALIVE2 -eq 0 && conf_name="isp1_isp2.sh" # echo /root/$conf_name # exit 0 touch /tmp/conf_name test $conf_name = "`cat /tmp/conf_name`" && exit 0 echo $conf_name > /tmp/conf_name eval /root/$conf_name nodeN# crontab -l * * * * * /root/select_isp.sh >/dev/null 2>&1 **Debian/Ubuntu** nodeN# ip route show table 101 nodeN# ip route show table 102 nodeN# ip rule show **FreeBSD** nodeN# pfctl -t ISP1 -T show nodeN# pfctl -t ISP1 -T show ===== Модуль 5. Использование систем управления ресурсами кластера ===== ==== Теория ==== * [[http://blog.clusterlabs.org/blog/2010/pacemaker-heartbeat-corosync-wtf|Pacemaker, Heartbeat, Corosync, WTF?]] * [[http://www.linux-ha.org/wiki/Haresources|linux-ha Haresources]] * [[https://github.com/voxpupuli/puppet-corosync/issues/32|Corosync vs Pacemaker: wrong usage of "Corosync"]] ==== Лабораторные работы ==== Сценарий: отказоустойчивый www хостинг * Содержимое домашних каталогов мастер сервера периодически копируется на резервный. * В случае временной остановки или выхода из строя главного сервера автоматически становится доступным резервный. * Не преднамеренный запуск мастер сервера не должен менять ролей серверов. ==== 5.1 Синхронизация каталогов ==== === 5.1.1 Установка и запуск сервера Apache === * В зону corpX.un добавляем запись www A 192.168.X.10 node1# cat corpX.un ... www A 192.168.X.10 node1# csync2 -xvv * На обоих узлах [[Сервис HTTP#Установка и запуск сервера Apache]] (можно через Ansible) * На обоих узлах создаем пользователя user1 с uid=10001 ([[Управление учетными записями в Linux]], [[Управление учетными записями в FreeBSD]]) (можно через Ansible) * На обоих узлах включаем [[Сервис HTTP#Использование домашних каталогов]] (можно через Ansible) * [[Сервис Ansible]] * Yстанавливаем сервер ftp на node1 и запускаем его ([[Сервис FTP#Сервер ftp]]) * Создаем тестовую www страницу для пользователя user1 используя протокол ftp на node1 === 5.1.2 Синхронизация пользовательских данных === * [[Пакет RSYNC]] * [[Планирование выполнения заданий в Linux]], [[Планирование выполнения заданий в FreeBSD]] ==== 5.2 Автоматизация смены ролей узлов кластера ==== === 5.2.1 Установка и сервера FTP === * Устанавливаем ftp сервис на node2 ([[Сервис FTP#Сервер ftp]]) * На обоих узлах отключаем автоматический запуск ftp сервиса ([[Управление сервисами в Linux]]) nodeN# service proftpd stop nodeN# update-rc.d -f proftpd remove или nodeN# systemctl disable proftpd * Представим, что узлы соединены кросс кабелем через eth2 интерфейсы === 5.2.2 Настройка менеджера кластера === * С использованием [[Пакет HEARTBEAT]] * С использованием [[Пакет Pacemaker]] === 5.2.3 Автоматическую синхронизация домашних каталогов === * Настроить автоматическую синхронизацию домашних каталогов с мастер узла на резервный с использованием сети кросс кабеля. * Запустить rsync на node1 Указываем в файле /etc/hosts имя slave указывающее на соседний сервер node1# cat /etc/hosts ... 10.M.Z.200+X slave ... node2# cat /etc/hosts ... 10.M.Z.100+X slave ... **Ubuntu/FreeBSD** nodeN# cat /CHANGE/DIR/rsyncd.conf ... hosts allow = slave nodeN# rsync slave::home nodeN# crontab -l **FreeBSD** * * * * * ps ax | grep -v grep | grep -q 'ftpd -D' && /usr/local/bin/rsync -a /home/ slave::home **Ubuntu** * * * * * ps ax | grep -v grep | grep -q 'proftpd: (accepting connections)' && /usr/bin/rsync -a /home/ slave::home **Debian** * * * * * ps ax | grep -v grep | grep -q 'proftpd: (accepting connections)' && /usr/bin/rsync -az --delete /home/ slave:/home/ ===== Модуль 6. Развертывание отказоустойчивых файловых сервисов ===== ==== Теория ==== * [[https://ru.wikipedia.org/wiki/DRBD|Distributed Replicated Block Device]] * [[https://www.freebsd.org/doc/ru_RU.KOI8-R/books/handbook/GEOM-mirror.html|GEOM-mirror RAID1]] * [[https://wiki.freebsd.org/HAST|HAST - Highly Available Storage]] ==== Лабораторные работы ==== **Сценарий**: Создаем отказоустойчивый корпоративный файловый сервер. Первый узел кластера должен использоваться сервером по умолчанию. ==== 6.1 Синхронизация файловых систем ===== * Подключаем к обоим узлам по дополнительному диску * [[Решение DRBD]] * [[Решение HAST]] ==== 6.2 Автоматизация смены ролей узлов кластера ==== * [[Решение DRBD#DRBD и Heartbeat]] * [[Решение DRBD#DRBD и Pacemaker]] * [[Решение HAST#HAST и Heartbeat]] ==== 6.3 Настройка SAN сервера iSCSI ==== * Определяем, на каком узле смонтирован зеркалируемый раздел * Устанавливаем на оба узла пакет [[Сервис iSCSI#iSCSI target]] * Отключаем авто запуск сервиса === Debian/Ubuntu Pacemaker === * Останавливаем группу ресурсов кластера и удаляем ee [[Пакет Pacemaker#Управление ресурсами]] nodeN# systemctl disable istgt crm(live)configure# primitive pr_istgt lsb:istgt crm(live)configure# primitive pr_ip ocf:heartbeat:IPaddr2 params ip=192.168.X.15 cidr_netmask=32 nic=eth0 crm(live)configure# group gr_ip_fs pr_ip pr_fs_r0 pr_istgt crm(live)configure# commit === Ubuntu Heartbeat === nodeN# update-rc.d -f iscsitarget remove или nodeN# systemctl disable iscsitarget root@nodeN:~# service heartbeat stop root@nodeN:~# cat /etc/ha.d/haresources node2.corpX.un \ drbddisk \ Filesystem::/dev/drbd0::/disk2::ext4 \ IPaddr2::192.168.X.15/32/eth0 \ iscsiserv root@nodeN:~# cat /etc/ha.d/resource.d/iscsiserv #!/bin/sh case $1 in start) service iscsitarget start ;; stop) service iscsitarget stop ;; esac exit 0 root@nodeN:~# chmod +x /etc/ha.d/resource.d/iscsiserv root@nodeN:~# service heartbeat start === FreeBSD Heartbeat === [nodeN:~] # service heartbeat stop [nodeN:~] # cat /usr/local/etc/ha.d/haresources node2.corpX.un \ hast \ IPaddr::192.168.X.15/32 \ iscsiserv [nodeN:~] # cat /usr/local/etc/ha.d/resource.d/iscsiserv #!/bin/sh case $1 in start) sleep 10 service istgt onestart ;; stop) service istgt onestop ;; esac exit 0 [nodeN:~] # chmod +x /usr/local/etc/ha.d/resource.d/iscsiserv [nodeN:~] # service heartbeat start * Настраиваем [[Сервис iSCSI#iSCSI initiator]] для Windows 7 ==== 6.4 Настройка NAS сервера SMB/CIFS ==== * Устанавливаем на оба узла пакет samba ([[Файловый сервер SAMBA]]) * Для Debian/Ubuntu отключаем автоматический запуск сервиса 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 === Ubuntu/Debian Pacemaker === * Останавливаем группу ресурсов кластера и удаляем ее [[Пакет Pacemaker#Управление ресурсами]] crm(live)configure# primitive pr_smbd systemd:smbd crm(live)configure# edit gr_ip_fs crm(live)configure# commit === Ubuntu/Debian Heartbeat === root@nodeN:~# service heartbeat stop root@nodeN:~# cat /etc/ha.d/haresources node1.corpX.un \ drbddisk \ Filesystem::/dev/drbd0::/disk2::ext4 \ IPaddr2::192.168.X.20/32/eth0 \ smbd root@nodeN:~# service heartbeat start === FreeBSD Heartbeat === [nodeN:~] # service heartbeat stop [nodeN:~] # cat /usr/local/etc/ha.d/haresources node1.corpX.un \ hast \ IPaddr::192.168.X.20/32 \ smbserv [nodeN:~] # cat /usr/local/etc/ha.d/resource.d/smbserv #!/bin/sh case $1 in start) sleep 10 service samba_server onestart ;; stop) service samba_server onestop ;; esac exit 0 [nodeN:~] # chmod +x /usr/local/etc/ha.d/resource.d/smbserv [nodeN:~] # service heartbeat start === Тестирование === * FreeBSD master# hastctl status * Debian/Ubuntu master# cat /proc/drbd * Останавливаем MASTER сервер и дожидаемся монтирования на SLAVE узле "половины" зеркалируемого раздела в каталог /disk2, назначение ip адреса 192.168.X.20 и запуск сервера samba * Запускаем бывший MASTER узел и дожидаемся восстановления целостности зеркала ===== Модуль 7. Развертывание контейнеров в отказоустойчивой конфигурации ===== ==== Теория ==== * [[https://ru.wikipedia.org/wiki/LXC|Linux Containers]] * [[https://ru.wikipedia.org/wiki/Docker|Docker]] * [[https://ru.wikipedia.org/wiki/FreeBSD_Jail|FreeBSD Jail]] * [[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 в зеркалируемом разделе ==== === 7.1.1 Настройка bridge на узлах и сервисах === * Отключение всех сервисов (особенно, ip, привязанного к eth), кроме зеркалируемого раздела [[Пакет Pacemaker#Управление ресурсами]] node1# crm resource stop pr_ip pr_istgt pr_smbd node1# crm configure delete pr_ip pr_istgt pr_smbd gr_ip_fs * [[Технология LXC#Подготовка сети]] для LXC * Сервис CARP и bridge nodeN# cat /etc/network/interfaces ... auto br0 iface br0 inet static address 192.168.X.N netmask 255.255.255.0 ucarp-vid 1 ucarp-vip 192.168.X.254 ucarp-password secret bridge_ports eth0 iface br0:ucarp inet static address 192.168.X.254 netmask 255.255.255.255 ... * Сервис DHCP и bridge nodeN# cat /etc/default/isc-dhcp-server ... INTERFACES="br0" nodeN# init 0 * Для режима bridge в lxc понадобиться включить "неразборчивый режим" первом адаптере обеих виртуальных машин * Проверки после запуска nodeN# ps ax | grep carp nodeN# ifconfig | grep carp nodeN# ps ax | grep dh nodeN# ps ax | grep he nodeN# mount | grep ext === 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/ 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/hosts root@node1.corpX.un:~# chroot /var/lib/lxc/server/rootfs/ /bin/bash root@node1:/# PS1='server:\w# ' server:/# apt update server:/# apt purge resolvconf 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 10.Z.M.254 proxy server:/# rm /etc/resolv.conf server:/# cat /etc/resolv.conf search corpX.un nameserver 192.168.X.1 nameserver 192.168.X.2 server:/# passwd * Настраиваем lxc для запуска гостевой системы в контейнере на MASTER узле root@node1.corpX.un:~# cat /var/lib/lxc/server/config ... lxc.network.type = veth lxc.network.link = br0 lxc.network.flags = up lxc.network.ipv4 = 192.168.X.30/24 lxc.network.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 debian9_nodeN# mkdir /etc/systemd/system/lxc@server.service.d/ debian9_nodeN# cat /etc/systemd/system/lxc@server.service.d/kill_signal_fix.conf [Service] KillSignal=SIGRTMIN+3 root@node1.corpX.un:~# systemctl stop lxc@server ==== 7.2 FreeBSD Jail в зеркалируемом разделе ==== * Создаем виртуальную машину только на MASTER узле * [[Технология jail]] # mount_cd9660 /dev/cd0 /mnt # setenv D /disk2/jail/mail # mkdir -p $D # tar -xvf /mnt/usr/freebsd-dist/base.txz -C $D * Настраиваем параметры виртуальной машина на обоих узлах (без автозапуска) [nodeN:~] # cat /etc/rc.conf ... jail_list="mail" [nodeN:~] # cat /etc/jail.conf allow.raw_sockets = 1; exec.clean; exec.system_user = "root"; exec.jail_user = "root"; exec.start = "/bin/sh /etc/rc"; exec.stop = "/bin/sh /etc/rc.shutdown"; mount.devfs; allow.set_hostname = 0; allow.sysvipc = 0; mail { host.hostname = "mail.corpX.un"; path = "/disk2/jail/mail"; interface = "em0"; ip4.addr = "192.168.X.30"; exec.consolelog = "/var/log/jail_mail_console.log"; } * Тестируем виртуальную машину на MASTER узле [node1:~] # cp /root/.cshrc /disk2/jail/mail/root/ [node1:~] # cp /etc/hosts /disk2/jail/mail/etc/ [node1:~] # cp /etc/ssh/sshd_config /disk2/jail/mail/etc/ssh/ [node1:~] # service jail onestart mail [node1:~] # jls [node1:~] # jexec NN csh mail# cat /etc/resolv.conf nameserver 192.168.X.1 nameserver 192.168.X.2 mail# cat /etc/rc.conf sshd_enable=yes mail# passwd mail# ping ya.ru mail# telnet ya.ru 80 [node1:~] # service jail onestop mail ==== 7.3 Docker в зеркалируемом разделе ==== * [[Технология Docker]] nodeN# systemctl disable docker nodeN# systemctl stop docker nodeN# init 6 node1# mkdir -p /disk2/var/lib/ node1# mv /var/lib/docker/ /disk2/var/lib/ node2# rm -r /var/lib/docker nodeN# ln -s /disk2/var/lib/docker/ /var/lib/docker ==== 7.4 Интеграция контейнеров с менеджером кластера ==== === Debian/Ubuntu LXC === == HEARTBEAT == * [[HEARTBEAT plus LXC]] == Pacemaker == NEW primitive pr_lxc_server systemd:lxc@server group gr_fs_lxc pr_fs_r0 pr_lxc_server OLD primitive pr_lxc_server systemd:lxc@server primitive pr_lxc_server ocf:heartbeat:lxc params container=server config=/var/lib/lxc/server/config order or_lxc_after_fs pr_fs_r0 pr_lxc_server colocation col_lxc_on_drbd inf: pr_lxc_server ms_drbd_r0:Master !!! Похоже порядок в группе имеет значение и здесь ошибка !!! group gr_lxc_fs pr_lxc_server pr_fs_r0 crm_resource --resource pr_lxc_server --cleanup --node node45.bmstu.ru crm resource stop pr_lxc_server crm resource move pr_lxc_server node46.bmstu.ru crm resource move pr_fs_r0 node45.bmstu.ru systemctl start lxc@server /etc/init.d/lxc start server === Debian/Ubuntu Docker === * [[Технология Docker#HEARTBEAT и Docker]] === FreeBSD === * [[HEARTBEAT plus Jail]] ==== Настройка виртуальной системы как сервер электронной почты ==== * [[Сервис MTA]] * [[UA mail]] === FreeBSD === [mail:~] # cat /usr/local/etc/dovecot/dovecot.conf ... listen = 192.168.X.30 ... * [[Сервер dovecot]] ==== Дополнительные задания ==== * Настроить в виртуальной системе сервисы www и samba * В зоне corpX.un заменить записи (www A 192.168.X.30) и (samba A 192.168.X.30) * Настроить редирект tcp пакетов идущих на 25,80,110,143 порты внешнего IP адреса ISP в адрес 192.168.X.30 ([[Сервис NAT]]). Примечание: проблема возникает когда с точки зрения CARP/VRRP мастером является один хост, а с точки зрения heartbeat другой. Решение или административно исключить такую ситуацию или автоматически менять шлюз по умолчанию на вторичном с точки зрения CARP/VRRP узле через мастер (еще надо исключить ip из сети ISP на внешнем интерфейсе вторичного узла, иначе пакеты будут возвращаться в сеть ISP напрямую а не через мастер). * Настроить DNS View для внешних пользователей зоны corpX.un и запись A для mail.corpX.un и mail.corpX.un указать на адрес выданный ISP * ([[Сервис DNS]])