Trabaje con un clúster Proxmox: instalación, configuración de red, ZFS, solución de problemas comunes

En los últimos años, he estado trabajando muy de cerca con los clústeres de Proxmox: muchos clientes requieren su propia infraestructura para poder desarrollar su proyecto. Es por eso que puedo hablar sobre los errores y problemas más comunes que también puede encontrar. Además de esto, por supuesto configuraremos un grupo de tres nodos desde cero.


Un clúster Proxmox puede constar de dos o más servidores. El número máximo de nodos en un clúster es de 32 piezas. Nuestro propio clúster consistirá en tres nodos en una multidifusión (en el artículo también describiré cómo elevar un clúster a la unicidad; esto es importante si basa su infraestructura de clúster en Hetzner u OVH, por ejemplo). En resumen, la multidifusión permite la transferencia de datos a varios nodos simultáneamente. Con una multidifusión, no podemos pensar en el número de nodos en el clúster (centrándonos en las limitaciones anteriores).

El clúster en sí está construido en una red interna (es importante que las direcciones IP estén en la misma subred), el mismo Hetzner y OVH tienen la capacidad de agrupar nodos en diferentes centros de datos utilizando la tecnología Virtual Switch (Hetzner) y vRack (OVH) - sobre Virtual Switch También hablaremos en el artículo. Si su proveedor de alojamiento no tiene tecnologías similares en funcionamiento, puede usar OVS (Open Virtual Switch), que es compatible de forma nativa con Proxmox, o usar una VPN. Sin embargo, en este caso, recomiendo usar Unicast con un pequeño número de nodos; a menudo surgen situaciones en las que el clúster simplemente "se desmorona" en función de dicha infraestructura de red y tiene que restaurarse. Por lo tanto, trato de usar OVH y Hetzner en mi trabajo: he visto menos incidentes de este tipo, pero antes que nada, estudie el proveedor de alojamiento que se alojará: ¿tiene tecnología alternativa, qué soluciones ofrece, admite multidifusión, etc.? .

Instalar Proxmox


Proxmox se puede instalar de dos maneras: instalador ISO e instalación a través de shell. Elegimos el segundo método, así que instale Debian en el servidor.

Procedemos directamente a la instalación de Proxmox en cada servidor. La instalación es extremadamente simple y se describe en la documentación oficial aquí.

Agregue el repositorio de Proxmox y la clave de este repositorio:

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 

Actualización de repositorios y el sistema en sí:

 apt update && apt dist-upgrade 

Después de una actualización exitosa, instale los paquetes Proxmox necesarios:

 apt install proxmox-ve postfix open-iscsi 

Nota : Postfix y grub se configurarán durante la instalación; uno de ellos puede fallar. Quizás esto se deba al hecho de que el nombre de host no se resuelve por nombre. Edite las entradas de los hosts y realice apt-get update

A partir de ahora, podemos iniciar sesión en la interfaz web de Proxmox en https: // <external-ip-address>: 8006 (encontrará un certificado no confiable durante la conexión).


Imagen 1. Interfaz web del nodo Proxmox

Instale Nginx y Let's Encrypt Certificate


Realmente no me gusta la situación con el certificado y la dirección IP, por lo que sugiero instalar Nginx y configurar el certificado Let's Encrypt. No describiré la instalación de Nginx, dejaré solo los archivos importantes para que funcione el certificado Let's Encriptar:

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



Comando para emitir certificado SSL:

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

Configuración del sitio en 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; } 


Después de instalar el certificado SSL, no olvide configurarlo para que se renueve automáticamente a través de 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" 

Genial Ahora podemos acceder a nuestro dominio a través de HTTPS.

Nota : para deshabilitar la ventana de información de suscripción, ejecute este comando:

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

Configuraciones de red

Antes de conectarse al clúster, configure las interfaces de red en el hipervisor. Vale la pena señalar que la configuración de los nodos restantes no es diferente, a excepción de las direcciones IP y los nombres de los servidores, por lo que no duplicaré su configuración.

Crearemos un puente de red para la red interna para que nuestras máquinas virtuales (en mi versión habrá un contenedor LXC por conveniencia), en primer lugar, están conectadas a la red interna del hipervisor y pueden interactuar entre sí. En segundo lugar, un poco más tarde agregaremos un puente para la red externa para que las máquinas virtuales tengan su propia dirección IP externa. En consecuencia, los contenedores estarán en este momento detrás de NAT'om con nosotros.

Hay dos formas de trabajar con la configuración de red de Proxmox: a través de la interfaz web o mediante el archivo de configuración / etc / network / interfaces. En la primera opción, deberá reiniciar el servidor (o simplemente puede cambiar el nombre del archivo interfaces.new a interfaces y reiniciar el servicio de red a través de systemd). Si recién está comenzando a configurar y aún no hay máquinas virtuales o contenedores LXC, es recomendable reiniciar el hipervisor después de los cambios.

Ahora cree un puente de red llamado vmbr1 en la pestaña de red en el panel web de Proxmox.


Figura 2. Interfaces de red del nodo proxmox1


Figura 3. Crear un puente de red


Figura 4. Configuración de la configuración de red vmbr1

La configuración es extremadamente simple: necesitamos vmbr1 para que las instancias tengan acceso a Internet.

Ahora reinicie nuestro hipervisor y verifique si se ha creado la interfaz:


Figura 5. Interfaz de red vmbr1 en ip una salida de comando

Nota: Ya tengo la interfaz ens19: esta es la interfaz con la red interna, en función de la cual se creará un clúster.

Repita estos pasos en los otros dos hipervisores y luego continúe con el siguiente paso: preparar el clúster.

Además, una etapa importante ahora es habilitar el reenvío de paquetes; sin él, las instancias no obtendrán acceso a la red externa. Abra el archivo sysctl.conf y cambie el valor del parámetro net.ipv4.ip_forward a 1, después de lo cual ingresaremos el siguiente comando:

 sysctl -p 

En la salida, debería ver la directiva net.ipv4.ip_forward (si no la ha cambiado antes)

Configurar un clúster Proxmox

Ahora vamos directamente al clúster. Cada nodo debe resolverse a sí mismo y a otros nodos en la red interna, para esto es necesario cambiar los valores en los registros de los hosts de la siguiente manera (cada nodo debe tener un registro sobre los demás):

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

También es necesario agregar las claves públicas de cada nodo a los demás; esto es necesario para crear un clúster.

Cree un clúster a través del panel web:


Figura 6. Crear un clúster a través de la interfaz web

Después de crear el clúster, necesitamos obtener información al respecto. Vaya a la misma pestaña del clúster y haga clic en el botón "Unir información":


Imagen 7. Información sobre el clúster creado

Esta información es útil para nosotros al unir el segundo y tercer nodos en el clúster. Estamos conectados al segundo nodo y en la pestaña Clúster haga clic en el botón "Unirse al clúster":


Figura 8. Conexión a un clúster de nodos

Analicemos los parámetros para la conexión con más detalle:

  1. Dirección de igual: dirección IP del primer servidor (al que nos estamos conectando)
  2. Contraseña: contraseña del primer servidor
  3. Huella digital: obtenemos este valor de la información del clúster


Figura 9. Estado del clúster después de conectar el segundo nodo

¡El segundo nodo se ha conectado correctamente! Sin embargo, esto no siempre sucede. Si sigue los pasos incorrectamente o surgen problemas de red, la unión al clúster fallará y el clúster mismo se "dividirá". La mejor solución es desconectar el nodo del clúster, eliminar toda la información sobre el clúster en él, luego reiniciar el servidor y verificar los pasos anteriores. ¿Cómo desconectar de forma segura un nodo de un clúster? Primero, elimínelo del clúster en el primer servidor:

 pvecm del proxmox2 

Después de lo cual el nodo se desconectará del clúster. Ahora ve al nodo roto y deshabilita los siguientes servicios en él:

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

El clúster Proxmox almacena información sobre sí mismo en la base de datos sqlite, también debe borrarse:

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

Los datos sobre la corteza se eliminan correctamente. Elimine los archivos restantes, para esto debe iniciar el sistema de archivos del clúster en modo independiente:

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

Reiniciamos el servidor (esto no es necesario, pero estamos seguros: todos los servicios deberían estar funcionando correctamente al final. Para no perder nada, reiniciaremos). Después de encender, obtendremos un nodo vacío sin ninguna información sobre el clúster anterior y podremos iniciar la conexión nuevamente.

Instalar y configurar ZFS


ZFS es un sistema de archivos que se puede usar con Proxmox. Con él, puede permitirse replicar datos a otro hipervisor, migrar la máquina virtual / contenedor LXC, acceder al contenedor LXC desde el sistema host, etc. Instalarlo es bastante simple, procedamos al análisis. Hay tres SSD disponibles en mis servidores, que combinaremos en una matriz RAID.

Añadir repositorios:

 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 

Actualización de la lista de paquetes:

 apt update 

Establezca las dependencias requeridas:

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

Instalar ZFS en sí mismo:

 apt-get install zfs-dkms zfsutils-linux 

Si en el futuro obtiene un error fusermount: no se encuentra el dispositivo de fusible, intente primero 'modprobe fuse', luego ejecute el siguiente comando:

 modprobe fuse 

Ahora procedamos directamente a la configuración. Primero necesitamos formatear los SSD y configurarlos a través de parted:

Configurar / 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 


Se deben realizar acciones similares para otras unidades. Después de que todos los discos estén preparados, continúe con el siguiente paso:

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

Elegimos ashift = 12 por razones de rendimiento: esta es la recomendación de zfsonlinux en sí, se puede encontrar más sobre esto en su wiki: github.com/zfsonlinux/zfs/wiki/faq#performance-considerations

Aplique algunas configuraciones para 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 

Ahora necesitamos calcular algunas variables para calcular zfs_arc_max, hago esto de la siguiente manera:

 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 

Por el momento, el grupo se ha creado con éxito, también creamos un subgrupo de datos. Puede verificar el estado de su grupo con el comando de estado zpool. Esta acción debe realizarse en todos los hipervisores y luego continuar con el siguiente paso.

Ahora agregue ZFS a Proxmox. Vamos a la configuración del centro de datos (es decir, y no a un nodo separado) en la sección "Almacenamiento", hacemos clic en el botón "Agregar" y seleccionamos la opción "ZFS", después de lo cual veremos los siguientes parámetros:

ID: Nombre de los cien. Le di el nombre local-zfs
Grupo ZFS: Creamos rpool / data, y lo agregamos aquí.
Nodos: especifique todos los nodos disponibles

Este comando crea un nuevo grupo con las unidades que seleccionamos. En cada hipervisor, debe aparecer un nuevo almacenamiento llamado local-zfs, después de lo cual puede migrar sus máquinas virtuales desde el almacenamiento local a ZFS.

Replicar instancias en un hipervisor vecino


El clúster Proxmox tiene la capacidad de replicar datos de un hipervisor a otro: esta opción le permite cambiar la instancia de un servidor a otro. Los datos serán relevantes en el momento de la última sincronización: su tiempo se puede configurar al crear la replicación (15 minutos se configura como estándar). Hay dos formas de migrar una instancia a otro nodo Proxmox: manual y automática. Veamos primero la opción manual, y al final le daré un script de Python que le permitirá crear una máquina virtual en un hipervisor accesible cuando uno de los hipervisores no esté disponible.

Para crear la replicación, vaya al panel web de Proxmox y cree una máquina virtual o un contenedor LXC. En los párrafos anteriores, configuramos el puente vmbr1 con NAT, lo que nos permitirá ir a la red externa. Crearé un contenedor LXC con MySQL, Nginx y PHP-FPM con un sitio de prueba para probar la replicación. A continuación hay una instrucción paso a paso.

Cargamos la plantilla adecuada (vaya a almacenamiento -> Contenido -> Plantillas), un ejemplo en la captura de pantalla:


Imagen 10. Almacenamiento local con plantillas e imágenes de VM

Haga clic en el botón "Plantillas" y cargue la plantilla de contenedor LXC que necesitamos:


Imagen 11. Seleccionar y cargar una plantilla

Ahora podemos usarlo al crear nuevos contenedores LXC. Seleccione el primer hipervisor y haga clic en el botón "Crear CT" en la esquina superior derecha: veremos el panel para crear una nueva instancia. Los pasos de instalación son bastante simples y solo daré el archivo de configuración para este contenedor 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: 

El contenedor se creó con éxito. Puede conectarse a contenedores LXC a través del comando pct enter, también agregué la clave del hipervisor SSH antes de la instalación para conectarse directamente a través de SSH (hay algunos problemas menores con la visualización del terminal en PCT). Preparé el servidor e instalé todas las aplicaciones de servidor necesarias allí, ahora puede proceder a crear la replicación.

Hacemos clic en el contenedor LXC y vamos a la pestaña "Replicación", donde creamos el parámetro de replicación usando el botón "Agregar":


Figura 12. Creación de replicación en la interfaz Proxmox


Imagen 13. Ventana de creación de trabajo de replicación

Creé la tarea de replicar el contenedor en el segundo nodo, como puede ver en la siguiente captura de pantalla, la replicación fue exitosa: preste atención al campo "Estado", notifica sobre el estado de la replicación, también debe prestar atención al campo "Duración" para saber cuánto dura la replicación de datos.


Imagen 14. Lista de sincronización de VM

Ahora intente migrar la máquina al segundo nodo con el botón "Migrar"

Comenzará la migración del contenedor, el registro se puede ver en la lista de tareas: habrá nuestra migración. Después de eso, el contenedor se moverá al segundo nodo.

Error de "Error de verificación de clave de host"

A veces, al configurar un clúster, puede surgir un problema similar: evita que las máquinas migren y creen replicación, lo que elimina las ventajas de las soluciones de clúster. Para corregir este error, elimine el archivo known_hosts y conéctese a través de SSH al nodo en conflicto:

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

Acepte Hostkey e intente ingresar este comando, debería conectarlo al servidor:

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

Características de la configuración de red en Hetzner


Vaya al panel Robot y haga clic en el botón "Interruptores virtuales". En la página siguiente verá un panel para crear y administrar interfaces de conmutador virtual: primero debe crearlo y luego "conectarle" servidores dedicados. En la búsqueda, agregue los servidores necesarios para conectarse: no es necesario reiniciarlos, solo tiene que esperar hasta 10-15 minutos cuando la conexión al conmutador virtual estará activa.

Después de agregar los servidores a Virtual Switch a través del panel web, nos conectamos a los servidores y abrimos los archivos de configuración de las interfaces de red, donde creamos una nueva interfaz de red:

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

Echemos un vistazo más de cerca a lo que es. En esencia, es una VLAN que se conecta a una única interfaz física llamada enp4s0 (puede variar para usted), con un número de VLAN: este es el número del conmutador virtual que creó en el panel web del robot Hetzner. Puede especificar cualquier dirección, siempre que sea local.

Observo que debe configurar enp4s0 como de costumbre, de hecho, debe contener una dirección IP externa que se emitió a su servidor físico. Repita estos pasos en otros hipervisores, luego reinicie el servicio de red en ellos, haga ping a un nodo vecino utilizando la dirección IP del conmutador virtual. Si el ping fue exitoso, entonces ha establecido exitosamente una conexión entre los servidores usando Virtual Switch.

También adjuntaré el archivo de configuración sysctl.conf, será necesario si tiene problemas con el paquete de reenvío y otros parámetros de red:

 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 

Agregar subredes IPv4 a Hetzner

Antes de comenzar a trabajar, debe solicitar una subred en Hetzner, puede hacerlo a través del panel Robot.

Cree un puente de red con la dirección que será de esta subred. Ejemplo de configuración:

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

Ahora vaya a la configuración de la máquina virtual en Proxmox y cree una nueva interfaz de red que se conectará al puente vmbr2. Utilizo el contenedor LXC, su configuración se puede cambiar inmediatamente en Proxmox. Configuración final para Debian:

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

Tenga en cuenta: especifiqué 26 máscaras, no 29; esto es necesario para que la red funcione en la máquina virtual.

Agregar direcciones IPv4 a Hetzner

La situación con una sola dirección IP es diferente, generalmente Hetzner nos da una dirección adicional desde la subred del servidor. Esto significa que en lugar de vmbr2 necesitamos usar vmbr0, pero por el momento no lo tenemos. La conclusión es que vmbr0 debe contener la dirección IP del servidor iron (es decir, usar la dirección que usó la interfaz de red física enp2s0). La dirección se debe mover a vmbr0, la siguiente configuración es adecuada para esto (le aconsejo que solicite KVM, en cuyo caso reanudará el funcionamiento de la red):

 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 

Reinicie el servidor, si es posible (si no, reinicie el servicio de red), y luego verifique las interfaces de red a través de 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 

Como puede ver aquí, enp2s0 está conectado a vmbr0 y no tiene una dirección IP, ya que fue reasignado a vmbr0.

Ahora en la configuración de la máquina virtual, agregue la interfaz de red que se conectará a vmbr0. Para la puerta de enlace, especifique la dirección adjunta a vmbr0.

Al final


Espero que este artículo sea útil cuando configure el clúster Proxmox en Hetzner. Si el tiempo lo permite, expandiré el artículo y agregaré instrucciones para OVH; allí también, no todo es obvio, como parece a primera vista. El material resultó ser bastante voluminoso, si encuentra errores, escriba los comentarios, los corregiré. Gracias a todos por su atención.

Publicado por Ilya Andreev, editado por Alexei Zhadan y Live Linux Team

Source: https://habr.com/ru/post/457894/


All Articles