headermask image
1

Живая миграция OpenVZ контейнера

В этом руководстве рассказывается как выполнить живую миграцию OpenVZ контейнера с одного хоста на другой. В этой статье оба сервера OpenVZ работают под управлением Debian Lenny, но в целом миграция на других системах ничем не отличается.

Предварительные заметки

Мы будем использовать следующие системыI’m using the following systems here:

  • OpenVZ сервер 1 : server.example.com, IP адрес: 192.168.0.100
  • OpenVZ сервер 2 : server2.example.com, IP адрес: 192.168.0.101
  • виртуальная машина: vm1.example.com, IP адрес 192.168.0.102, VEID 102

Виртуальная машина запущена на сервере server1, имеет VEID 102.

Живая миграция виртуальной машины vm1.example.com с server1 на server2

Для проверки того, что миграция действительно “живая”, мы залогинимся на vm1.example.com и запустим ping на другой сервер:
vm1.example.com:

ping google.com

Пинг не должен пропасть в процессе миграции.

Спонсор статьи

Интересный и познавательный строительный блог. Свежая качественная информация о строительстве.

server1:

Живая миграция будет работать только если пользователь root с server1 может залогиниться на server2 через SSH без запроса пароля. Это можно обеспечить сгенерировать ключи для root@server1 и сохранив публичный ключи root@server1 в файл ~/.ssh/authorized_keys на сервере root@server2. К счастью, можно использовать упрощающий нам жизнь скрипт:

vi /usr/local/bin/ssh-keyput
#!/bin/bash
#
# ssh-keyput -- set up passwordless openssh login.
#
# Copyright (C) 2001, 2002, 2006 by SWsoft.
# Author: Kir Kolyshkin
#
# This script is used to put your public ssh keys to another host's
# authorized_keys[2], so you will be able to ssh login without entering
# a password. Key pairs are generated if needed, and connectivity
# is checked after putting the keys.

PROGNAME=`basename $0`

function usage()
{
    echo "Usage: $PROGNAME [user@]IP [[user@]IP ...]" 1>&2
    exit 0
}

# Check for correct number of parameters
test $# -gt 0 || usage;

SSH_KEYGEN=`which ssh-keygen`
if test $? -ne 0; then
    # Error message is printed by 'which'
    exit 1
fi

SSH_DIR=~/.ssh
if ! test -d $SSH_DIR; then
    mkdir $SSH_DIR
fi
chmod 700 $SSH_DIR

if [ ! -f $SSH_DIR/identity ] || [ ! -f $SSH_DIR/identity.pub ]; then
    echo "Generating ssh1 RSA keys - please wait..."
    rm -f $SSH_DIR/identity $SSH_DIR/identity.pub
    $SSH_KEYGEN -t rsa1 -f $SSH_DIR/identity -P ''
    if [ $? -ne 0 ]; then
        echo "Command \"$SSH_KEYGEN -t rsa1 -f $SSH_DIR/identity"
             "-P ''\" failed" 1>&2
        exit 1
    fi
else
    echo "ssh1 RSA key is present"
fi

if [ ! -f $SSH_DIR/id_dsa ] || [ ! -f $SSH_DIR/id_dsa.pub ]; then
    echo "Generating ssh2 DSA keys - please wait..."
    rm -f $SSH_DIR/id_dsa $SSH_DIR/id_dsa.pub
    $SSH_KEYGEN -t dsa -f $SSH_DIR/id_dsa -P ''
    if test $? -ne 0; then
        echo "Command \"$SSH_KEYGEN -t dsa -f $SSH_DIR/id_dsa"
             "-P ''\" failed" 1>&2
        exit 1
    fi
else
    echo "ssh2 DSA key is present"
fi

SSH1_RSA_KEY=`cat $SSH_DIR/identity.pub`
SSH2_DSA_KEY=`cat $SSH_DIR/id_dsa.pub`

for IP in $*; do
    echo "You will now be asked for password for $IP"
#    set -x
    ssh -oStrictHostKeyChecking=no $IP "mkdir -p ~/.ssh; chmod 700 ~/.ssh;
        echo \"$SSH1_RSA_KEY\" >> ~/.ssh/authorized_keys;
        echo \"$SSH2_DSA_KEY\" >> ~/.ssh/authorized_keys2;
        chmod 600 ~/.ssh/authorized_keys ~/.ssh/authorized_keys2"
#    set +x
    if test $? -eq 0; then
        echo "Keys were put successfully"
    else
        echo "Error putting keys to $IP" 1>&2
    fi
done

for IP in $*; do
    for ver in 1 2; do
        echo -n "Checking $IP connectivity by ssh$ver... "
        ssh -q -oProtocol=${ver} -oBatchMode=yes
          -oStrictHostKeyChecking=no $IP /bin/true
        if [ $? -eq 0 ]; then
            echo "OK"
        else
            echo "failed" 1>&2
        fi
    done
done

Делаем скрипт исполняемый…

chmod a+x /usr/local/bin/ssh-keyput

… И затем запускаем скрипт:

ssh-keyput 192.168.0.101
server1:~# ssh-keyput 192.168.0.101
Generating ssh1 RSA keys - please wait...
Generating public/private rsa1 key pair.
Your identification has been saved in /root/.ssh/identity.
Your public key has been saved in /root/.ssh/identity.pub.
The key fingerprint is:
5f:5b:17:0d:6b:17:9e:ae:b8:bf:87:37:d2:27:db:65 root@server1.example.com
The key's randomart image is:
+--[RSA1 2048]----+
|              .. |
|              .o+|
|              o+o|
|             ....|
|        S   . ...|
|         . ..o.. |
|          ....o E|
|            .o.Bo|
|           ..o*o+|
+-----------------+
Generating ssh2 DSA keys - please wait...
Generating public/private dsa key pair.
Your identification has been saved in /root/.ssh/id_dsa.
Your public key has been saved in /root/.ssh/id_dsa.pub.
The key fingerprint is:
29:84:d2:0f:ed:9d:25:52:6f:09:f5:5f:c3:fd:eb:26 root@server1.example.com
The key's randomart image is:
+--[ DSA 1024]----+
|        o..      |
|   . o . o o  . .|
|  . + + . = .  oo|
|   . = o *   . .o|
|      + S     . .|
|       .        .|
|               . |
|             E.. |
|              o. |
+-----------------+
You will now be asked for password for 192.168.0.101
root@192.168.0.101's password:
Keys were put successfully
Checking 192.168.0.101 connectivity by ssh1... failed
Checking 192.168.0.101 connectivity by ssh2... OK
server1:~#

Интересное

Все про отопление, системы отопления, теплый пол в ваш доме и многое другое. Рекомендую всем.

Запустим команду

vzlist -a

Вы должны увидеть единственную запущенную на данном сервере виртуальную машину:

server1:~# vzlist -a
VEID      NPROC STATUS  IP_ADDR         HOSTNAME
102          9 running 192.168.0.102   vm1.example.com
server1:~#

Можем начинать миграцию:

vzmigrate --online 192.168.0.101 102

(Используйте IP адрес или имя хоста сервера назначения после опции –online. Последним аргументом указывается VEID виртуальной машины, в нашем случае 102.)

server1:~# vzmigrate --online 192.168.0.101 102
OPT:--online
OPT:192.168.0.101
StartingPreparingInitializingSyncingLiveSyncingCleanup
server1:~#

На протяжении миграции пинг гугла в виртуальной машине не должен прерываться.

После завершения посмотрим ещё раз список виртуальных машин:

vzlist -a
server1:~# vzlist -a
VEID      NPROC STATUS  IP_ADDR         HOSTNAME
server1:~#

Как вы видите, vm1.example.com отсутствует на server1.

Проверим server2:

server2:

vzlist -a
server2:~# vzlist -a
VEID      NPROC STATUS  IP_ADDR         HOSTNAME
102          9 running 192.168.0.102   vm1.example.com
server2:~#

Как вы видите это не такой уж и сложный процесс. Успехов в тестировании.

Источник: howtoforge.com

Постовой

Хорош работать, поиграй в yetisports 3. Это намного веселей :)

Print This Post Print This Post