Назад | Перейти на главную страницу

Ansible терпит неудачу при «собирании хостов» предположительно из-за того, что SSH медленно подключается. Установка UseDNS no решает проблему

У меня возникла проблема, связанная с DNS, и я был бы признателен за помощь разрешение.

Я использую Ansible для подготовки кластера Kubernetes на моем сервере Proxmox. Проект работает двумя способами, позволяя пользователю изменять site.yml развернуть с помощью Контейнеры Linux (LXC) или виртуальные машины из CentOS7 qcow2 изображение.

При развертывании с LXC проект не испытывает проблем и правильно загружает кластер Kubernetes. Однако при использовании qcow2 image, я столкнулся с проблемой, связанной с DNS. Это происходит, когда происходит переключение между playbook, который подготавливает мои виртуальные машины, и той, которая подключается к ним в первый раз для их подготовки.

Что происходит, так это то, что Gathering Facts stage в конечном итоге истекает, и Ansible выдает следующую ошибку:

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}

Если после этого я попытаюсь вручную подключиться к серверам по SSH, я могу убедиться, что SSH требует очень много времени для подключения. Я хотел бы напомнить вам, что этого НЕ происходит с экземплярами LXC, которые используют одни и те же точные имена хостов, IP-адреса и серверы имен.

Затем проблему можно решить, установив UseDNS no директива в моем sshd_config файл на каждом из серверов. И снова запустив playbook после перезапуска sshd.service.

Естественно, это похоже на проблему с DNS. Однако, поскольку с LXC этого не происходит, я настроен скептически. Итак, вот еще несколько данных о моей конфигурации DNS.

1) Все они используют DNS-сервер BIND, установленный на сервере с именем IO.Sol.Milkyway в 192.168.1.10. В моей домашней лаборатории нет виртуальных сетей, подсетей или чего-либо еще, и шлюз правильно настроен на мой маршрутизатор, 192.168.1.1 поэтому нет проблем с маршрутизацией на этот сервер.

2) Вот соответствующие части зон DNS на моем сервере BIND.

3) Вот некоторые nslookups выполняется с сервера Proxmox и добавляется time чтобы продемонстрировать, что мой сервер BIND правильно отвечает в течение <= 0,01 секунды.

$> 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

-и-

$> 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) И, наконец, вы можете видеть, что мои серверы имен правильно настроены на виртуальных машинах через cloud-init строки 104, 115, 126 и 137 Вот. Какие ссылки на определенные переменные Вот.

----- РЕДАКТИРУЕТСЯ НИЖЕ -----

5) Я могу успешно выполнить прямой и обратный просмотр nslookup из следующего. Каждый ответ занимает <1,5 секунды:

Вот пример с того, что будет сервером Kubernetes Master.

Я нашел проблему. Похоже, что мои результирующие виртуальные машины содержали дополнительный сервер имен, который был автоматически введен qemu. Это происходит, когда создается виртуальная машина, а для нее не указано сетевое устройство. Из документации Proxmox для qm:

net [n]: [model =] [, bridge =] [, firewall = <1 | 0>] [, link_down = <1 | 0>] [, macaddr =] [, queues =] [, rate =] [ , tag =] [, trunks =] [, =]
Укажите сетевые устройства.

мост =
Мост для подключения сетевого устройства. Стандартный мост Proxmox VE называется vmbr0.

Если вы не укажете мост, мы создадим сетевое устройство пользователя kvm (NATed), которое предоставляет службы DHCP и DNS. Используются следующие адреса:

10.0.2.2 Шлюз
10.0.2.3 DNS-сервер
10.0.2.4 SMB-сервер
DHCP-сервер назначает гостю адреса, начиная с 10.0.2.15.

Моя процедура была следующей:

1) Создайте виртуальную машину с помощью Proxmox API через модуль Proxmox_KVM Ansible.
2) Клонируйте четыре виртуальные машины Kubernetes из этой виртуальной машины.
3) Настройте каждую из виртуальных машин Kubernetes по очереди.

В течение Шаг 1) Фактически, я объявил мост. Однако в Шаг 2) Я не сделал, так как это простой qm clone. Которая, согласно документации, не поддерживает net[n] флаг должен быть передан. Именно в этот момент был представлен случайный сервер имен. Потом, когда Шаг 3) пришел, и я установил сервер имен через cloud-init, он добавил его к моему /etc/resolv.conf файл в качестве второго сервера имен.

В настоящее время я переделываю свой Playbook, чтобы попытаться обойти это, выполнив следующую задачу между Шаг 1) и Шаг 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 }}

Я скрещиваю пальцы, что это решит проблему.

-----РЕДАКТИРОВАТЬ-----

Это не так. И не похоже, что можно подготовить сетевой адаптер при выполнении qm clone. Это означает, что мне придется переделать свой playbook, чтобы подготовить четыре отдельных экземпляра, а не клонировать из шаблона.

----- РЕДАКТИРОВАТЬ 2 -----

Также не похоже, что дрянной модуль Proxmox_kvm Ansible поддерживает API, связанные с cloudinit. Это означает, что мне придется делать все с помощью команд оболочки и использования qm вместо. :(

----- РЕДАКТИРОВАТЬ 3 -----

Похоже, что этот сервер имен на самом деле В БАЗОВЫМ ИЗОБРАЖЕНИИ ПО УМОЛЧАНИЮ. 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