Ubuntu
使用 cloudinit 為 dhcp 伺服器設置主機名:Systemd 覆蓋 cloudinit 主機名
對於測試環境,我想使用 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
主機名,我在嘗試時沒有獲得 IPdig +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.