Вопрос или проблема
У меня есть следующая конфигурация cloud-init
:
user-data
:
#cloud-config
users:
- name: k8s_user
gecos: k8s_user
shell: /bin/bash
primary_group: k8s
groups: users
sudo: ALL=(ALL) NOPASSWD:ALL
ssh_authorized_keys:
- ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDX2gcunVOrLn5ULiht/FJo4xHjslWubSG7K5b5YFaF6
package_update: true
package_upgrade: true
packages:
- ca-certificates
- curl
runcmd:
- curl -LsSf https://get.k3s.io | sh -
meta-data
:
instance-id: iid-k8s-vm
local-hostname: k8s-vm
network-config
:
version: 2
ethernets:
ens3:
dhcp4: true
И я хочу использовать это для создания виртуальной машины следующим образом:
genisoimage -output cloud-init.iso -volid cidata -J -R user-data meta-data network-config
virt-install \
--name k8s-vm \
--os-variant ubuntu22.04 \
--vcpus 2 \
--memory 2048 \
--disk path=./jammy-server-cloudimg-amd64.img,format=qcow2,bus=virtio \
--disk path=./cloud-init.iso,device=cdrom \
--network network=default,model=virtio \
--graphics none \
--console pty,target_type=serial \
--import
Это не работает должным образом, во-первых, во время загрузки я застреваю на Reached target Host and Network Name Lookups.
на две минуты, а затем, когда это пропускается, IP-адрес не присвоен виртуальной машине. Почему это происходит? Я предполагаю, что это проблема с libvirtd
, но ранее я мог создавать виртуальные машины на той же машине через Terraform, и в тех случаях DHCP работал.
.
Ответ или решение
Теория
Cloud-init — это инструмент, который используется для инициализации виртуальных машин с заданными конфигурациями. Он обеспечивает автоматическую настройку систем, включая управление пользователями, установку пакетов и настройку сети. В вашем случае вы используете cloud-init для создания и конфигурации виртуальной машины (VM) с назначением IP-адреса с помощью DHCP
.
Судя по предоставленной информации, вы сталкиваетесь с проблемой, когда ваша VM не получает IP-адрес. Это обычно может быть связано с несколькими факторами:
- Причины сети: Плохая конфигурация сети может привести к тому, что DHCP-клиент не получает IP-адрес.
- Настройки конфигурации cloud-init: Ошибки в файлах конфигурации могут привести к неверной инициализации.
- Проблемы с виртуализатором: Неправильная конфигурация или неполадки с
libvirt
могут блокировать получение IP. - Проблемы с DHCP-сервером: Даже если VM правильно настроен, оно не сможет получить IP, если DHCP-сервер недоступен или неправильно настроен.
Пример
Рассмотрим ваш файл конфигурации cloud-init
и сценарий, используемый для создания VM:
-
Конфигурация пользовательских данных (
user-data
): Здесь определены настройки, касающиеся пользователей и пакетов, но настройки сети не указаны, что правильно, если вы используете отдельный файлnetwork-config
. -
Конфигурация сетевых данных (
network-config
): Вы задаетеDHCP
в версии 2 с используемым интерфейсомens3
. -
Создание ISO с образом: Генерация ISO-образа с использованием утилиты
genisoimage
— это успешный и распространенный метод. -
Распределение ресурсов через
virt-install
: Вы создаете VM с несколькими параметрами, включая подключение ISO-образа cloud-init черезcdrom
и указание модели сетиvirtio
.
Применение
Для решения данной проблемы, выполним следующие шаги:
-
Проверка конфигурации сети:
- Убедитесь, что
network-config
действительно выставлен на использоватьDHCP
для интерфейсаens3
. В коде, который вы предоставили, всё правильно настроено, одна это требует, чтобы виртуальная сетьdefault
была правильно настроенной на работу сDHCP
.
- Убедитесь, что
-
Проверка DHCP сервера:
- Убедитесь, что на вашей хост машине и в сети виртуальной машины настроен и запущен DHCP-сервер. Наиболее часто в
libvirt
используетсяdnsmasq
для предоставления DHCP, и он должен быть активен.
- Убедитесь, что на вашей хост машине и в сети виртуальной машины настроен и запущен DHCP-сервер. Наиболее часто в
-
Проверка логов:
- Изучите логи cloud-init, которые обычно находятся в
/var/log/cloud-init.log
и/var/log/cloud-init-output.log
, чтобы выявить ошибки, связанные с сетью. - Проверьте, что виртуальная сеть
default
активна и действует черезvirsh net-list
иvirsh net-info default
.
- Изучите логи cloud-init, которые обычно находятся в
-
Убедитесь в актуальности VM образа:
- Проверка правильности образа операционной системы: ваш текущий Hosted VM-образ (
jammy-server-cloudimg-amd64.img
) должен быть совместим с используемой конфигурацией с версииcloud-init
.
- Проверка правильности образа операционной системы: ваш текущий Hosted VM-образ (
-
Проверка настроек сети внутри VM:
- После установки убедитесь, что внутри ОС не происходит блокировки сети или есть некорректные маршруты, для этого можно использовать утилиты как
ipaddr
илиifconfig
для диагностики.
- После установки убедитесь, что внутри ОС не происходит блокировки сети или есть некорректные маршруты, для этого можно использовать утилиты как
-
Альтернативные проверки:
- Попробуйте перезагрузить
libvirtd
и, при необходимости, перезапустить виртуальные сети и убедиться, что ваше сетевое подключение протестировано с другими VM. - Рассмотрите использование дополнительной диагностики с
tcpdump
для мониторинга пакетов DHCP.
- Попробуйте перезагрузить
Уточнение каждой из этих областей повышает вероятность нахождения источника проблемы, связанной с отсутствием присвоение IP. Также это обеспечит более эффективное устранение проблемы и улучшит понимание работы cloud-init и сетевой подсистемы VM.