Domain-Name-System

Ansible 在“收集主機”時失敗可能是因為 SSH 連接速度很慢。設置“UseDNS no”可以解決問題

  • October 29, 2018

我遇到了似乎與 DNS 相關的問題,希望能得到一些幫助來解決

我正在使用 Ansible 在我的 Proxmox 伺服器上配置 Kubernetes 集群。該項目以兩種方式工作,讓使用者修改site.yml以使用Linux Containers (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. 我的 homelab 中沒有 VNet 或子網或任何東西,網關已正確設置到我的路由器,192.168.1.1因此該伺服器沒有路由問題。

**2)**這是我的 BIND 伺服器上 DNS 區域的相關部分。

**3)**以下是從 Proxmox 伺服器執行的一些nslookups,並附加了time命令以證明我的 BIND 伺服器在 <= .01 秒內正確響應。

$&gt; 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

-和-

$&gt; 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 行在VM 上正確配置我的名稱伺服器。其中引用了此處定義的變數。

—–以下編輯—–

**5)**我能夠從以下成功執行正向和反向 nslookup。每個響應需要 < 1.5 秒:

  • 我的個人工作站(執行 Ansible)
  • 我的 Proxmox 伺服器(執行 Ansible 命令和虛擬機)
  • 4 台虛擬機

這是Kubernetes 主伺服器的範例。

我發現了問題。看來我生成的虛擬機包含一個由 qemu 自動引入的附加名稱伺服器。當創建 VM 並且未為其指定網路設備時,會發生這種情況。來自 Proxmox 文件qm

$$ 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)**從這個虛擬機複製四個 Kubernetes 虛擬機。

**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: &gt;
     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—–

看起來該名稱伺服器實際上在預設情況下位於基本圖像中。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

引用自:https://serverfault.com/questions/937465