Для тестовой среды я хочу подключить несколько виртуальных машин с использованием 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
показывает мне правильное имя хоста в виртуальной машине
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.