Ansible falha em “Gathering hosts” presumivelmente porque o SSH é lento para se conectar. Definir 'UseDNS não' resolve o problema

3

Estou tendo o que parece ser um problema relacionado ao DNS que gostaria de receber ajuda resolvendo .

Estou usando o Ansible para provisionar um cluster do Kubernetes no meu servidor Proxmox. O projeto funciona de duas maneiras, permitindo que o usuário modifique o site.yml para implantar usando Linux Containers (LXC) ou máquinas virtuais de um CentOS7 imagem qcow2 .

Ao implantar com o LXC, o projeto não experimenta problemas e inicializa corretamente um cluster do Kubernetes. No entanto, ao usar a imagem qcow2 , encontro o que parece ser um problema relacionado ao DNS. Isso ocorre quando a troca ocorre entre o manual que provisiona minhas máquinas virtuais e a que se conecta a elas pela primeira vez para prepará-las.

O que acontece é que o estágio Gathering Facts termina e a Ansible gera o seguinte erro:

TASK [Gathering Facts] *******************************************************************************************************************************************************************************************************************************************************
fatal: [pluto.sol.milkyway]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ssh: connect to host pluto.sol.milkyway port 22: Operation timed out\r\n", "unreachable": true}
fatal: [ceres.sol.milkyway]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ssh: connect to host ceres.sol.milkyway port 22: Operation timed out\r\n", "unreachable": true}
fatal: [eris.sol.milkyway]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ssh: connect to host eris.sol.milkyway port 22: Operation timed out\r\n", "unreachable": true}
fatal: [haumea.sol.milkyway]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ssh: connect to host haumea.sol.milkyway port 22: Operation timed out\r\n", "unreachable": true}

Se, após isso ocorrer, eu tentar manualmente o SSH nos servidores, posso verificar se o SSH está demorando muito para se conectar. Gostaria de lembrar a você neste ponto que isso NÃO ocorre com as instâncias do LXC que usam os mesmos nomes de host, endereços IP e servidores de nome exatos.

O problema pode ser resolvido definindo a diretiva UseDNS no no meu arquivo sshd_config em cada um dos servidores. E executando o playbook novamente depois de reiniciar o sshd.service .

Então, naturalmente, isso parece um problema de DNS. No entanto, uma vez que não ocorre com LXC eu sou cético. Então, aqui estão mais alguns pontos de dados sobre minha configuração de DNS.

1) O servidor DNS que todos eles usam é BIND e é instalado em um servidor chamado IO.Sol.Milkyway at 192.168.1.10 . Não há VNets ou Subnets ou qualquer coisa no meu homelab, e o Gateway está configurado corretamente para o meu roteador, 192.168.1.1 , então não há problemas de roteamento para este servidor.

2) Aqui estão as partes relevantes das zonas DNS no meu servidor BIND.

3) Aqui estão alguns nslookup s realizados a partir do servidor Proxmox e anexados com o comando time para demonstrar que meu servidor BIND responde corretamente em < = .01 segundos.

$> time nslookup pluto.sol.milkyway
Server:     192.168.1.100
Address:    192.168.1.100#53

Name:   pluto.sol.milkyway
Address: 192.168.1.170

nslookup pluto.sol.milkyway  0.00s user 0.02s system 39% cpu 0.042 total

e-

$> time nslookup 192.168.1.170
Server:     192.168.1.100
Address:    192.168.1.100#53

170.1.168.192.in-addr.arpa  name = pluto.sol.milkyway.

nslookup 192.168.1.170  0.01s user 0.01s system 96% cpu 0.013 total

4) E, por último, você pode ver que meus servidores de nomes estão configurados corretamente nas VMs via cloud-init lines 104, 115, 126, & 137 aqui . Que fazem referência às variáveis definidas aqui .

----- EDIÇÕES ABAIXO -----

5) Eu sou capaz de executar com sucesso um nslookup direto e reverso do seguinte. Cada resposta leva < 1,5 segundos:

  • Minha estação de trabalho pessoal (Executa Ansible)
  • Meu servidor Proxmox (executa comandos e VMs ansíveis)
  • As 4 máquinas virtuais

Aqui está um exemplo do que seria o servidor mestre do Kubernetes.

    
por TJ Zimmerman 27.10.2018 / 03:31

1 resposta

0

Eu encontrei o problema. Parece que minhas VMs resultantes continham um servidor de nomes adicional que foi introduzido automaticamente pelo qemu. Isso ocorre quando uma VM é criada e um dispositivo de rede não é especificado para ela. Da documentação do Proxmox para qm :

net[n]: [model=] [,bridge=] [,firewall=<1|0>] [,link_down=<1|0>] [,macaddr=] [,queues=] [,rate=] [,tag=] [,trunks=] [,=]
Specify network devices.

bridge=
Bridge to attach the network device to. The Proxmox VE standard bridge is called vmbr0.

If you do not specify a bridge, we create a kvm user (NATed) network device, which provides DHCP and DNS services. The following addresses are used:

10.0.2.2 Gateway
10.0.2.3 DNS Server
10.0.2.4 SMB Server
The DHCP server assign addresses to the guest starting from 10.0.2.15.

Meu procedimento foi o seguinte:

1) Crie uma VM usando a API Proxmox através do Módulo Ansible Proxmox_KVM.
2) Clone quatro VMs Kubernetes desta VM.
3 ) Configure cada uma das VMs do Kubernetes por sua vez.

Durante o Passo 1) , declarei uma bridge. No entanto, em Passo 2) eu não, como é um simples qm clone . Que, de acordo com a documentação, não suporta um sinalizador net[n] a ser passado. Foi nesse ponto que o servidor de nomes aleatório foi introduzido. Então, quando a Etapa 3) apareceu, e eu configurei um servidor de nomes através de cloud-init , ele foi anexado ao meu arquivo /etc/resolv.conf como o segundo servidor de nomes.

No momento, estou refazendo meu Playbook para tentar contornar isso executando a seguinte tarefa entre Etapa 1) e Etapa 2) :

- name: Setting the name server for the template to ensure that QEMU doesn't automatically configure the clones to use 10.0.2.3. 
  shell: >
      qm set {{ proxmox_template_id }}
      --ipconfig0 gw={{ k8s_master_gw }},ip={{ k8s_master_ip }}{{ k8s_master_sn }} 
      --nameserver {{ k8s_master_ns }} 
      --searchdomain {{ k8s_master_sd }}

Cruzando meus dedos, isso resolverá o problema.

----- EDITAR -----

Isso não aconteceu. E não parece que é possível provisionar um adaptador de rede ao fazer um qm clone . Significando que terei que retrabalhar meu manual de jogo para provisionar quatro instâncias individuais em vez de clonar a partir de um modelo.

----- EDIT 2 -----

Também não parece que o módulo Proxmox_kvm Ansible de baixa qualidade suporta material relacionado à API do cloudinit. Significa que terei que fazer tudo por meio de comandos do shell e aproveitar qm . : (

----- EDITAR 3 -----

Parece que o servidor de nomes está na IMAGEM BASE POR PADRÃO. WTF CENTOS?

root@hypervisor-1:/rpool/data# modprobe nbd max_part=8

root@hypervisor-1:/rpool/data# qemu-nbd --connect=/dev/nbd0 /tmp/CentOS7.qcow2c 

root@hypervisor-1:/rpool/data# fdisk -l /dev/nbd0
Disk /dev/nbd0: 8 GiB, 8589934592 bytes, 16777216 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x000b2638
Device      Boot Start      End  Sectors Size Id Type
/dev/nbd0p1 *     2048 16777215 16775168   8G 83 Linux

root@hypervisor-1:/rpool/data# mount /dev/nbd0p1 /mnt/tmp

root@hypervisor-1:/rpool/data# cd /mnt/tmp

root@hypervisor-1:/mnt/tmp# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

root@hypervisor-1:/mnt/tmp# cat etc/resolv.conf 
# Generated by NetworkManager
nameserver 10.0.2.3
    
por 27.10.2018 / 04:17