我遇到了与 DNS 相关的问题,希望得到帮助解决。
我正在使用 Ansible 在我的 Proxmox 服务器上配置 Kubernetes 集群。该项目有两种工作方式,一种是让用户修改site.yml
要部署的Linux 容器(LXC)或 CentOS7 虚拟机qcow2 图像。
使用 LXC 部署时,项目没有遇到任何问题,并正确引导了 Kubernetes 集群。但是,在使用映像时qcow2
,我遇到了似乎与 DNS 相关的问题。当配置虚拟机的剧本与首次连接虚拟机以准备虚拟机的剧本之间发生切换时,就会发生这种情况。
发生的情况是,该Gathering Facts
阶段最终超时并且 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 需要很长时间才能连接。我想在此时提醒您,使用完全相同的主机名、IP 地址和名称服务器的 LXC 实例不会发生这种情况。
然后可以通过在每台服务器上设置UseDNS no
我的文件中的指令来解决该问题。 并在重新启动后再次运行剧本。sshd_config
sshd.service
因此,这自然看起来像是 DNS 问题。但是,由于 LXC 不会出现这种情况,所以我持怀疑态度。以下是有关我的 DNS 配置的更多数据点。
1)他们使用的 DNS 服务器都是 BIND,安装在名为 的服务器上IO.Sol.Milkyway
。192.168.1.10
我的家庭实验室中没有 VNet 或子网或任何东西,并且网关已正确设置为我的路由器,192.168.1.1
因此此服务器没有路由问题。
2)这是我的 BIND 服务器上 DNS 区域的相关部分。
3)以下是nslookup
从 Proxmox 服务器执行的一些操作,并附加了命令time
以证明我的 BIND 服务器在 <= .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 Master 服务器开始。
答案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 网关
10.0.2.3 DNS 服务器
10.0.2.4 SMB 服务器
DHCP 服务器从 10.0.2.15 开始为客户机分配地址。
我的程序如下:
1)通过 Proxmox_KVM Ansible 模块使用 Proxmox API 创建 VM。
2)从此 VM 克隆四个 Kubernetes VM。
3)依次配置每个 Kubernetes VM。
期间步骤1)事实上,我确实宣布了一座桥。然而,第2步)我没有,因为它是一个简单的qm clone
。根据文档,它不支持net[n]
传递标志。正是在这一点上引入了随机名称服务器。然后,当步骤3)出现了,我通过设置了一个名称服务器cloud-init
,它将其/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 }}
我希望这能解决这个问题。
- - -编辑 - - -
事实并非如此。而且,在执行 时似乎无法配置网络适配器qm clone
。这意味着我必须重新编写我的剧本来配置四个单独的实例,而不是从模板克隆。
-----编辑 2-----
糟糕的 Proxmox_kvm Ansible 模块似乎也不支持 cloudinit 相关的 API。这意味着我将不得不通过 shell 命令和杠杆来完成所有操作qm
。:(
-----编辑 3-----
看起来该名称服务器实际上默认位于基础映像中。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