Для тестовой среды я хочу подключить несколько виртуальных машин с использованием 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 user-data
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
показывает мне правильное имя хоста в виртуальной машине
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
и установить его вручную (позже), но результат тот же: виртуальная машина была зарегистрирована как ubuntu
вместо нового имени хоста.
После некоторых головных болей я понял, что проблема была решена путем перезагрузки виртуальной машины:
power_state:
delay: now
mode: reboot
message: Reboot to apply new hostname
timeout: 10
Это работает, но конфликтует с моей обработкой Ansible после создания машины. И это тоже все задерживает. Кроме того, я хочу понять , почему возникает такое поведение. Поскольку перезагрузка работает, я предположил проблему синхронизации вместо systemd
: DHCP получил имя хоста по умолчанию ubuntu
, прежде чем cloudinit смог его применить. Тогда он не будет обновляться автоматически. Может, при следующей аренде, но мне нужно мгновенное решение.
Нашел статью, в которой объясняется, как принудительно разблокировать , и это работало вручную. Поэтому я заменил перезагрузку с помощью power_state
выше на эти команды оболочки:
runcmd:
- dhclient -r
- dhclient
Теперь DNS работает, как ожидалось, без перезагрузки всей машины:
root@k8sm:~# ping k8sm
PING k8sm.k8s.home (192.168.2.48) 56(84) bytes of data.