Кожен, кому знадобилося хоча б раз у житті перенести OpenVZ контейнер на сервер із повноцінною віртуалізацією KVM, стикався з деякими проблемами:
- Більшість інформації, банально застаріло і було актуальним для циклів ОС, які вже давно пройшли EOL
- За різними ОС завжди надається різна інформація, і ніколи не розглядаються можливі помилки під час міграції
- Іноді доводиться мати справу з конфігураціями, які не хочуть працювати після міграції.
Коли переносиш 1 сервер, завжди можна щось виправити на ходу, а коли переносиш цілий кластер?
У цій статті я спробую розповісти, як правильно мігрувати OpenVZ контейнер на KVM з мінімальним даунтаймом та швидким вирішенням усіх проблем.
Невеликий лікнеп: що таке OpenVZ і що таке KVM?
Не заглиблюватимемося в термінологію, а скажемо загалом:
OpenVZ - Віртуалізація на рівні операційної системи, розгорнути можна навіть на мікрохвильовій печі, так як немає необхідності в наявності інструкцій CPU і технологій віртуалізації на хост-машині.
KVM - Повноцінна віртуалізація, що використовує всю потужність CPU і здатна віртуалізувати будь-що, як завгодно, різати вздовж і впоперек.
Всупереч поширеній думці, що в середовищі хостинг-провайдерів OpenVZ оверселиться, а KVM немає - на щастя для останніх, KVM нині оверселиться анітрохи не гірше за свого побратима.
Що переноситимемо?
Як піддослідні для перенесення довелося використовувати весь ліс операційних систем, які доступні на OpenVZ: CentOS (6 та 7 версії), Ubuntu (14, 16 та 18 LTS), Debian 7.
Передбачалося, що на більшій частині контейнерів OpenVZ вже крутиться якийсь LAMP, а в деяких навіть є якийсь дуже специфічний софт. Найчастіше це були конфігурації з панеллю управління ISPmanager, VestaCP (і найчастіше, не оновлювані роками). Необхідно врахувати та їх запити до перенесення.
Міграція здійснюється зі збереженням IP-адреси переносного контейнера, вважатимемо що IP, який був у контейнера, зберігається на VM і працюватиме без проблем.
Перед перенесенням переконаємось, що маємо все на руках:
- Сервер OpenVZ, повний рут-доступ до хост-машини, можливість зупиняти/монтувати/запускати/видаляти контейнери
- Сервер KVM, повний рут-доступ до хост-машини, з усіма витікаючими. Передбачається, що все вже налаштовано та готове до роботи.
Приступаємо до перенесення
Перш ніж розпочати перенесення, позначимо терміни, які дозволять не заплутатися:
KVM_NODE - хост-машина KVM
VZ_NODE - хост-машина OpenVZ
CTID - Контейнер OpenVZ
VM - віртуальний сервер KVM
Підготовка до перенесення та створення віртуальних машин.
Крок 1
Оскільки нам потрібно кудись переносити контейнер, то створимо VM з аналогічною конфігурацією на KVM_NODE.
Важливо! Створювати VM потрібно саме на тій операційній системі, яка зараз обертається на CTID. Наприклад, якщо на CTID встановлена Ubuntu 14, то і на VM потрібно ставити Ubuntu 14. Мінорні версії не важливі і їх розбіжність не така критична, а ось мажорні — повинні бути однаковими.
Після створення VM, виконаємо оновлення пакетів на CTID і на VM (не плутати з оновленням ОС - її не оновлюємо, оновлюємо лише пакети і, якщо прилетить, версію ОС у межах основної версії).
Для CentOS цей процес виглядає нешкідливо:
# yum clean all
# yum update -y
І не менш нешкідливо для Ubuntu, Debian:
# apt-get update
# apt-get upgrade
Крок 2
Встановлюємо на CTID, VZ_NODE и VM утиліту rsync:
CentOS:
# yum install rsync -y
Debian, Ubuntu:
# apt-get install rsync -y
Більше нічого не встановлюємо ні там, ні там.
Крок 3
Виробляємо зупинку CTID на VZ_NODE командою
vzctl stop CTID
Монтуємо образ CTID:
vzctl mount CTID
Переходимо до папки /vz/root/CTID і виконуємо
mount --bind /dev dev && mount --bind /sys sys && mount --bind /proc proc && chroot .
Під чрутом створюємо файл /root/exclude.txt - він міститиме список винятків, які не потраплять на новий сервер
/boot
/proc
/sys
/tmp
/dev
/var/lock
/etc/fstab
/etc/mtab
/etc/resolv.conf
/etc/conf.d/net
/etc/network/interfaces
/etc/networks
/etc/sysconfig/network*
/etc/sysconfig/hwconf
/etc/sysconfig/ip6tables-config
/etc/sysconfig/kernel
/etc/hostname
/etc/HOSTNAME
/etc/hosts
/etc/modprobe*
/etc/modules
/net
/lib/modules
/etc/rc.conf
/usr/share/nova-agent*
/usr/sbin/nova-agent*
/etc/init.d/nova-agent*
/etc/ips
/etc/ipaddrpool
/etc/ips.dnsmaster
/etc/resolv.conf
/etc/sysconfig/network-scripts/ifcfg-eth0
/etc/sysconfig/network-scripts/ifcfg-ens3
Підключаємось до KVM_NODE і запускаємо наш VM, щоб він працював і був доступний через мережу.
Тепер все готове до перенесення. Поїхали!
Крок 4
Все ще перебуваючи під чрутом, виконуємо
rsync --exclude-from="/root/exclude.txt" --numeric-ids -avpogtStlHz --progress -e "ssh -T -o Compression=no -x" / root@KVM_NODE:/
Команда rsync виконає перенесення, сподіваємося, що ключі зрозумілі — перенесення здійснюється зі збереженням симлінків, прав доступу, власників та груп і відключено шифрування для більшої швидкості (можна було використовувати якийсь швидший cipher, але це не так важливо в рамках цього завдання) , також як вимкнено та стиснення.
Після завершення виконання rsync виходимо з-під chroot (натисканням ctrl+d) і виконуємо
umount dev && umount proc && umount sys && cd .. && vzctl umount CTID
Крок 5
Виконаємо кілька дій, які допоможуть нам у запуску VM після перенесення з OpenVZ.
На серверах з Systemd виконаємо команду, яка допоможе нам залогінитись у звичайній консолі, припустимо, через VNC екран сервера
mv /etc/systemd/system/getty.target.wants/[email protected] /etc/systemd/system/getty.target.wants/[email protected]
На серверах 6 CentOS и 7 CentOS обов'язково встановимо свіже ядро:
yum install kernel-$(uname -r)
Сервер може бути завантажений, але після перенесення воно може перестати працювати або буде видалено.
На сервері 7 CentOS необхідно застосувати невеликий фікс для PolkitD, інакше сервер впаде у вічний бут:
getent group polkitd >/dev/null && echo -e "e[1;32mpolkitd group already existse[0m" || { groupadd -r polkitd && echo -e "e[1;33mAdded missing polkitd groupe[0m" || echo -e "e[1;31mAdding polkitd group FAILEDe[0m"; }
getent passwd polkitd >/dev/null
&& echo -e "e[1;32mpolkitd user already existse[0m" || { useradd -r -g polkitd -d / -s /sbin/nologin -c "User for polkitd" polkitd && echo -e "e[1;33mAdded missing polkitd usere[0m" || echo -e "e[1;31mAdding polkitd user FAILEDe[0m"; }
rpm -Va polkit* && echo -e "e[1;32mpolkit* rpm verification passede[0m" || { echo -e "e[1;33mResetting polkit* rpm user/group ownership & permse[0m"; rpm --setugids polkit polkit-pkla-compat; rpm --setperms polkit polkit-pkla-compat; }
На всіх серверах, якщо було встановлено mod_fcgid для Apache, виконаємо невеликий фікс з правами, інакше сайти, які використовують mod_fcgid, будуть падати з помилкою 500:
chmod +s `which suexec` && apachectl restart
І останнє, стане в нагоді для Ubuntu, Debian дистрибутивів. Ця ОС може впасти у вічний бут із помилкою
looping too fast. throttling execution a little
неприємно, але легко фіксується залежно від версії ОС.
На Debian 9 фікс виглядає так:
виконуємо
dbus-uuidgen
якщо отримуємо помилку
/usr/local/lib/libdbus-1.so.3: version `LIBDBUS_PRIVATE_1.10.8′ not found
перевіряємо наявність LIBDBUS
ls -la /lib/x86_64-linux-gnu | grep dbus
libdbus-1.so.3 -> libdbus-1.so.3.14.15
libdbus-1.so.3.14.15 <-- нужен этот
libdbus-1.so.3.14.16
якщо все гаразд, виконуємо
cd /lib/x86_64-linux-gnu
rm -rf libdbus-1.so.3
ln -s libdbus-1.so.3.14.15 libdbus-1.so.3
Якщо не допомагає - пробуємо другий варіант.
Другий варіант вирішення проблеми з throttling execution a little підходить практично для всіх Ubuntu та Debian дистрибутивів.
виконуємо
bash -x /var/lib/dpkg/info/dbus.postinst configure
А для Ubuntu 14, Debian 7 додатково виконуємо:
adduser --system --home /nonexistent --no-create-home --disabled-password --group messagebus
rm -rf /etc/init.d/modules_dep.sh
Що ми зробили? Відновили messagebus, якого не вистачало для запуску Debian/Ubuntu та видалили modules_dep, який прийшов від OpenVZ і заважав завантаженню багатьох модулів ядра.
Крок 6
Перезавантажуємо VM, перевіряємо у VNC як іде завантаження та в ідеалі – все завантажиться без проблем. Хоча, можливо, з'являться деякі специфічні проблеми після міграції, але вони виходять за межі цієї статті і виправляються в міру появи.
Сподіваюся, ця інформація буде корисною! 🙂
Джерело: habr.com