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

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

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

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

Что происходит, так это то, что этап Сбор фактов в конечном итоге истекает, и 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) Вот некоторые nslookup , выполненные с сервера 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 секунды:

  • Моя личная рабочая станция (выполняет Ansible)
  • Мой сервер Proxmox (выполняет команды Ansible и ВМ)
  • 4 виртуальных машины

Вот пример того, что могло бы быть главным сервером Kubernetes.

3
задан 27 October 2018 в 05:05
1 ответ

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

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

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

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

10.0.2.2 Gateway
10.0.2.3 DNS-сервер
10.0.2.4 сервер SMB
DHCP сервер присваивает гостю адреса начиная с 10.0.2.15.

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

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

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

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

Скрещивая пальцы, я хочу, чтобы это решило проблему.

-----EDIT-----

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

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

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

-----EDIT 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
0
ответ дан 3 December 2019 в 07:49

Теги

Похожие вопросы