За последние несколько лет я очень тесно работаю с кластерами Proxmox: многим клиентам требуется своя собственная инфраструктура, где они могут развивать свой проект. Именно поэтому я могу рассказать про самые распространенные ошибки и проблемы, с которыми также можете столкнуться и вы. Помимо этого мы конечно же настроим кластер из трех нод с нуля.


Proxmox кластер может состоять из двух и более серверов. Максимальное количество нод в кластере равняется 32 штукам. Наш собственный кластер будет состоять из трех нод на мультикасте (в статье я также опишу, как поднять кластер на уникасте — это важно, если вы базируете свою кластерную инфраструктуру на Hetzner или OVH, например). Коротко говоря, мультикаст позволяет осуществлять передачу данных одновременно на несколько нод. При мультикасте мы можем не задумываться о количестве нод в кластере (ориентируясь на ограничения выше).

Сам кластер строится на внутренней сети (важно, чтобы IP адреса были в одной подсети), у тех же Hetzner и OVH есть возможность объединять в кластер ноды в разных датацентрах с помощью технологии Virtual Switch (Hetzner) и vRack (OVH) — о Virtual Switch мы также поговорим в статье. Если ваш хостинг-провайдер не имеет похожие технологии в работе, то вы можете использовать OVS (Open Virtual Switch), которая нативно поддерживается Proxmox, или использовать VPN. Однако, я рекомендую в данном случае использовать именно юникаст с небольшим количеством нод — часто возникают ситуации, где кластер просто “разваливается” на основе такой сетевой инфраструктуры и его приходится восстанавливать. Поэтому я стараюсь использовать именно OVH и Hetzner в работе — подобных инцидентов наблюдал в меньшем количестве, но в первую очередь изучайте хостинг-провайдера, у которого будете размещаться: есть ли у него альтернативная технология, какие решения он предлагает, поддерживает ли мультикаст и так далее.

Установка Proxmox


Proxmox может быть установлен двумя способами: ISO-инсталлятор и установка через shell. Мы выбираем второй способ, поэтому установите Debian на сервер.

Перейдем непосредственно к установке Proxmox на каждый сервер. Установка предельно простая и описана в официальной документации здесь.

Добавим репозиторий Proxmox и ключ этого репозитория:

echo "deb http://download.proxmox.com/debian/pve stretch pve-no-subscription" > /etc/apt/sources.list.d/pve-install-repo.list
wget http://download.proxmox.com/debian/proxmox-ve-release-5.x.gpg -O /etc/apt/trusted.gpg.d/proxmox-ve-release-5.x.gpg
chmod +r /etc/apt/trusted.gpg.d/proxmox-ve-release-5.x.gpg  # optional, if you have a changed default umask

Обновляем репозитории и саму систему:

apt update && apt dist-upgrade

После успешного обновления установим необходимые пакеты Proxmox:

apt install proxmox-ve postfix open-iscsi

Заметка: во время установки будет настраиваться Postfix и grub — одна из них может завершиться с ошибкой. Возможно, это будет вызвано тем, что хостнейм не резолвится по имени. Отредактируйте hosts записи и выполните apt-get update

С этого момента мы можем авторизоваться в веб-интерфейс Proxmox по адресу https://<внешний-ip-адрес>:8006 (столкнетесь с недоверенным сертификатом во время подключения).


Изображение 1. Веб-интерфейс ноды Proxmox

Установка Nginx и Let’s Encrypt сертификата


Мне не очень нравится ситуация с сертификатом и IP адресом, поэтому я предлагаю установить Nginx и настроить Let’s Encrypt сертификат. Установку Nginx описывать не буду, оставлю лишь важные файлы для работы Let’s encrypt сертификата:

/etc/nginx/snippets/letsencrypt.conf
location ^~ /.well-known/acme-challenge/ {
  allow all;
  root /var/lib/letsencrypt/;
  default_type "text/plain";
  try_files $uri =404;
}



Команда для выпуска SSL сертификата:

certbot certonly --agree-tos --email sos@livelinux.info --webroot -w /var/lib/letsencrypt/ -d proxmox1.domain.name

Конфигурация сайта в NGINX
upstream proxmox1.domain.name  {
      server 127.0.0.1:8006;
}

server {
    listen 80;
    server_name proxmox1.domain.name;

    include snippets/letsencrypt.conf;
    return 301 https://$host$request_uri;
}


server {
    listen 443 ssl;

    server_name  proxmox1.domain.name;

    access_log  /var/log/nginx/proxmox1.domain.name.access.log;
    error_log  /var/log/nginx/proxmox1.domain.name.error.log;

    include snippets/letsencrypt.conf;

    ssl_certificate /etc/letsencrypt/live/proxmox1.domain.name/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/proxmox1.domain.name/privkey.pem;

    location / {
        proxy_pass  https://proxmox1.domain.name;
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503                                                                              http_504;
        proxy_redirect off;
        proxy_buffering off;
        proxy_set_header        Host            $host;
        proxy_set_header        X-Real-IP       $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
   
}


Не забываем после установки SSL сертификата поставить его на автообновление через cron:

0 */12 * * * /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(3600))' && certbot -q renew --renew-hook "systemctl reload nginx"

Отлично! Теперь мы можем обращаться к нашему домену по HTTPS.

Заметка: чтобы отключить информационное окно о подписке, выполните данную команду:

sed -i.bak "s/data.status !== 'Active'/false/g" /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js && systemctl restart pveproxy.service

Сетевые настройки

Перед подключением в кластер настроим сетевые интерфейсы на гипервизоре. Стоит отметить, что настройка остальных нод ничем не отличается, кроме IP адресов и названия серверов, поэтому дублировать их настройку я не буду.

Создадим сетевой мост для внутренней сети, чтобы наши виртуальные машины (в моем варианте будет LXC контейнер для удобства) во-первых, были подключены к внутренней сети гипервизора и могли взаимодействовать друг с другом. Во-вторых, чуть позже мы добавим мост для внешней сети, чтобы виртуальные машины имели свой внешний IP адрес. Соответственно, контейнеры будут на данный момент за NAT’ом у нас.

Работать с сетевой конфигурацией Proxmox можно двумя способами: через веб-интерфейс или через конфигурационный файл /etc/network/interfaces. В первом варианте вам потребуется перезагрузка сервера (или можно просто переименовать файл interfaces.new в interfaces и сделать перезапуск networking сервиса через systemd). Если вы только начинаете настройку и еще нет виртуальных машин или LXC контейнеров, то желательно перезапускать гипервизор после изменений.

Теперь создадим сетевой мост под названием vmbr1 во вкладке network в веб-панели Proxmox.


Изображение 2. Сетевые интерфейсы ноды proxmox1


Изображение 3. Создание сетевого моста


Изображение 4. Настройка сетевой конфигурации vmbr1

Настройка предельно простая — vmbr1 нам нужен для того, чтобы инстансы получали доступ в Интернет.

Теперь перезапускаем наш гипервизор и проверяем, создался ли интерфейс:


Изображение 5. Сетевой интерфейс vmbr1 в выводе команды ip a

Заметьте: у меня уже есть интерфейс ens19 — это интерфейс с внутренней сетью, на основе ее будет создан кластер.

Повторите данные этапы на остальных двух гипервизорах, после чего приступите к следующему шагу — подготовке кластера.

Также важный этап сейчас заключается во включении форвардинга пакетов — без нее инстансы не будут получать доступ к внешней сети. Открываем файл sysctl.conf и изменяем значение параметра net.ipv4.ip_forward на 1, после чего вводим следующую команду:

sysctl -p

В выводе вы должны увидеть директиву net.ipv4.ip_forward (если не меняли ее до этого)

Настройка Proxmox кластера

Теперь перейдем непосредственно к кластеру. Каждая нода должна резолвить себя и другие ноды по внутренней сети, для этого требуется изменить значения в hosts записях следующих образом (на каждой ноде должна быть запись о других):

172.30.0.15 proxmox1.livelinux.info proxmox1
172.30.0.16 proxmox2.livelinux.info proxmox2
172.30.0.17 proxmox3.livelinux.info proxmox3

Также требуется добавить публичные ключи каждой ноды к остальным — это требуется для создания кластера.

Создадим кластер через веб-панель:


Изображение 6. Создание кластера через веб-интерфейс

После создания кластера нам необходимо получить информацию о нем. Переходим в ту же вкладку кластера и нажимаем кнопку “Join Information”:


Изображение 7. Информация о созданном кластере

Данная информация пригодится нам во время присоединения второй и третьей ноды в кластер. Подключаемся к второй ноде и во вкладке Cluster нажимаем кнопку “Join Cluster”:


Изображение 8. Подключение к кластеру ноды

Разберем подробнее параметры для подключения:

  1. Peer Address: IP адрес первого сервера (к тому, к которому мы подключаемся)
  2. Password: пароль первого сервера
  3. Fingerprint: данное значение мы получаем из информации о кластере


Изображение 9. Состояние кластера после подключения второй ноды

Вторая нода успешно подключена! Однако, такое бывает не всегда. Если вы неправильно выполните шаги или возникнут сетевые проблемы, то присоединение в кластер будет провалено, а сам кластер будет “развален”. Лучшее решение — это отсоединить ноду от кластера, удалить на ней всю информацию о самом кластере, после чего сделать перезапуск сервера и проверить предыдущие шаги. Как же безопасно отключить ноду из кластера? Для начала удалим ее из кластера на первом сервере:

pvecm del proxmox2

После чего нода будет отсоединена от кластера. Теперь переходим на сломанную ноду и отключаем на ней следующие сервисы:

systemctl stop pvestatd.service
systemctl stop pvedaemon.service
systemctl stop pve-cluster.service
systemctl stop corosync
systemctl stop pve-cluster

Proxmox кластер хранит информацию о себе в sqlite базе, ее также необходимо очистить:

sqlite3 /var/lib/pve-cluster/config.db
delete from tree where name = 'corosync.conf';
.quit

Данные о коросинке успешно удалены. Удалим оставшиеся файлы, для этого необходимо запустить кластерную файловую систему в standalone режиме:

pmxcfs -l
rm /etc/pve/corosync.conf
rm /etc/corosync/*
rm /var/lib/corosync/*
rm -rf /etc/pve/nodes/*

Перезапускаем сервер (это необязательно, но перестрахуемся: все сервисы по итогу должны быть запущены и работать корректно. Чтобы ничего не упустить делаем перезапуск). После включения мы получим пустую ноду без какой-либо информации о предыдущем кластере и можем начать подключение вновь.

Установка и настройка ZFS


ZFS — это файловая система, которая может использоваться совместно с Proxmox. С помощью нее можно позволить себе репликацию данных на другой гипервизор, миграцию виртуальной машины/LXC контейнера, доступ к LXC контейнеру с хост-системы и так далее. Установка ее достаточно простая, приступим к разбору. На моих серверах доступно три SSD диска, которые мы объединим в RAID массив.

Добавляем репозитории:

nano /etc/apt/sources.list.d/stretch-backports.list

deb http://deb.debian.org/debian stretch-backports main contrib
deb-src http://deb.debian.org/debian stretch-backports main contrib

nano /etc/apt/preferences.d/90_zfs

Package: libnvpair1linux libuutil1linux libzfs2linux libzpool2linux spl-dkms zfs-dkms zfs-test zfsutils-linux zfsutils-linux-dev zfs-zed
Pin: release n=stretch-backports
Pin-Priority: 990

Обновляем список пакетов:

apt update

Устанавливаем требуемые зависимости:

 apt install --yes dpkg-dev linux-headers-$(uname -r) linux-image-amd64

Устанавливаем сам ZFS:

apt-get install zfs-dkms zfsutils-linux

Если вы в будущем получите ошибку fusermount: fuse device not found, try ‘modprobe fuse’ first, то выполните следующую команду:

modprobe fuse

Теперь приступим непосредственно к настройке. Для начала нам требуется отформатировать SSD и настроить их через parted:

Настройка /dev/sda
parted /dev/sda

(parted) print
Model: ATA SAMSUNG MZ7LM480 (scsi)
Disk /dev/sda: 480GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start   End     Size    Type     File system  Flags
 1      1049kB  4296MB  4295MB  primary               raid
 2      4296MB  4833MB  537MB   primary               raid
 3      4833MB  37,0GB  32,2GB  primary               raid

(parted) mkpart
Partition type?  primary/extended? primary
File system type?  [ext2]? zfs
Start? 33GB
End? 480GB
Warning: You requested a partition from 33,0GB to 480GB (sectors 64453125..937500000).
The closest location we can manage is 37,0GB to 480GB (sectors 72353792..937703087).
Is this still acceptable to you?
Yes/No? yes


Аналогичные действия необходимо произвести и для других дисков. После того, как все диски подготовлены, приступаем к следующему шагу:

zpool create -f -o ashift=12 rpool /dev/sda4 /dev/sdb4 /dev/sdc4

Мы выбираем ashift=12 из соображений производительности — это рекомендация самого zfsonlinux, подробнее про это можно почитать в их вики: github.com/zfsonlinux/zfs/wiki/faq#performance-considerations

Применим некоторые настройки для ZFS:

zfs set atime=off rpool
zfs set compression=lz4 rpool
zfs set dedup=off rpool
zfs set snapdir=visible rpool
zfs set primarycache=all rpool
zfs set aclinherit=passthrough rpool
zfs inherit acltype rpool
zfs get -r acltype rpool
zfs get all rpool | grep compressratio

Теперь нам надо рассчитать некоторые переменные для вычисления zfs_arc_max, я это делаю следующим образом:

mem =`free --giga | grep Mem | awk '{print $2}'`
partofmem=$(($mem/10))
echo $setzfscache > /sys/module/zfs/parameters/zfs_arc_max
grep c_max /proc/spl/kstat/zfs/arcstats

zfs create rpool/data
cat > /etc/modprobe.d/zfs.conf << EOL
options zfs zfs_arc_max=$setzfscache
EOL

echo $setzfscache > /sys/module/zfs/parameters/zfs_arc_max
grep c_max /proc/spl/kstat/zfs/arcstats

В данный момент пул успешно создан, также мы создали сабпул data. Проверить состояние вашего пула можно командой zpool status. Данное действие необходимо провести на всех гипервизорах, после чего приступить к следующему шагу.

Теперь добавим ZFS в Proxmox. Переходим в настройки датацентра (именно его, а не отдельной ноды) в раздел «Storage», кликаем на кнопку «Add» и выбираем опцию «ZFS», после чего мы увидим следующие параметры:

ID: Название стораджа. Я дал ему название local-zfs
ZFS Pool: Мы создали rpool/data, его и добавляем сюда.
Nodes: указываем все доступные ноды

Данная команда создает новый пул с выбранными нами дисками. На каждом гипервизоре должен появится новый storage под названием local-zfs, после чего вы сможете смигрировать свои виртуальные машины с локального storage на ZFS.

Репликация инстансов на соседний гипервизор


В кластере Proxmox есть возможность репликации данных с одного гипервизора на другой: данный вариант позволяет осуществлять переключение инстанса с одного сервера на другой. Данные будут актуальны на момент последней синхронизации — ее время можно выставить при создании репликации (стандартно ставится 15 минут). Существует два способа миграции инстанса на другую ноду Proxmox: ручной и автоматический. Давайте рассмотрим в первую очередь ручной вариант, а в конце я предоставлю вам Python скрипт, который позволит создавать виртуальную машину на доступном гипервизоре при недоступности одного из гипервизоров.

Для создания репликации необходимо перейти в веб-панель Proxmox и создать виртуальную машину или LXC контейнер. В предыдущих пунктах мы с вами настроили vmbr1 мост с NAT, что позволит нам выходить во внешнюю сеть. Я создам LXC контейнер с MySQL, Nginx и PHP-FPM с тестовым сайтом, чтобы проверить работу репликации. Ниже будет пошаговая инструкция.

Загружаем подходящий темплейт (переходим в storage —> Content —> Templates), пример на скриншоте:


Изображение 10. Local storage с шаблонами и образами ВМ

Нажимаем кнопку “Templates” и загружаем необходимый нам шаблон LXC контейнера:


Изображение 11. Выбор и загрузка шаблона

Теперь мы можем использовать его при создании новых LXC контейнеров. Выбираем первый гипервизор и нажимаем кнопку “Create CT” в правом верхнем углу: мы увидим панель создания нового инстанса. Этапы установки достаточно просты и я приведу лишь конфигурационный файл данного LXC контейнера:

arch: amd64
cores: 3
memory: 2048
nameserver: 8.8.8.8
net0: name=eth0,bridge=vmbr1,firewall=1,gw=172.16.0.1,hwaddr=D6:60:C5:39:98:A0,ip=172.16.0.2/24,type=veth
ostype: centos
rootfs: local:100/vm-100-disk-1.raw,size=10G
swap: 512
unprivileged: 

Контейнер успешно создан. К LXC контейнерам можно подключаться через команду pct enter , я также перед установкой добавил SSH ключ гипервизора, чтобы подключаться напрямую через SSH (в PCT есть небольшие проблемы с отображением терминала). Я подготовил сервер и установил туда все необходимые серверные приложения, теперь можно перейти к созданию репликации.

Кликаем на LXC контейнер и переходим во вкладку “Replication”, где создаем параметр репликации с помощью кнопки “Add”:


Изображение 12. Создание репликации в интерфейсе Proxmox


Изображение 13. Окно создания Replication job

Я создал задачу реплицировать контейнер на вторую ноду, как видно на следующем скриншоте репликация прошла успешно — обращайте внимание на поле “Status”, она оповещает о статусе репликации, также стоит обращать внимание на поле “Duration”, чтобы знать, сколько длится репликация данных.


Изображение 14. Список синхронизаций ВМ

Теперь попробуем смигрировать машину на вторую ноду с помощью кнопки “Migrate”

Начнется миграция контейнера, лог можно просмотреть в списке задач — там будет наша миграция. После этого контейнер будет перемещен на вторую ноду.

Ошибка “Host Key Verification Failed”

Иногда при настройке кластера может возникать подобная проблема — она мешает мигрировать машины и создавать репликацию, что нивелирует преимущества кластерных решений. Для исправления этой ошибки удалите файл known_hosts и подключитесь по SSH к конфликтной ноде:

/usr/bin/ssh -o 'HostKeyAlias=proxmox2' root@172.30.0.16

Примите Hostkey и попробуйте ввести эту команду, она должна подключить вас к серверу:

/usr/bin/ssh -o 'BatchMode=yes' -o 'HostKeyAlias=proxmox2' root@172.30.0.16

Особенности сетевых настроек на Hetzner


Переходим в панель Robot и нажимаем на кнопку “Virtual Switches”. На следующей странице вы увидите панель создания и управления интерфейсов Virtual Switch: для начала его необходимо создать, а после “подключить” выделенные сервера к нему. В поиске добавляем необходимые сервера для подключения — их не не нужно перезагружать, только придется подождать до 10-15 минут, когда подключение к Virtual Switch будет активно.

После добавления серверов в Virtual Switch через веб-панель подключаемся к серверам и открываем конфигурационные файлы сетевых интерфейсов, где создаем новый сетевой интерфейс:

auto enp4s0.4000
iface enp4s0.4000 inet static
        address  10.1.0.11/24
        mtu 1400
        vlan-raw-device enp4s0

Давайте разберем подробнее, что это такое. По своей сути — это VLAN, который подключается к единственному физическому интерфейсу под названием enp4s0 (он у вас может отличаться), с указанием номера VLAN — это номер Virtual Switch’a, который вы создавали в веб-панели Hetzner Robot. Адрес можете указать любой, главное, чтобы он был локальный.

Отмечу, что конфигурировать enp4s0 следует как обычно, по сути он должен содержать внешний IP адрес, который был выдан вашему физическому серверу. Повторите данные шаги на других гипервизорах, после чего перезагрузите на них networking сервис, сделайте пинг до соседней ноды по IP адресу Virtual Switch. Если пинг прошел успешно, то вы успешно установили соединение между серверами по Virtual Switch.

Я также приложу конфигурационный файл sysctl.conf, он понадобится, если у вас будут проблемы с форвардингом пакетом и прочими сетевыми параметрами:

net.ipv6.conf.all.disable_ipv6=0
net.ipv6.conf.default.disable_ipv6 = 0
net.ipv6.conf.all.forwarding=1
net.ipv4.conf.all.rp_filter=1
net.ipv4.tcp_syncookies=1
net.ipv4.ip_forward=1
net.ipv4.conf.all.send_redirects=0

Добавление IPv4 подсети в Hetzner

Перед началом работ вам необходимо заказать подсеть в Hetzner, сделать это можно через панель Robot.

Создадим сетевой мост с адресом, который будет из этой подсети. Пример конфигурации:

auto vmbr2
iface vmbr2 inet static
        address ip-address
        netmask 29
        bridge-ports none
        bridge-stp off
        bridge-fd 0

Теперь переходим в настройки виртуальной машины в Proxmox и создаем новый сетевой интерфейс, который будет прикреплен к мосту vmbr2. Я использую LXC контейнер, его конфигурацию можно изменять сразу же в Proxmox. Итоговая конфигурация для Debian:

auto eth0
iface eth0 inet static
        address ip-address
        netmask 26
        gateway bridge-address

Обратите внимание: я указал 26 маску, а не 29 — это требуется для того, чтобы сеть на виртуальной машине работала.

Добавление IPv4 адреса в Hetzner

Ситуация с одиночным IP адресом отличается — обычно Hetzner дает нам дополнительный адрес из подсети сервера. Это означает, что вместо vmbr2 нам требуется использоваться vmbr0, но на данный момент его у нас нет. Суть в том, что vmbr0 должен содержать IP адрес железного сервера (то есть использовать тот адрес, который использовал физический сетевой интерфейс enp2s0). Адрес необходимо переместить на vmbr0, для этого подойдет следующая конфигурация (советую заказать KVM, чтобы в случае чего возобновить работу сети):

auto enp2s0
iface enp2s0 inet manual

auto vmbr0
iface vmbr0 inet static
        address  ip-address
        netmask  255.255.255.192
        gateway  ip-gateway
        bridge-ports enp2s0
        bridge-stp off
        bridge-fd 0

Перезапустите сервер, если это возможно (если нет, перезапустите сервис networking), после чего проверьте сетевые интерфейсы через ip a:

2: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master vmbr0 state UP group default qlen 1000
    link/ether 44:8a:5b:2c:30:c2 brd ff:ff:ff:ff:ff:ff

Как здесь видно, enp2s0 подключен к vmbr0 и не имеет IP адрес, так как он был переназначен на vmbr0.

Теперь в настройках виртуальной машины добавляем сетевой интерфейс, который будет подключен к vmbr0. В качестве gateway укажите адрес, прикрепленный к vmbr0.

В завершении


Надеюсь, что данная статья пригодится вам, когда вы будете настраивать Proxmox кластер в Hetzner. Если позволит время, то я расширю статью и добавлю инструкцию для OVH — там тоже не все очевидно, как кажется на первый взгляд. Материал получился достаточно объемным, если найдете ошибки, то, пожалуйста, напишите в комментарии, я их исправлю. Всем спасибо за уделенное внимание.

Автор: Илья Андреев, под редакцией Алексея Жадан и команды «Лайв Линукс»

Комментарии (34)


  1. Softer
    27.06.2019 13:52

    Спасибо за статью. Пара вопросов:
    — Почему Linux Bridge, а не OVS?
    — Неотключение (ненастройка) IPv6 — подразумевает некий смысл или опущено ради упрощения?
    — Что бы Вы посоветовали в плане storage если в качестве хранилки выступает обычный Linux-сервер (в принципе можно не-Linux, тут вопрос в бюджетности) с пачкой винтов? ZFS over ISCSI?


    1. SyCraft Автор
      27.06.2019 15:27

      — Почему Linux Bridge, а не OVS?

      Не нашел для себя каких то очевидных бенефитов.

      — Неотключение (ненастройка) IPv6 — подразумевает некий смысл или опущено ради упрощения?

      Есть проекты где живем с IPv6 но тут просто для упрощения материала.

      — Что бы Вы посоветовали в плане storage если в качестве хранилки выступает обычный Linux-сервер (в принципе можно не-Linux, тут вопрос в бюджетности) с пачкой винтов? ZFS over ISCSI?

      я за ZFS, но за локальный. Никакие сетевые решения рекомендовать не могу.


      1. denaspireone
        27.06.2019 16:52

        Приведите конфиг настройки ipv6 для proxmox и гостевых машин, в кластере и без


      1. vasilisc
        27.06.2019 18:52

        >Не нашел для себя каких то очевидных бенефитов.
        А я себе нашёл!

        Using Open vSwitch in Proxmox
        Using Open vSwitch isn't that much different than using normal linux bridges. The main difference is instead of having a bridge per vlan, you have a single bridge containing all your vlans. Then when configuring the network interface for the VM, you would select the bridge (probably the only bridge you have), and you would also enter the VLAN Tag associated with the VLAN you want your VM to be a part of. Now there is zero effort when adding or removing VLANs!

        pve.proxmox.com/wiki/Open_vSwitch#Using_Open_vSwitch_in_Proxmox

        У меня 1 мост и влан указываю в виде цифры в свойствах сетевой карты.

        Почему не используете ISO от Proxmox проекта? Имхо, из-за этого статья выглядит слишком сложной и пугающей.


        1. Naves
          27.06.2019 20:39

          У меня 1 мост и влан указываю в виде цифры в свойствах сетевой карты.

          Так простой бридж без OVS именно так и работает.
          PS использую proxmox кластер из 2-х нод (да-да) с общим хранилищем iSCSI multipath 10G. Можете задавать свои вопросы.


          1. NoOne
            28.06.2019 06:48

            Задаю. Какая файловая система используется?


            1. Naves
              28.06.2019 08:37

              Эээ, где? Кластерной файловой системы в данном случае нет.
              Хранилка отдаёт LUN, proxmox этот диск использует как LVM volume group. Образ каждого диска виртуалок это отдельный lvm volume.
              Ничего не мешает создать отдельный volume на общем хранилище, примонтировать его на одной ноде кластере, раздать на другие ноды через NFS, но это имеет смысл только для простых файлов типа iso или бэкапов, тк весь обмен с этим разделом будет через один узел.


              1. NoOne
                28.06.2019 09:08

                Упал сервер, например. Вы руками переподключаете LUN к другому серверу, поднимаете виртуалки?


                1. Naves
                  28.06.2019 09:49

                  LUN и LVM раздел общий, подключены к узлам одновременно, структура раздела синхронизируется самим проксмоксом.
                  На одном луне может быть, например, 10 образов, пять запущены на одном узле, другие на другом, мигрировать можно как онлайн, так и офлайн.
                  Виртуалки в случае падения должны перезапускаться сами при включении отдельного HA, по умолчанию выключен.


                  1. NoOne
                    28.06.2019 12:01

                    Понятно, это тогда получается виртуалки лежат в сыром виде на CLVM (Clustered LVM) без файловой системы?

                    И получается, в таком случае нет возможности делать снепшоты?

                    А как делаете бекапы?

                    (спасибо за ответы :))


                    1. Naves
                      28.06.2019 12:14

                      да, CLVM
                      Снапшотов нет, это печально. Но и про LVM-снапшоты на простом локальном разделе тоже говорят, что все плохо. В итоге остается или локальное хранилище с qcow-образами, или ceph, или NFS/SMB-хранилище.
                      Для винды бэкапы через гостевой veam agent. С ним правда есть свои косяки, вида влияния на установленными в системах SQL-сервера.
                      Для linux, как всегда зоопарк, от штатных full-бэкапов проксмокса до скриптов внутри системы, хотя можно тоже использовать veam для единообразия.


                      1. NoOne
                        28.06.2019 13:09

                        Спасибо за ответы.

                        Избалованные VMware, ищем какие-нибудь другие варианты, и как-то пока… не густо.

                        GFS2 не смотрели?


                        1. Naves
                          28.06.2019 13:46

                          Читал, но решил, что внедрять опасно, ибо обслуживать потом эту экзотику будет некому.
                          В принципе могу попробовать протестировать с разделом на пару терабайт. Только с методикой нужно определиться.


          1. vasilisc
            28.06.2019 06:53

            а если у вас несколько VLAN? Разве вы не вынуждены использовать отдельные мосты под каждый VLAN (bridge per vlan)?

            Просто мне требовалось обеспечить создание ВМ в различных подсетях. Для этого нужно было принять транковое соединение от сетевого оборудования и создать мост с лёгкой поддержкой VLAN. Нужно было учесть что VM может переезжать с ноды на ноду в онлайн и такая сетевая конфигурация должна быть у всех нод кластера. Выбрал OVS из-за single bridge containing all your vlans


            1. Naves
              28.06.2019 08:23

              От свича к серверу идёт транк с тегированным трафиком. В гипервизоре настроен просто бридж. Виртуалки видят уже трафик своей сети.
              Если у вас несколько серверов, соответственно настраиваются нужные порты на свиче.


  1. mmad11
    27.06.2019 15:22

    Производилось ли нагрузочное тестирование zfs? Еще год-два назад при повышении нагрузки на диски, iowait повышался в разы сильнее, чем на обычном ext4


    1. SyCraft Автор
      27.06.2019 15:23

      Такое делал habr.com/ru/post/344204
      В целом, под нагрузкой zfs показывает себя прекрасно. Я очень доволен. Разумеется он существенно медленее чем ext4 но дает целый ряд других плюсов.


  1. xXxSPYxXx
    27.06.2019 21:13

    Зачем устанавливать Nginx, когда Proxmox умеет из коробки генерировать Lets Encrypt сертификат. Совет лишний и я бы даже сказал вредный.
    Без настроек IPv6 с примером тех же Hetzner/OVH статья еще меньше имеет смысл. Так же нет примера с DHCP.
    Про Vlan-ы датацентров для новичков — это в плюс.
    Про ZFS ничего не скажу, так как с ним не работал.


    1. Roman2dot0
      28.06.2019 09:46

      Почему же вредный? Я бы сказал "не полный", потому что в данном случае порт 8006 торчит наружу. Лично я ставил nginx и закрывал внешний доступ для всех портов веб интерфейса proxmox. По итогу только только 80 и 443 открыты снаружи


      1. xXxSPYxXx
        28.06.2019 10:35

        зачем?


        1. Roman2dot0
          29.06.2019 00:39

          "секурно"


    1. savostin
      30.06.2019 22:15

      А не подскажите что можно подкрутить, чтобы Proxmox сам обновлял сертификат, если на той же машине поднят Nginx (для своих целей, но на 80/443 порту). А то он пытается поднять свой вебсервер для проверки и естественно обламывается.


      1. xXxSPYxXx
        30.06.2019 23:37

        Установить acme.sh, генерировать сертификат через webroot или DNS API. После генерации сертификата, нужно его установить через команду:

        acme.sh --install-cert --ecc -d example.com --key-file /etc/pve/local/pveproxy-ssl.key --fullchain-file /etc/pve/local/pveproxy-ssl.pem --reloadcmd "service pveproxy restart"


        1. savostin
          01.07.2019 00:26

          Это понятно, я спрашивал как этого достичь средствами Proxmox.
          Нашел только здесь, пока не разобрался как сделать override systemd.
          Имхо достаточно или указать не 80-ый порт для поднятия сервера Acme, или на время обновления уложить Ngnix. Хотелось бы, чтобы это делалось автоматически.


          1. xXxSPYxXx
            01.07.2019 11:13

            А какая разница, будет это прописано в кроне pve или в кроне юзера root?


            1. savostin
              01.07.2019 11:32

              Как видно по ссылке, acme update запускается не в кроне, а через systemd. Порт, как я понял, поменять нельзя «из соображений безопасности» (хоть и спорный вопрос). Он наглухо прошит в PVE::API2::ACME::StandAlone.pm
              Как вариант костыля можно закомемнтировать поднятие сервера и использовать работающий Nginx. Меня лично бы устроил запуск «service nginx stop» -> acme update -> «service nginx start». Вот как бы обернуть этот update этой парой команд?


              1. xXxSPYxXx
                01.07.2019 12:24

                Вы меня наверное не поняли. Отключаете acme, который дает проксмокс и делаете как я отписал.


  1. Akkarine
    28.06.2019 10:01

    Добрый день. Спасибо за статью! Вопросы:


    • почему установка не с помощью ISO-образа, а на готовый Debian?
    • На какую конфигурацию хранилища устанавливаете ОС-хост? Сам Proxmox рекомендует использовать hardware RAID (но только поддерживаемый). Есть статьи, в которых для подобных систем (FreeNAS на ZFS) вообще рекомендуют устанавливать на рейд из внешних SSD (или того хуже, USB-стики).
    • У меня сейчас Proxmox работает на одном диске в ext4, думаю на рейд перебраться — интересны лучшие практики по железу. Если для основного файлового хранилища уже есть hardware RAID (PREC H330 и MegaRAID SAS 9341-4i), стоит ли его выдергивать и использовать ZFS RAID 10? Оперативки хватает.


  1. Lankme
    29.06.2019 10:37

    Давайте чуть улучшим статью:
    — Собираетесь ставить Proxmox на ZFS? Тогда выносите /boot отдельно на ext2/ext4 (поэтому например ставить нужно не с помощью ISO образа) а причина вот в чём: иногда после обновления ядра, либо загрузчика система при загрузке не видит «root zfs pool» и не хочет загружатся. С использованием hardware RAID вероятность возрастает. Ошибка встречается очень редко, но выловить её до сих пор не могут. У меня за 2 года из 5 серверов 2 так легло после перезагрузки. Лечилось очень просто: загрузочная USB флешка с ядром.
    — ZFS очень любит много память, не не так: он ЖРЁТ память. Планируйте что 1/3 доступной памяти скушает ZFS. Серверам с 32ГБ памяти и ZFS можно только сочувствовать. При нехватке памяти могут происходить весьма забавные вещи: фризы, перезагрузки, непонятные тормоза.
    — Вот случился у вас факап: бэкап там замер или просто там kernel panic какой нибудь — виртуалку не влючить, не выключть, не забэкапить. Кто виноват и что делать? qm unlock [vm_id] если kvm и pct unlock [vm_id] если контейнер помогут разблокировать машину. Будте готовы к тому, что после таких чудес сервер может зависнуть при перезагрузке. В таком случае поможет помочь только резет
    — любителям бесплатных обновлений без подписки (pve-no-subscription) не забываем, версия для тестирования, не для продакшена: может прилететь ядро без драйверов на сетевые карты (было уже один раз такое) или например с кривыми дровами не поддерживающими MTU более 1500 (тоже было) в обоих случаях сервер просто не видел сеть. Без KVM решать такие проблемы ещё то удовольствие.
    — ZFS она такая хорошая: снапшоты там, быстрая миграция, но всё неспеша. Если у вас больше 2х серверов, то может имеет смысл посмотреть в сторону CEPH. Если собирать не требовательный кластер из барахла, например 3 сервака ( с 32 Гб памяти на борту, 2 сетевых 1 ГБ карты и разных дисков), то CEPH будет отличной альтернативой с бонусом в виде живой миграции и возможностью использовать полудохлые диски. По скорости примерно выйдет 100-150 Мб в сек чтение/записть. Хотя тут тоже есть нюансы…
    — там всякие мелочи вроде размеров ZFS ARC, KSM sharing для серверов с малым количеством памяти, отправки уведомлений по элкетронке с использованием внешних серверов через postfix, установки pigz или прописывания путей для временных файлов для бэкапов или в конце концов установки кластера из двух серверов с тотемом тоже можно было бы рассказать


  1. yuriybz
    29.06.2019 10:37

    Подскажите для чего вы заказываете отдельную подсеть у hetzner?


  1. Akkarine
    29.06.2019 11:12

    Заметка: во время установки будет настраиваться Postfix и grub — одна из них может завершиться с ошибкой. Возможно, это будет вызвано тем, что хостнейм не резолвится по имени. Отредактируйте hosts записи и выполните apt-get update

    По официальному руководству это даже требуется сделать.


  1. werter78
    30.06.2019 15:21

    Всем привет )

    1. Proxmox VE умеет ZFS «из-коробки» уж пару лет как. Сразу. Без танцев. Прямо в установщике.
    2. Только OVS. Попробуйте на linux bridge VLAN «на лету» без перезагрузки ВМ на интерфейсе поменять\добавить.
    3. ZFS любит ОЗУ. Она же copy-on-write и ARC cache в ней хранит (l2arch cache нужно хранить на SSD\NVM).
    Настраивать ZLOG, к-ый хранит лог транзакций, как я понял, настраивать рекомендуют только(?) для NAS. В случае с PVE я его не пользую (ups везде имеются).
    ZFS единственная из ФС (BTRFS?), к-ая проверяет CRC записываемых данных. Но преувеличивать ее аппетиты по ОЗУ не стоит. У меня есть десяток PVE в филиалах c 8ГБ ОЗУ (бюджет-с) с 2-4 ВМ на каждом. Вполне приемлемо.
    Мало кто еще и zswap пользует с lz4\zstd-сжатием. Оч хорошая штука. Настройте и будет немного счастья.
    4. Везде, где пользуют ZFS КРАЙНЕ НЕ РЕКОМЕНДУЮТ HW RAID — только raid средствами самой ZFS. Напомню, что для спокойного сна требуется иметь ЗИП в виде такого же HW RAID или мат. платы с HW RAID. Иначе можно сильно погореть при выходе из строя ЕДИНСТВЕННОГО HW RAID (отдельного или распаянного на
    мат. плате). Особенно, если вы живете вдали от столиц.

    Все это и многое другое описано в моей небольшой вики по Proxmox, ZFS, pfsense etc — forum.netgate.com/topic/120102/proxmox-ceph-zfs-pfsense/
    Периодически обновляю. Пользуйте )


    1. Naves
      30.06.2019 20:05

      2) странно, неоднократно менял, проблем не было.
      Но с магией на сетевой карте в самом гипервизоре встречался habr.com/en/post/418049/#comment_18938995


  1. werter78
    30.06.2019 18:16

    Upd1.
    5. Почитайте про VDO от RH. Крайне «приятно» для дедупликации\deduplication
    forum.proxmox.com/threads/virtual-data-optimizer-vdo.42838/
    www.marksei.com/vdo-linux-deduplication
    blog.delouw.ch/2018/12/17/using-data-deduplication-and-compression-with-vdo-on-rhel-7-and-8/
    www.linuxsysadmins.com/installing-and-configuring-virtual-data-optimizer-vdo-on-centos7
    hobo.house/2018/09/13/using-vdo-on-centos-rhel7-for-storage-efficiency/
    rhelblog.redhat.com/2018/04/12/how-to-set-up-a-new-virtual-data-optimizer-device-using-cockpit-web-admin-console/

    ceph.com/geen-categorie/shrinking-your-storage-requirements-with-vdo/
    www.slideshare.net/GlusterCommunity/data-reduction-for-gluster-with-vdo

    Upd2.

    — любителям бесплатных обновлений без подписки (pve-no-subscription) не забываем, версия для тестирования, не для продакшена: может прилететь ядро без драйверов на сетевые карты (было уже один раз такое) или например с кривыми дровами не поддерживающими MTU более 1500 (тоже было) в обоих случаях сервер просто не видел сеть. Без KVM решать такие проблемы ещё то удовольствие.

    Для этого нужно иметь МИНИМУМ ДВЕ копии ядра в /boot. Скрипт к-ый, оставляет в /boot указанное кол-во PVE kernel — github.com/algodelinux/purge-old-kernels При наличие кого-то, кто имеет доступ к монитору и клав-е на том конце, можно попросить при перезагрузке PVE выбрать предыдущую версию PVE kernel. Работает. Лично сталкивался.

    Upd3.
    Кому нужен хороший корпус для «самосбора» — посмотрите на Cooler Master N400. Количество внутренних отсеков 3.5" из коробки — ВОСЕМЬ. Все провода заводятся ЗА крепежную панель мат. платы.
    На БП, ес-но, не стоит экономить. Берите из приличных и обязательно (!) с отстегивающимися кабелями (cabel management). Реaльно экономит место в корпусе.