Ubuntu

使用 cloudinit 為 dhcp 伺服器設置主機名:Systemd 覆蓋 cloudinit 主機名

  • June 6, 2019

對於測試環境,我想使用 DHCP 連接多個虛擬機,並將它們的主機名作為 DNS 條目。故障排除顯示我的 DNS/DHCP 工作正常。但是虛擬機被註冊ubuntu為主機名而不是我自己的(k8sm在這個例子中):

root@k8sm:~# ping k8sm -c1
PING k8sm (192.168.2.89) 56(84) bytes of data.
64 bytes from ubuntu.k8s.home (192.168.2.89): icmp_seq=1 ttl=64 time=0.019 ms

使用我的k8sm主機名,我在嘗試時沒有獲得 IP dig +short k8sm.k8s.home @192.168.2.2(其中 .2.2 是我的 DNS 伺服器)。

Cloudinit 使用者數據

hostname: ${hostname}
fqdn: ${hostname}.k8s.home

這是從我的 Terraform 配置文件中呼叫的:

data "template_file" "k8sm-cloudinit-data" {
 template = "${file("${path.module}/cloudinit/user-data.cfg")}"
 vars = {
   hostname = "k8sm"
 }
}

根據日誌

root@k8sm:~# grep hostname /var/log/syslog
Jun  6 19:17:09 k8sm systemd-resolved[604]: Using system hostname 'ubuntu'.
Jun  6 19:17:09 k8sm systemd-networkd[581]: Not connected to system bus, not setting hostname.
Jun  6 19:17:09 k8sm systemd-resolved[604]: System hostname changed to 'k8sm'.
Jun  6 19:17:09 k8sm kernel: [    3.526063] systemd[1]: Set hostname to <ubuntu>.
Jun  6 19:17:09 k8sm dbus-daemon[781]: [system] Activating via systemd: service name='org.freedesktop.hostname1' unit='dbus-org.freedesktop.hostname1.service' requested by ':1.0' (uid=100 pid=581 comm="/lib/systemd/systemd-networkd " label="unconfined")
Jun  6 19:17:09 k8sm dbus-daemon[781]: [system] Successfully activated service 'org.freedesktop.hostname1'
Jun  6 19:17:09 k8sm systemd-hostnamed[844]: Changed host name to 'ubuntu'

似乎我的k8sm主機名已應用,但被 systemd 覆蓋。為什麼會發生這種情況以及需要做些什麼來為 DHCP 正確設置主機名?目標是到達k8sm.k8s.home本例中使用的機器。

hostnamectl向我顯示 VM 中的正確主機名

root@k8sm:~# hostnamectl status
  Static hostname: k8sm.k8s.home
        Icon name: computer-vm
          Chassis: vm
       Machine ID: 001637a6a5e0410f923cb082af1953d2
          Boot ID: 853577fa58844d8e900c107cfb0c1dde
   Virtualization: kvm
 Operating System: Ubuntu 18.04.2 LTS
           Kernel: Linux 4.15.0-50-generic
     Architecture: x86-64

主機和虛擬機都執行 18.04 LTS 和 KVM 2.11.1。

我嘗試的另一種方法

preserve_hostname: true
runcmd:
 - hostnamectl set-hostname k8sm
 - hostnamectl set-hostname k8sm --static

這個想法是跳過 cloudinits 主機名設置preserve_hostname並手動設置它(稍後),但結果是一樣的:VM 被註冊為ubuntu而不是它的新主機名。

經過一番頭疼後,我意識到問題通過重新啟動 VM 得到了解決:

power_state:
 delay: now
 mode: reboot
 message: Reboot to apply new hostname
 timeout: 10

這是可行的,但與我在創建機器後執行的 Ansible 配置衝突。它也延遲了一切。此外,我想了解為什麼會發生這種行為。由於重新啟動工作正常,我假設一個時間問題而不是systemd: DHCP 獲得了預設ubuntu主機名,然後 cloudinit 可以應用它。然後它不會自動更新。也許在下一次租約中,但我想要一個即時解決方案。

找到一篇解釋如何強制發布的文章,並且這是手動工作的。所以我用power_state這些shell命令替換了上面的重啟:

runcmd: 
 - dhclient -r
 - dhclient

現在 DNS 按預期工作,無需重新啟動整個機器:

root@k8sm:~# ping k8sm
PING k8sm.k8s.home (192.168.2.48) 56(84) bytes of data.

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