Trabalhar com um cluster Proxmox: instalação, configuração de rede, ZFS, resolvendo problemas comuns

Nos últimos anos, tenho trabalhado muito de perto com os clusters Proxmox: muitos clientes exigem sua própria infraestrutura, onde podem desenvolver seu projeto. É por isso que posso falar sobre os erros e problemas mais comuns que você também pode encontrar. Além disso, é claro que iremos configurar um cluster de três nós do zero.


Um cluster Proxmox pode consistir em dois ou mais servidores. O número máximo de nós em um cluster é de 32 partes. Nosso próprio cluster consistirá em três nós em um multicast (no artigo também descreverei como aumentar um cluster na exclusividade - isso é importante se você basear sua infraestrutura de cluster no Hetzner ou OVH, por exemplo). Em resumo, o multicast permite a transferência de dados para vários nós simultaneamente. Com um multicast, não podemos pensar no número de nós no cluster (focando nas limitações acima).

O cluster em si é construído em uma rede interna (é importante que os endereços IP estejam na mesma sub-rede), o mesmo Hetzner e OVH podem combinar nós em diferentes datacenters usando a tecnologia Virtual Switch (Hetzner) e vRack (OVH) - sobre o Virtual Switch também falaremos no artigo. Se o seu provedor de hospedagem não tiver tecnologias semelhantes em funcionamento, você poderá usar o OVS (Open Virtual Switch), que é suportado originalmente pelo Proxmox, ou usar uma VPN. No entanto, nesse caso, eu recomendo usar o Unicast com um pequeno número de nós - geralmente surgem situações em que o cluster simplesmente “desmorona” com base nessa infraestrutura de rede e precisa ser restaurado. Portanto, tento usar a OVH e a Hetzner em meu trabalho - vi menos incidentes desse tipo, mas antes de tudo, estudo o provedor de hospedagem que será hospedado: ele possui tecnologia alternativa, quais soluções oferece, suporta multicast e assim por diante? .

Instale o Proxmox


O Proxmox pode ser instalado de duas maneiras: instalador ISO e instalação via shell. Nós escolhemos o segundo método, então instale o Debian no servidor.

Prosseguimos diretamente para a instalação do Proxmox em cada servidor. A instalação é extremamente simples e está descrita na documentação oficial aqui.

Adicione o repositório Proxmox e a chave deste repositório:

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 

Atualizando repositórios e o próprio sistema:

 apt update && apt dist-upgrade 

Após uma atualização bem-sucedida, instale os pacotes Proxmox necessários:

 apt install proxmox-ve postfix open-iscsi 

Nota : O Postfix e o grub serão configurados durante a instalação - um deles pode falhar. Talvez isso seja causado pelo fato de o nome do host não ser resolvido pelo nome. Edite as entradas dos hosts e faça o apt-get update

A partir de agora, podemos efetuar login na interface da web do Proxmox em https: // <endereço-endereço-externo>: 8006 (você encontrará um certificado não confiável durante a conexão).


Figura 1. Interface da Web do nó Proxmox

Instale o Nginx e vamos criptografar o certificado


Não gosto muito da situação com o certificado e o endereço IP, então sugiro instalar o Nginx e configurar o certificado Let's Encrypt. Não descreverei a instalação do Nginx, deixarei apenas os arquivos importantes para o certificado Vamos criptografar funcionar:

/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 

Configuração do site no 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; } 


Depois de instalar o certificado SSL, não se esqueça de configurá-lo para renovação automática via 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" 

Ótimo! Agora podemos acessar nosso domínio via HTTPS.

Nota : para desativar a janela de informações da assinatura, execute este comando:

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

Configurações de rede

Antes de conectar-se ao cluster, configure as interfaces de rede no hypervisor. Vale ressaltar que a configuração dos nós restantes não é diferente, exceto endereços IP e nomes de servidores, portanto, não duplicarei suas configurações.

Criaremos uma ponte de rede para a rede interna para que nossas máquinas virtuais (na minha versão haverá um contêiner LXC por conveniência); primeiro, elas estejam conectadas à rede interna do hipervisor e possam interagir umas com as outras. Em segundo lugar, um pouco mais tarde, adicionaremos uma ponte para a rede externa para que as máquinas virtuais tenham seu próprio endereço IP externo. Consequentemente, os contêineres estarão no momento atrás do NAT'om conosco.

Há duas maneiras de trabalhar com a configuração de rede Proxmox: através da interface da web ou através do arquivo de configuração / etc / network / interfaces. Na primeira opção, você precisará reiniciar o servidor (ou simplesmente renomear o arquivo interfaces.new para interfaces e reiniciar o serviço de rede através do systemd). Se você está apenas começando a configurar e ainda não há máquinas virtuais ou contêineres LXC, é aconselhável reiniciar o hipervisor após as alterações.

Agora crie uma ponte de rede chamada vmbr1 na guia rede no painel da web Proxmox.


Figura 2. Interfaces de rede do nó proxmox1


Figura 3. Criando uma ponte de rede


Figura 4. Configurando a configuração de rede vmbr1

A configuração é extremamente simples - precisamos do vmbr1 para que as instâncias tenham acesso à Internet.

Agora reinicie nosso hypervisor e verifique se a interface foi criada:


Figura 5. Interface de rede vmbr1 na saída de comando ip a

Nota: Eu já tenho a interface ens19 - essa é a interface com a rede interna, com base na qual um cluster será criado.

Repita essas etapas nos outros dois hipervisores e prossiga para a próxima etapa - preparando o cluster.

Além disso, um estágio importante agora é permitir o encaminhamento de pacotes - sem ele, as instâncias não terão acesso à rede externa. Abra o arquivo sysctl.conf e altere o valor do parâmetro net.ipv4.ip_forward para 1, após o qual inserimos o seguinte comando:

 sysctl -p 

Na saída, você deve ver a diretiva net.ipv4.ip_forward (se você não a tiver alterado antes)

Configurando um cluster Proxmox

Agora vamos diretamente para o cluster. Cada nó deve resolver a si próprio e outros nós na rede interna, para isso é necessário alterar os valores nos registros de hosts da seguinte forma (cada nó deve ter um registro sobre os outros):

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

Também é necessário adicionar as chaves públicas de cada nó aos outros - isso é necessário para criar um cluster.

Crie um cluster através do painel da web:


Figura 6. Criando um cluster por meio da interface da web

Depois de criar o cluster, precisamos obter informações sobre ele. Vá para a mesma guia do cluster e clique no botão "Join Information":


Figura 7. Informações sobre o cluster criado

Essas informações são úteis para nós ao ingressar no segundo e terceiro nós no cluster. Estamos conectados ao segundo nó e, na guia Cluster, clique no botão "Join Cluster":


Figura 8. Conectando a um cluster de nós

Vamos analisar os parâmetros para conexão com mais detalhes:

  1. Endereço Par: Endereço IP do primeiro servidor (àquele ao qual estamos nos conectando)
  2. Senha: senha do primeiro servidor
  3. Impressão digital: obtemos esse valor das informações do cluster


Figura 9. Estado do cluster após conectar o segundo nó

O segundo nó está conectado com sucesso! No entanto, isso nem sempre acontece. Se você seguir as etapas incorretamente ou surgirem problemas de rede, a associação ao cluster falhará e o próprio cluster será "dividido". A melhor solução é desconectar o nó do cluster, excluir todas as informações sobre o cluster, reiniciar o servidor e verificar as etapas anteriores. Como desconectar com segurança um nó de um cluster? Primeiro, exclua-o do cluster no primeiro servidor:

 pvecm del proxmox2 

Após o qual o nó será desconectado do cluster. Agora vá para o nó quebrado e desative os seguintes serviços nele:

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

O cluster Proxmox armazena informações sobre si no banco de dados sqlite, também precisa ser limpo:

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

Os dados sobre a casca são excluídos com sucesso. Exclua os arquivos restantes. Para isso, é necessário iniciar o sistema de arquivos em cluster no modo independente:

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

Reiniciamos o servidor (isso não é necessário, mas estamos seguros: todos os serviços devem estar funcionando corretamente no final. Para não perder nada, reiniciaremos). Após a ativação, obteremos um nó vazio sem nenhuma informação sobre o cluster anterior e poderemos iniciar a conexão novamente.

Instale e configure o ZFS


O ZFS é um sistema de arquivos que pode ser usado com o Proxmox. Com ele, você pode replicar dados para outro hypervisor, migrar o contêiner da máquina virtual / LXC, acessar o contêiner LXC do sistema host e assim por diante. A instalação é bem simples, vamos prosseguir com a análise. Três SSDs estão disponíveis em meus servidores, que serão combinados em uma matriz RAID.

Adicione repositórios:

 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 

Atualizando a lista de pacotes:

 apt update 

Defina as dependências necessárias:

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

Instale o próprio ZFS:

 apt-get install zfs-dkms zfsutils-linux 

Se, no futuro, você receber um erro fusermount: dispositivo de fusível não encontrado, tente primeiro 'modprobe fuse' e execute o seguinte comando:

 modprobe fuse 

Agora vamos prosseguir diretamente para a instalação. Primeiro, precisamos formatar os SSDs e configurá-los atravé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 


Ações semelhantes devem ser executadas para outras unidades. Depois que todos os discos estiverem preparados, prossiga para a próxima etapa:

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

Escolhemos ashift = 12 por razões de desempenho - esta é a recomendação do próprio zfsonlinux, você pode ler mais sobre isso em seu wiki: github.com/zfsonlinux/zfs/wiki/faq#performance-considerations

Aplique algumas configurações ao 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 

Agora precisamos calcular algumas variáveis ​​para calcular zfs_arc_max, faço o seguinte:

 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 

No momento, o pool foi criado com sucesso, também criamos um subconjunto de dados. Você pode verificar o status do seu pool com o comando zpool status. Esta ação deve ser executada em todos os hipervisores e, em seguida, prossiga para a próxima etapa.

Agora adicione o ZFS ao Proxmox. Vamos às configurações do data center (a saber, e não a um nó separado) na seção "Armazenamento", clique no botão "Adicionar" e selecione a opção "ZFS", após o qual veremos os seguintes parâmetros:

ID: Nome dos cem. Eu dei o nome de local-zfs
Pool ZFS: criamos rpool / data e adicionamos aqui.
Nós: especifique todos os nós disponíveis

Este comando cria um novo pool com as unidades que selecionamos. Em cada hypervisor, um novo armazenamento deve aparecer chamado local-zfs, após o qual você pode migrar suas máquinas virtuais do armazenamento local para o ZFS.

Replicando instâncias para um hypervisor vizinho


O cluster Proxmox tem a capacidade de replicar dados de um hipervisor para outro: essa opção permite alternar a instância de um servidor para outro. Os dados serão relevantes no momento da última sincronização - seu tempo pode ser definido ao criar a replicação (15 minutos são definidos como padrão). Há duas maneiras de migrar uma instância para outro nó do Proxmox: manual e automático. Vamos examinar a opção manual primeiro e, no final, fornecerei um script Python que permitirá criar uma máquina virtual em um hipervisor acessível quando um dos hipervisores estiver indisponível.

Para criar replicação, acesse o painel da web Proxmox e crie uma máquina virtual ou um contêiner LXC. Nos parágrafos anteriores, configuramos a ponte vmbr1 com o NAT, o que nos permitirá acessar a rede externa. Vou criar um contêiner LXC com MySQL, Nginx e PHP-FPM com um site de teste para testar a replicação. Abaixo está uma instrução passo a passo.

Carregamos o modelo apropriado (vá para storage -> Content -> Templates), um exemplo na captura de tela:


Imagem 10. Armazenamento local com modelos e imagens de VM

Clique no botão "Modelos" e carregue o modelo de contêiner LXC que precisamos:


Figura 11. Selecionando e carregando um modelo

Agora podemos usá-lo ao criar novos contêineres LXC. Selecione o primeiro hipervisor e clique no botão "Criar CT" no canto superior direito: veremos o painel para criar uma nova instância. As etapas de instalação são bastante simples e darei apenas o arquivo de configuração para este contêiner 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: 

O contêiner foi criado com sucesso. Você pode conectar-se aos contêineres LXC através do comando pct enter. Também adicionei a chave do hipervisor SSH antes da instalação para conectar-se diretamente via SSH (existem alguns pequenos problemas com a exibição do terminal no PCT). Eu preparei o servidor e instalei todos os aplicativos necessários, agora você pode continuar criando a replicação.

Clicamos no contêiner LXC e vamos para a guia "Replicação", onde criamos o parâmetro de replicação usando o botão "Adicionar":


Figura 12. Criando replicação na interface Proxmox


Imagem 13. Janela de criação de tarefas de replicação

Eu criei a tarefa de replicar o contêiner para o segundo nó, como você pode ver na próxima captura de tela, a replicação foi bem-sucedida - preste atenção ao campo "Status", ele notifica sobre o status da replicação, também vale a pena prestar atenção ao campo "Duração" para saber quanto tempo a replicação de dados leva.


Figura 14. Lista de sincronização da VM

Agora tente migrar a máquina para o segundo nó usando o botão "Migrar"

A migração do contêiner será iniciada, o log poderá ser visualizado na lista de tarefas - haverá nossa migração. Depois disso, o contêiner será movido para o segundo nó.

Erro "Falha na verificação da chave do host"

Às vezes, ao configurar um cluster, um problema semelhante pode surgir - impede que as máquinas migrem e criem replicação, o que elimina as vantagens das soluções de cluster. Para corrigir esse erro, exclua o arquivo known_hosts e conecte-se via SSH ao nó conflitante:

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

Aceite o Hostkey e tente digitar este comando, ele deve conectá-lo ao servidor:

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

Recursos das configurações de rede no Hetzner


Vá para o painel Robot e clique no botão "Virtual Switches". Na próxima página, você verá um painel para criar e gerenciar interfaces do Virtual Switch: primeiro você precisa criá-lo e depois "conectar" servidores dedicados a ele. Na pesquisa, adicione os servidores necessários para conectar-se - eles não precisam ser reinicializados, apenas precisam esperar 10 a 15 minutos para que a conexão com o Virtual Switch esteja ativa.

Depois de adicionar os servidores ao Virtual Switch por meio do painel da web, nos conectamos aos servidores e abrimos os arquivos de configuração das interfaces de rede, onde criamos uma nova interface de rede:

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

Vamos dar uma olhada mais de perto no que é. Na sua essência, é uma VLAN que se conecta a uma única interface física chamada enp4s0 (pode variar para você), com um número de VLAN - esse é o número do Virtual Switch que você criou no painel da web do Hetzner Robot. Você pode especificar qualquer endereço, desde que seja local.

Observo que você deve configurar o enp4s0 como de costume; na verdade, ele deve conter um endereço IP externo que foi emitido para o servidor físico. Repita essas etapas em outros hipervisores e, em seguida, reinicie o serviço de rede neles, execute ping em um nó vizinho usando o endereço IP do Virtual Switch. Se o ping foi bem-sucedido, você estabeleceu com êxito uma conexão entre os servidores usando o Virtual Switch.

Também anexarei o arquivo de configuração sysctl.conf, será necessário se você tiver problemas com o pacote de encaminhamento e outros parâmetros de rede:

 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 

Adicionando sub-redes IPv4 ao Hetzner

Antes de iniciar o trabalho, você precisa solicitar uma sub-rede no Hetzner, pode fazer isso através do painel Robô.

Crie uma ponte de rede com o endereço que será desta sub-rede. Exemplo de configuração:

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

Agora vá para as configurações da máquina virtual no Proxmox e crie uma nova interface de rede que será anexada à ponte vmbr2. Eu uso o contêiner LXC, sua configuração pode ser alterada imediatamente no Proxmox. Configuração final para o Debian:

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

Observe: eu especifiquei 26 máscaras, não 29 - isso é necessário para que a rede funcione na máquina virtual.

Adicionando endereços IPv4 ao Hetzner

A situação com um único endereço IP é diferente - geralmente Hetzner nos fornece um endereço adicional da sub-rede do servidor. Isso significa que, em vez de vmbr2, precisamos usar vmbr0, mas no momento não o temos. A conclusão é que vmbr0 deve conter o endereço IP do servidor iron (ou seja, use o endereço que usou a interface de rede física enp2s0). O endereço deve ser movido para vmbr0, a seguinte configuração é adequada para isso (aconselho você a solicitar o KVM, nesse caso, para retomar a operação de rede):

 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 o servidor, se possível (caso contrário, reinicie o serviço de rede) e verifique as interfaces de rede via 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 você pode ver aqui, o enp2s0 está conectado ao vmbr0 e não possui um endereço IP, pois foi redesignado ao vmbr0.

Agora, nas configurações da máquina virtual, adicione a interface de rede que será conectada ao vmbr0. Para o gateway, especifique o endereço anexado ao vmbr0.

No final


Espero que este artigo seja útil quando você configurar o cluster Proxmox no Hetzner. Se o tempo permitir, expandirei o artigo e adicionarei instruções para a OVH - lá também nem tudo é óbvio, como parece à primeira vista. O material acabou por ser bastante volumoso, se você encontrar erros, por favor escreva nos comentários, eu os corrigirei. Obrigado a todos pela atenção.

Postado por Ilya Andreev, editado por Alexei Zhadan e Live Linux Team

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


All Articles