En la entrada Pods en estado creatingContainer en K8s describía el problema surgido al crear un clúster de Kubernetes usando Vagrant. Al partir de la misma imagen, todas las máquinas del clúster tienen el mismo machine-id.

El machine-id debe ser único, como se describe en los requerimientos de Kubernetes; si no lo es, se producen problemas como el descrito.

En esta entrada analizo con más detalle cómo se crea el machine-id y cómo generar uno nuevo.

El fichero /etc/machine-id contiene un identificador único de la máquina que se establece durante la instalación o durante el arranque.

El machine ID se suele generar de una fuente aleatoria durante la instalación del sistema operativo o durante el primer arranque y permanece constante durante los siguientes arranques. Este machine ID no cambia al cambiar la configuración de red o cuando se modifica el hardware del sistema.

Este identificador tiene el mismo formato y lógica que el D-BUS machine ID.

De hecho, si el fichero /etc/machine-id no existe, podemos usar systemd-machine-id-setup para generar uno nuevo. Sin embargo, hay que tener en cuenta que:

If a valid D-Bus machine ID is already configured for the system, the D-Bus machine ID is copied and used to initialize the machine ID in /etc/machine-id.

Es decir, que si el D-Bus machine ID existe, no se genera un nuevo machine ID, sino que se reusa el D-Bus machine ID.

En la documentación de Kubernetes se indica este identificador debe ser único; sin embargo, en DMIDecode product_uuid and product_serial.what is the difference? se indica que el product_UUID está relacionado con la BIOS de la máquina (por lo que no puede ser cambiado).

He comprobado que todas las máquinas virtuales generadas por Vagrant a partir de la misma imagen base comparten el mismo identificador en /sys/class/dmi/id/product_uuid.

Pese a coincidir el product_uuid, tanto el machine ID como el D-Bus machine ID pueden “regenerarse”, de manera que sean únicos en cada máquina virtual:

sudo rm /etc/machine-id
sudo rm /var/lib/dbus/machine-id
sudo systemd-machine-id-setup

En la instalación de Kubernetes parece suficiente que el machine-id sea único.

Referencias: