Talos Linux es un sistema operativo inmutable y mínimo diseñado solo para ejecutar Kubernetes: no tiene shell, ni SSH, ni gestor de paquetes, y toda su administración se hace por una API autenticada con mTLS mediante talosctl. En este tutorial crearás un clúster con un nodo de control plane y un worker a partir de la ISO de Talos, obtendrás el kubeconfig para kubectl y verás cómo inspeccionar y actualizar los nodos. Los comandos de talosctl se ejecutan desde tu equipo, no en los nodos.

Requisitos previos

Para seguir esta guía necesitas:

  • Dos máquinas (servidores bare metal o máquinas virtuales) en las que puedas arrancar una ISO, por ejemplo mediante la consola remota o el medio virtual del BMC, o desde tu hipervisor. Cada una con al menos 2 vCPU, 2 GB de RAM (4 GB para el control plane) y un disco de 10 GB o más que se borrará por completo.
  • IPs fijas o reservas DHCP para cada nodo. En la guía se usan 192.168.1.100 para el control plane y 192.168.1.110 para el worker.
  • Un equipo Linux o macOS con acceso de red a los nodos en los puertos 50000/TCP (API de Talos) y 6443/TCP (API de Kubernetes), y con kubectl instalado.

Paso 1: Instalar talosctl

Descarga el binario de la última versión publicada en GitHub e instálalo en /usr/local/bin. En un equipo arm64 cambia amd64 por arm64, y en macOS usa talosctl-darwin-amd64 o talosctl-darwin-arm64:

curl -LO https://github.com/siderolabs/talos/releases/latest/download/talosctl-linux-amd64
sudo install -m 0755 talosctl-linux-amd64 /usr/local/bin/talosctl
rm talosctl-linux-amd64

En macOS también puedes usar Homebrew con brew install siderolabs/tap/talosctl. Comprueba la versión del cliente:

talosctl version --client
Client:
	Tag:         v1.x.x
	...

Anota esa versión: la ISO que descargues en el siguiente paso debe ser de la misma.

Paso 2: Arrancar los nodos con la ISO de Talos

Genera la imagen en Image Factory: elige Bare-metal Machine, la versión de Talos que coincide con tu talosctl, la arquitectura y, si los necesitas, extensiones de sistema (por ejemplo firmware o drivers). Al final la página te da dos cosas:

  • El enlace a la ISO, que usarás ahora para arrancar los nodos.
  • La imagen del instalador, del tipo factory.talos.dev/installer/<schematic_id>:v1.x.x, que usarás para las actualizaciones.

Arranca las dos máquinas desde la ISO. Talos se inicia en modo de mantenimiento, sin instalar nada todavía, y muestra en la consola la IP que ha obtenido.

Desde tu equipo, consulta los discos del nodo de control plane para saber en cuál instalar. En modo de mantenimiento no hay credenciales, por eso se usa --insecure:

talosctl get disks --insecure --nodes 192.168.1.100
NODE   NAMESPACE   TYPE   ID      VERSION   SIZE     READ ONLY   TRANSPORT   ROTATIONAL   WWID   MODEL
       runtime     Disk   sda     1         107 GB   false       virtio      true                QEMU HARDDISK
       runtime     Disk   sr0     1         106 MB   true        ata                              QEMU DVD-ROM

En este ejemplo el disco de instalación es /dev/sda. En servidores con NVMe será algo como /dev/nvme0n1.

Paso 3: Generar la configuración del clúster

Crea un directorio para el clúster y genera primero los secretos (CA de Kubernetes, CA de Talos, claves de etcd). Guardarlos aparte te permite regenerar las configuraciones más adelante sin crear un clúster nuevo:

mkdir -p ~/talos-cluster && cd ~/talos-cluster
talosctl gen secrets -o secrets.yaml

Genera las configuraciones de máquina. El endpoint es la URL de la API de Kubernetes, que en un clúster con un único control plane es su IP:

talosctl gen config my-cluster https://192.168.1.100:6443 \
  --with-secrets secrets.yaml \
  --install-disk /dev/sda
generating PKI and tokens
Created controlplane.yaml
Created worker.yaml
Created talosconfig
  • controlplane.yaml: configuración de los nodos de control plane.
  • worker.yaml: configuración de los workers.
  • talosconfig: credenciales de cliente para talosctl.

Si quieres un clúster de un solo nodo donde el control plane también ejecute cargas de trabajo, crea un parche:

nano allow-scheduling.yaml
cluster:
  allowSchedulingOnControlPlanes: true

Y añade --config-patch-control-plane @allow-scheduling.yaml al comando talosctl gen config anterior (con --force para sobrescribir los archivos).

Paso 4: Instalar Talos en el control plane e inicializar el clúster

Aplica la configuración al nodo de control plane. Talos se instala en el disco, reinicia y arranca ya configurado:

talosctl apply-config --insecure --nodes 192.168.1.100 --file controlplane.yaml

A partir de aquí la comunicación usa mTLS, así que indica a talosctl qué archivo de credenciales, endpoint y nodo usar por defecto:

export TALOSCONFIG=~/talos-cluster/talosconfig
talosctl config endpoint 192.168.1.100
talosctl config node 192.168.1.100

Espera uno o dos minutos a que el nodo termine de instalarse y reiniciar. Cuando talosctl version devuelva también la sección Server, inicializa etcd. Este comando se ejecuta una sola vez y solo en un nodo de control plane:

talosctl bootstrap

Talos arranca etcd y los componentes de Kubernetes. Sigue el progreso con el panel de estado, que se cierra con Ctrl+C:

talosctl dashboard

Paso 5: Añadir el worker

Aplica worker.yaml al segundo nodo, que sigue en modo de mantenimiento:

talosctl apply-config --insecure --nodes 192.168.1.110 --file worker.yaml

El worker se instala, reinicia y se une al clúster por sí solo usando el token incluido en su configuración. Cuando termine, comprueba la salud del clúster completo:

talosctl health
discovered nodes: ["192.168.1.100" "192.168.1.110"]
waiting for etcd to be healthy: OK
waiting for etcd members to be consistent across nodes: OK
waiting for etcd members to be control plane nodes: OK
waiting for apid to be ready: OK
waiting for all nodes memory sizes: OK
waiting for all nodes disk sizes: OK
waiting for kubelet to be healthy: OK
waiting for all nodes to finish boot sequence: OK
waiting for all k8s nodes to report: OK
waiting for all k8s nodes to report ready: OK
...

Paso 6: Acceder al clúster con kubectl

Descarga el kubeconfig del clúster a un archivo propio:

talosctl kubeconfig ./kubeconfig
export KUBECONFIG=~/talos-cluster/kubeconfig

Si ejecutas talosctl kubeconfig sin argumento, lo fusiona con tu ~/.kube/config. Comprueba los nodos:

kubectl get nodes -o wide
NAME            STATUS   ROLES           AGE   VERSION   INTERNAL-IP     OS-IMAGE
talos-cp-1      Ready    control-plane   6m    v1.3x.x   192.168.1.100   Talos (v1.x.x)
talos-worker-1  Ready    <none>          2m    v1.3x.x   192.168.1.110   Talos (v1.x.x)

Talos instala por defecto Flannel como CNI y kube-proxy, así que los nodos quedan en Ready sin más pasos. Si prefieres otro CNI, como Cilium, hay que desactivar el de serie en la configuración antes de crear el clúster.

Paso 7: Operar los nodos sin SSH

Como no hay shell, las tareas habituales de diagnóstico se hacen con talosctl. Añade --nodes <ip> para dirigirte a un nodo distinto del predeterminado:

talosctl services
talosctl logs kubelet
talosctl dmesg
talosctl get members
talosctl etcd members
  • services lista los servicios del sistema y su estado.
  • logs muestra el log de un servicio (kubelet, etcd, containerd...).
  • get members muestra los nodos que Talos ha descubierto en el clúster.

Para cambiar la configuración de un nodo ya instalado, edita el archivo YAML correspondiente y vuelve a aplicarlo, esta vez sin --insecure:

talosctl apply-config --nodes 192.168.1.110 --file worker.yaml

Talos aplica en caliente los cambios que lo permiten y reinicia el nodo solo cuando es necesario.

Paso 8: Actualizar Talos y Kubernetes

Talos se actualiza sustituyendo la imagen completa del sistema, con vuelta atrás automática si el nodo no arranca bien. Usa la imagen de instalador de Image Factory del paso 2 con la nueva versión y actualiza los nodos de uno en uno, empezando por el control plane:

talosctl upgrade --nodes 192.168.1.100 --image factory.talos.dev/installer/<schematic_id>:v1.x.y

Espera a que talosctl health vuelva a pasar y repite con cada worker. Actualiza también tu talosctl a la misma versión.

La versión de Kubernetes se actualiza aparte. upgrade-k8s actualiza los componentes del control plane y los kubelets de todos los nodos de forma ordenada:

talosctl upgrade-k8s --to 1.3x.y

Consulta antes la matriz de compatibilidad de Talos para confirmar qué versiones de Kubernetes admite tu versión de Talos.

Solución de problemas

talosctl devuelve errores de certificado o connection refused tras aplicar la configuración. El nodo está reiniciando o aún se está instalando. Espera y comprueba que usas el talosconfig correcto con echo $TALOSCONFIG. Recuerda que --insecure solo sirve en modo de mantenimiento.

talosctl bootstrap falla con AlreadyExists. etcd ya se inicializó. No lo repitas: ejecutar bootstrap en un segundo nodo crearía un clúster etcd independiente.

El nodo se instaló en el disco equivocado o no encuentra disco. Revisa talosctl get disks y el valor de machine.install.disk en controlplane.yaml o worker.yaml.

Conclusión

Has instalado Talos Linux en dos nodos, inicializado el clúster con talosctl bootstrap y accedido a Kubernetes con kubectl, además de ver cómo inspeccionar y actualizar los nodos sin SSH. Como siguientes pasos puedes pasar a tres nodos de control plane con una IP virtual o un balanceador delante de la API, sustituir Flannel por Cilium e instalar un proveedor de almacenamiento persistente.