Każdy, kto chociaż raz w życiu musiał przenieść kontener OpenVZ na serwer z pełną wirtualizacją KVM, spotkał się z pewnymi problemami:
- Większość informacji jest po prostu nieaktualna i dotyczyła systemów operacyjnych, które już dawno przeszły cykl EOL
- Dla różnych systemów operacyjnych zawsze podawane są różne informacje i nigdy nie są brane pod uwagę możliwe błędy podczas migracji
- Czasem trzeba się zmierzyć z konfiguracjami, które co jakiś czas nie chcą działać po migracji
Kiedy przenosisz 1 serwer, zawsze możesz coś naprawić na bieżąco, ale kiedy przenosisz cały klaster?
W tym artykule postaram się powiedzieć, jak poprawnie przeprowadzić migrację kontenera OpenVZ na KVM przy minimalnym przestoju i szybkim rozwiązaniu wszystkich problemów.
Mały program edukacyjny: czym jest OpenVZ i czym jest KVM?
Nie będziemy zagłębiać się w terminologię, ale powiemy ogólnie:
OpenVZ — wirtualizację na poziomie systemu operacyjnego, można ją wdrożyć nawet na kuchence mikrofalowej, ponieważ nie ma potrzeby stosowania instrukcji procesora i technologii wirtualizacji na komputerze głównym.
KVM - pełnoprawna wirtualizacja, wykorzystująca całą moc procesora i zdolna do wirtualizacji czegokolwiek, w dowolny sposób, przecinając to wzdłuż i w poprzek.
Wbrew powszechnemu przekonaniu, że wśród dostawców hostingu OpenVZ zostanie wyprzedany, ale KVM nie - na szczęście dla tego ostatniego, KVM jest teraz wyprzedany nie gorzej niż jego brat.
Co przeniesiemy?
Jako obiekty testowe do przeniesienia musieliśmy wykorzystać cały las systemów operacyjnych dostępnych na OpenVZ: CentOS (wersje 6 i 7), Ubuntu (14, 16 i 18 LTS), Debian 7.
Założono, że większość kontenerów OpenVZ obsługuje już jakiś rodzaj LAMPY, a niektóre mają nawet bardzo specyficzne oprogramowanie. Najczęściej były to konfiguracje z ISPmanagerem, panelem kontrolnym VestaCP (i najczęściej nieaktualizowane od lat). Należy również uwzględnić ich prośby o transfer.
Migracja odbywa się z zachowaniem adresu IP przenoszonego kontenera, założymy, że adres IP, który posiadał kontener jest zapisany na maszynie wirtualnej i będzie działał bez problemów.
Przed przeprowadzką upewnijmy się, że mamy wszystko pod ręką:
- Serwer OpenVZ, pełny dostęp root do komputera hosta, możliwość zatrzymywania/montowania/uruchamiania/usuwania kontenerów
- Serwer KVM, pełny dostęp root do komputera hosta, ze wszystkim, co się z tym wiąże. Zakłada się, że wszystko jest już skonfigurowane i gotowe do pracy.
Zacznijmy przenosić
Zanim rozpoczniemy transfer, zdefiniujmy pojęcia, które pomogą Ci uniknąć nieporozumień:
KVM_NODE - Komputer hosta KVM
VZ_NODE - Komputer hosta OpenVZ
CTID - Kontener OpenVZ
VM - Serwer wirtualny KVM
Przygotowanie do migracji i tworzenie maszyn wirtualnych.
Krok 1
Ponieważ musimy gdzieś przenieść kontener, utworzymy VM z podobną konfiguracją do KVM_NODE.
Ważne! Musisz utworzyć maszynę wirtualną w systemie operacyjnym, który aktualnie działa na CTID. Na przykład, jeśli na CTID jest zainstalowany Ubuntu 14, to na maszynie wirtualnej musi być zainstalowany Ubuntu 14. Wersje poboczne nie są ważne, a ich rozbieżność nie jest tak krytyczna, ale wersje główne powinny być takie same.
Po utworzeniu VM zaktualizujemy pakiety na CTID i VM (nie mylić z aktualizacją systemu operacyjnego - nie aktualizujemy go, aktualizujemy tylko pakiety i, jeśli nadejdzie, wersję systemu operacyjnego w głównym wersja).
W przypadku CentOS proces ten wygląda nieszkodliwie:
# yum clean all
# yum update -y
I nie mniej nieszkodliwe dla Ubuntu i Debiana:
# apt-get update
# apt-get upgrade
Krok 2
Zainstaluj na CTID, VZ_NODE и VM narzędzie rsync:
CentOS:
# yum install rsync -y
Debian, Ubuntu:
# apt-get install rsync -y
Nie instalujemy niczego innego ani tam, ani tam.
Krok 3
Zatrzymujemy się CTID na VZ_NODE według zespołu
vzctl stop CTID
Montaż obrazu CTID:
vzctl mount CTID
Przejdź do folderu /vz/root/CTID i wykonać
mount --bind /dev dev && mount --bind /sys sys && mount --bind /proc proc && chroot .
W katalogu głównym utwórz plik /root/exclude.txt - będzie on zawierał listę wyjątków, które nie dotrą na nowy serwer
/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
Połącz się z KVM_NODE i uruchom nasz VMaby działało i było dostępne w sieci.
Teraz wszystko jest gotowe do przeniesienia. Iść!
Krok 4
Wciąż pod urokiem, występujemy
rsync --exclude-from="/root/exclude.txt" --numeric-ids -avpogtStlHz --progress -e "ssh -T -o Compression=no -x" / root@KVM_NODE:/
Polecenie rsync wykona transfer, mamy nadzieję, że klucze są jasne - transfer odbywa się z zachowaniem dowiązań symbolicznych, praw dostępu, właścicieli i grup, a szyfrowanie jest wyłączone w celu uzyskania większej szybkości (można użyć szybszego szyfru, ale nie jest to tak ważne dla tego zadania), a także kompresja jest wyłączona.
Po zakończeniu rsync wyjdź z chroot (naciskając ctrl+d) i wykonaj
umount dev && umount proc && umount sys && cd .. && vzctl umount CTID
Krok 5
Wykonajmy kilka kroków, które pomogą nam uruchomić maszynę wirtualną po przeniesieniu z OpenVZ.
Na serwerach z Systemd wykonajmy polecenie, które pomoże nam zalogować się do zwykłej konsoli, na przykład poprzez ekran serwera VNC
mv /etc/systemd/system/getty.target.wants/[email protected] /etc/systemd/system/getty.target.wants/[email protected]
Na serwerach 6 CentOS и 7 CentOS Pamiętaj, aby zainstalować świeże jądro:
yum install kernel-$(uname -r)
Serwer można z niego załadować, jednak po przeniesieniu może on przestać działać lub zostać usunięty.
Na serwerze 7 CentOS musisz zastosować małą poprawkę dla PolkitD, w przeciwnym razie serwer ulegnie awarii na zawsze:
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; }
Na wszystkich serwerach, jeśli zainstalowano mod_fcgid dla Apache, wykonamy małą poprawkę z uprawnieniami, w przeciwnym razie strony korzystające z mod_fcgid zawieszą się z błędem 500:
chmod +s `which suexec` && apachectl restart
I ostatnia rzecz jest przydatna w przypadku dystrybucji Ubuntu i Debian. Ten system operacyjny może spowodować awarię wiecznego rozruchu z powodu błędu
pętla jest zbyt szybka. trochę ograniczając wykonanie
nieprzyjemne, ale łatwe do naprawienia, w zależności od wersji systemu operacyjnego.
Na Debian 9 poprawka wygląda następująco:
przeprowadzamy
dbus-uuidgen
jeśli otrzymamy błąd
/usr/local/lib/libdbus-1.so.3: nie znaleziono wersji `LIBDBUS_PRIVATE_1.10.8′
sprawdź obecność 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
jeśli wszystko jest w porządku, robimy to
cd /lib/x86_64-linux-gnu
rm -rf libdbus-1.so.3
ln -s libdbus-1.so.3.14.15 libdbus-1.so.3
Jeśli to nie pomoże, wypróbuj drugą opcję.
Drugie rozwiązanie problemu z trochę ograniczając wykonanie Nadaje się do prawie wszystkich dystrybucji Ubuntu i Debian.
Wykonujemy
bash -x /var/lib/dpkg/info/dbus.postinst configure
I dla Ubuntu 14, Debian 7 Dodatkowo wykonujemy:
adduser --system --home /nonexistent --no-create-home --disabled-password --group messagebus
rm -rf /etc/init.d/modules_dep.sh
Co my zrobiliśmy? Przywróciliśmy magistralę komunikatów, której brakowało do uruchomienia Debiana/Ubuntu i usunęliśmy moduły_dep, które pochodziły z OpenVZ i zakłócały ładowanie wielu modułów jądra.
Krok 6
Ponownie uruchamiamy maszynę wirtualną, sprawdzamy w VNC, jak przebiega ładowanie i w idealnym przypadku wszystko załaduje się bez problemów. Chociaż możliwe jest, że po migracji pojawią się pewne specyficzne problemy, wykraczają one poza zakres tego artykułu i zostaną poprawione, gdy tylko się pojawią.
Mam nadzieję, że te informacje będą przydatne! 🙂
Źródło: www.habr.com