У меня возникла проблема, связанная с 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 секунды:
Вот пример того, что могло бы быть главным сервером Kubernetes.
Я нашел проблему. Похоже, что моя результирующая ВМ содержала дополнительный сервер имён, который был введён 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