~sergio

ARTIGOS

Alpine 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:
  1. README.Alpine do paquete Cloud Init
  2. Proxecto git para crear imaxes oficiales
Proxmox VE:
  1. Soporte cloud-init
  2. FAQ cloud-init - Creando unha imaxen personalizada

Crear imaxen cloud-init

Crear imaxen base
  1. Descarga a ISO "VIRTUAL" no almacenamento compartido para ISOs no cluster PVE.
  2. 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
  3. 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
  4. 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
  5. 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