У меня возникла проблема, связанная с 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) Вот некоторые nslookup
s выполняется с сервера 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