~sergio
ARTIGOSAlpine cloud-init
05-09-2023
Preámbulo
O seguinte procedemento describe como crear un pequeno template cloud-init con Alpine Linux para crear máquinas virtuales en un servidor ou cluster Proxmox VE.
As Imaxes Cloud oficiales solo están dispoñibles para AWS actualmente (sept. 2023), esto mostra como facer unha imaxen cloud-init NoCloud adecuada para Proxmox VE.
Referencias
Alpine Linux: Proxmox VE:Crear imaxen cloud-init
Crear imaxen base
- Descarga a ISO "VIRTUAL" no almacenamento compartido para ISOs no cluster PVE.
-
Crea a máquina virtual (VM):
- Usa un número elevado para identificala con facilidade logo cando seña un template (ex.: 9000)
- Sin CD/DVD de instalación (aplicarase despóis)
- 1 GB de disco duro, pódese aumentar despóis
- 1024 MiB RAM sendo 512 MiB o mínimo
-
Configurar VM:
- Quita o DVD/CD "IDE 2" que está por defecto.
- Agrega a ISO subida como DVD/CD - SCSI 2
- Desactiva o arranque por rede no Boot Order
-
Instalar Alpine Linux na VM:
- Sigue os pasos de instanación normales
- Agrega o usuario por defecto "alpine", logo pódese agregar outro usando cloud-init si é necesario.
- Reboot
- Crea unha snapshot; sí, faino.
Copia as chaves á VM para acceder como root por SSH
Usa a Consola do Proxmox para facer a configuración como root máis fácil, a configuración por defecto desactiva o acceso con contraseña como root.
Na VM:
# Permite o login de root con clave por sshd vi /etc/ssh/sshd_config # Engade PermitRootLogin yes # Reinicia o demonio SSH service sshd restart
No PC que ten as claves que se van a copiar:
# Copia as claves deste PC na VM ssh-copy-id root@direccion-IP-da-VM
De volta na VM:
# Desactiva o login de root no ssh vi /etc/ssh/sshd_config # Quita PermitRootLogin yes # Reinicia o demonio SSH service sshd restart
Configurar a VM
Conecta coa VM
ssh root@direccion-IP-da-VM
Prepara o sistema operativo
# Activa todos os repositorios (test fai falta para os executables do kubernetes) vi /etc/apk/repositories # Actualiza o sistema apk upgrade --no-cache --available # Instala os paquetes necesarios apk --no-cache --cache-max-age 30 add \ cloud-init \ util-linux \ chrony \ openssh-server-pam \ doas \ sudo \ e2fsprogs \ e2fsprogs-extra \ dosfstools \ gettext \ lsblk \ parted \ tzdata # Actualiza as opciós do kernel sed -Ei \ -e "s|^[# ]*(default_kernel_opts)=.*|\1=\"console=ttyS0,115200n8 cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory\"|" \ -e "s|^[# ]*(serial_port)=.*|\1=ttyS0|" \ -e "s|^[# ]*(modules)=.*|\1=sd-mod,usb-storage,ext4|" \ -e "s|^[# ]*(default)=.*|\1=virt|" \ -e "s|^[# ]*(timeout)=.*|\1=1|" \ "/etc/update-extlinux.conf" /sbin/extlinux --install /boot /sbin/update-extlinux --warn-only # Desactiva getty para os ttys físicos, e activa getty para o terminal serie ttyS0. sed -Ei -e '/^tty[0-9]/s/^/#/' -e '/^#ttyS0:/s/^#//' "/etc/inittab"
# configura sudo e doas # --- si NON queres que requira contraseña --- echo '%wheel ALL=(ALL) NOPASSWD: ALL' > "/etc/sudoers.d/wheel" echo 'permit nopass :wheel' > "/etc/doas.d/wheel.conf" # --- si queres que requira contraseña --- echo '%wheel ALL=(ALL) ALL' > "/etc/sudoers.d/wheel" echo 'permit persist :wheel' > "/etc/doas.d/wheel.conf" # pecha explícitamente a conta de root /bin/sh -c "/bin/echo 'root:*' | /usr/sbin/chpasswd -e" /usr/bin/passwd -l root # actualiza os servicios rc-update add chronyd default
Configurar cloud-init
Ahora é o momento de configurar cloud-init.
Configura a VM
O paquete cloud-init instalouse previamente cos demáis prerequisitos.
# Configura as opciós por defecto do cloud-init setup-cloud-init # Configura Proxmox como Datasource echo 'datasource_list: [ NoCloud, ConfigDrive ]' > "/etc/cloud/cloud.cfg.d/99_pve.cfg" # Apaga a VM e **NON** a reinicies polo momento poweroff
Configura Proxmox
En unha shell do servidor promox (non na VM, no servidor), tendo en conta que 9000 e o ID da VM.
Engade un CDROM virtual para a configuración cloud-init (cloud-init vai ler a configuración da unidade montada)
qm set 9000 --ide2 local-lvm:cloudinit
Configura o dispositivo de arranque:
qm set 9000 --boot c --bootdisk scsi0
Activa o dispositivo serie
qm set 9000 --serial0 socket --vga serial0
A ter en conta:
En Proxmox a configuración da NIC por defecto é unha dirección estática
vacía, fai falta que esteña como DHCP:
Selecciona a VM(9000) e configura o template para que use DHCP ("Cloud-Init
-> IP Config(net0)"). Sempre se poderá definir unha dirección IP
estática nos clones que se faigan deste template si fai falta.
Probar o contenedor antes de convertilo en un template
Pódese facer na UI do Proxmox ou no terminal:
qm clone 9000 1024 --name AlpineTest
Nas opciós cloud-init da VM 1024, configura "User", "Password" e agrega unha "SSH public key" ANTES de iniciar a VM por primeira vez. Recorda pulsar o botón Regenerate Image para actualizar o CDROM que contén a configuración cloud-init.
Arranca AlpineTest e deberías ter unha VM coa configuración indicada.
Convirte a imaxen VM en un template de Proxmox
ATENCIÓN: Esto non se pode desfacer!
Tanto na UI do Proxmox coma no terminal (terás que borrar antes as snapshots):
qm template 9000
Crear unha VM desde o template
Non te esquezas de cambiar o Mode: a Full Clone!
A continuación figuran algunhos cambios opcionáis donde 1024 é o ID da VM clonada:
Redimensiona o disco duro (ANTES de arrancar!)
Aumenta o tamaño do disco duro ANTES de arrancar o clon, cloud-init expandirá automáxicamente a partición root para que cuadre co novo tamaño.
En unha shell no servidor proxmox (non na VM) engade 5G á capacidade do disco:
qm resize 1024 scsi0 +5G
Incrementa a RAM
Modifica a RAM no Proxmox VM (1024) -> Hardware -> Memory
Instala o Guest Agent QEMU
VM
sudo apk add qemu-guest-agent
Proxmox
Activa o soporte «guest agent» no Proxmox VM (1024) -> Hardware -> Memory
Instala outra shell
A shell por defecto en Alpine é /bin/ash, podes instalar calquera shell, p.ex.: bash
Instala bash e bash-completion
sudo apk add bash bash-completion
Cambia a shell do usuario con chsh
chsh -s /bin/bash
Reconecta...
Créditos
Inspirado nas probas de cloud-init tras ver Perfect Proxmox Template with Cloud Image and Cloud Init por TechnoTim