Instalación de Talos Linux para Kubernetes
Talos Linux es un sistema operativo inmutable diseñado exclusivamente para ejecutar Kubernetes: no tiene shell SSH, no tiene paquetes extra, y toda su gestión se realiza a través de una API segura. Esta arquitectura minimalista reduce drásticamente la superficie de ataque y simplifica las operaciones del clúster, convirtiendo a Talos en una opción ideal para entornos de producción que priorizan la seguridad.
Requisitos Previos
- Servidores bare-metal o VMs con soporte para UEFI (recomendado) o BIOS
- Mínimo 2 vCPUs y 2 GB de RAM por nodo (4 GB recomendado para control plane)
- Acceso a la red para descargar las imágenes de Talos
talosctlinstalado en tu máquina localkubectlinstalado para interactuar con el clúster una vez creado
Instalación de talosctl
# Instalar talosctl en tu máquina local (macOS/Linux)
curl -sL https://talos.dev/install | sh
# Verificar la instalación
talosctl version --client
# También disponible mediante Homebrew en macOS
brew install siderolabs/tap/talosctl
# Descargar una versión específica manualmente
TALOS_VERSION="v1.7.0"
curl -Lo /usr/local/bin/talosctl \
"https://github.com/siderolabs/talos/releases/download/${TALOS_VERSION}/talosctl-linux-amd64"
chmod +x /usr/local/bin/talosctl
Generación de Configuraciones de Máquina
Talos utiliza archivos de configuración YAML para definir el comportamiento de cada nodo.
# Definir las IPs de los nodos del clúster
CONTROL_PLANE_IP="192.168.1.100"
CLUSTER_ENDPOINT="https://${CONTROL_PLANE_IP}:6443"
# Generar los secretos y configuraciones del clúster
talosctl gen config mi-cluster ${CLUSTER_ENDPOINT} \
--output-dir ./talos-config
# Esto genera tres archivos:
# - controlplane.yaml (configuración para nodos del control plane)
# - worker.yaml (configuración para nodos worker)
# - talosconfig (credenciales del cliente talosctl)
ls -la ./talos-config/
Personalizar la configuración del control plane para producción:
# Aplicar parches de configuración personalizada
cat > patch-control-plane.yaml << 'EOF'
machine:
network:
interfaces:
- interface: eth0
dhcp: false
addresses:
- 192.168.1.100/24
routes:
- network: 0.0.0.0/0
gateway: 192.168.1.1
nameservers:
- 8.8.8.8
- 1.1.1.1
time:
servers:
- pool.ntp.org
install:
disk: /dev/sda
image: ghcr.io/siderolabs/installer:v1.7.0
bootloader: true
wipe: false
cluster:
# Habilitar métricas del scheduler y controller manager
scheduler:
extraArgs:
bind-address: 0.0.0.0
controllerManager:
extraArgs:
bind-address: 0.0.0.0
# Habilitar cifrado de secrets en etcd
aescbcEncryptionSecret: ""
etcd:
extraArgs:
election-timeout: "5000"
heartbeat-interval: "250"
EOF
# Generar configuración con el parche aplicado
talosctl gen config mi-cluster ${CLUSTER_ENDPOINT} \
--output-dir ./talos-config \
--config-patch @patch-control-plane.yaml
Bootstrap del Clúster
# Arrancar el primer nodo de control plane
# Primero, arrancar el servidor desde la ISO de Talos
# (disponible en https://factory.talos.dev)
# Aplicar la configuración al nodo mientras está en modo de mantenimiento
talosctl apply-config \
--nodes 192.168.1.100 \
--file ./talos-config/controlplane.yaml \
--insecure
# Si hay múltiples nodos de control plane (HA)
talosctl apply-config \
--nodes 192.168.1.101 \
--file ./talos-config/controlplane.yaml \
--insecure
talosctl apply-config \
--nodes 192.168.1.102 \
--file ./talos-config/controlplane.yaml \
--insecure
# Configurar talosctl para usar el clúster
export TALOSCONFIG=./talos-config/talosconfig
talosctl config endpoint 192.168.1.100
talosctl config node 192.168.1.100
# Inicializar (bootstrap) el clúster etcd (solo en el PRIMER control plane)
talosctl bootstrap
# Esperar a que el clúster esté listo
talosctl health --wait-timeout=10m
# Aplicar configuración a los workers
talosctl apply-config \
--nodes 192.168.1.110 \
--file ./talos-config/worker.yaml \
--insecure
talosctl apply-config \
--nodes 192.168.1.111 \
--file ./talos-config/worker.yaml \
--insecure
Acceso a la API de Talos
# Obtener el kubeconfig para kubectl
talosctl kubeconfig ./kubeconfig
export KUBECONFIG=./kubeconfig
# Verificar el estado del clúster
kubectl get nodes
kubectl get pods -A
# Ver el estado de los servicios en un nodo Talos
talosctl services
# Ver logs de un servicio específico
talosctl logs kubelet
talosctl logs containerd
talosctl logs etcd
# Listar los discos disponibles en un nodo
talosctl disks
# Ver la configuración actual aplicada
talosctl get machineconfig -o yaml
# Ejecutar comandos en el nodo (equivalente a SSH, pero a través de la API)
talosctl read /etc/os-release
talosctl dmesg | tail -50
Configuración de Almacenamiento
Talos requiere configuración específica para usar discos locales con Kubernetes.
# Ver los discos disponibles en los nodos
talosctl disks --nodes 192.168.1.110
# Configurar un disco adicional para almacenamiento
cat > patch-worker-storage.yaml << 'EOF'
machine:
kubelet:
extraMounts:
- destination: /var/mnt/data
type: bind
source: /var/mnt/data
options:
- bind
- rshared
- rw
disks:
- device: /dev/sdb
partitions:
- mountpoint: /var/mnt/data
EOF
# Aplicar el parche al worker
talosctl apply-config \
--nodes 192.168.1.110 \
--file ./talos-config/worker.yaml \
--config-patch @patch-worker-storage.yaml
# Para usar Longhorn o OpenEBS, instalar los módulos del kernel necesarios
cat > patch-kernel-modules.yaml << 'EOF'
machine:
kernel:
modules:
- name: iscsi_tcp
- name: dm_snapshot
- name: dm_mirror
- name: dm_thin_pool
EOF
Actualizaciones del Clúster
Talos facilita las actualizaciones sin tiempo de inactividad gracias a su modelo inmutable.
# Actualizar Talos en un nodo de control plane
talosctl upgrade \
--nodes 192.168.1.100 \
--image ghcr.io/siderolabs/installer:v1.7.1
# Monitorear el progreso de la actualización
talosctl health --nodes 192.168.1.100 --wait-timeout=10m
# Actualizar los workers uno a uno
talosctl upgrade --nodes 192.168.1.110 \
--image ghcr.io/siderolabs/installer:v1.7.1
# Actualizar Kubernetes (solo el control plane version)
talosctl upgrade-k8s --to 1.30.0
# Verificar la versión de Kubernetes tras la actualización
kubectl version --short
Modelo de Seguridad
# Verificar que no hay acceso SSH (esto debe fallar)
ssh 192.168.1.100 # Connection refused - comportamiento esperado
# Todas las operaciones se hacen mediante la API de Talos con mTLS
# Las credenciales están en el talosconfig
# Rotar los certificados del cliente
talosctl rotate-ca --with-docs=false
# Ver los certificados actuales
talosctl get certs
# Verificar integridad del sistema (Talos aplica SecureBoot cuando está disponible)
talosctl get securitystate
# Auditar los cambios de configuración
talosctl events --duration=1h | grep -i config
# Listar los usuarios de la API (solo máquinas, no usuarios humanos)
talosctl get users
Solución de Problemas
El nodo no arranca correctamente:
# Ver la consola del nodo (requiere acceso físico o iDRAC/iLO)
# Alternativamente, ver los eventos desde talosctl
talosctl dmesg --nodes 192.168.1.100 | grep -i error
# Ver el estado del bootstrap
talosctl get bootstrapstatus
El clúster etcd no se levanta:
# Verificar el estado de etcd
talosctl etcd status
# Si el bootstrap falla, verificar logs
talosctl logs etcd --nodes 192.168.1.100
# Reintentar el bootstrap si es necesario
talosctl bootstrap --nodes 192.168.1.100
Problemas de red en los nodos:
# Ver la configuración de red actual
talosctl get addresses
talosctl get routes
talosctl get links
# Verificar el estado de los interfaces de red
talosctl network interfaces
Conclusión
Talos Linux representa un enfoque radicalmente diferente al sistema operativo para Kubernetes: al eliminar todo lo innecesario (SSH, shell, paquetes extra), reduce la superficie de ataque a un mínimo absoluto mientras facilita las operaciones mediante su API declarativa. Para equipos que buscan un clúster Kubernetes seguro, reproducible y fácil de actualizar en producción, Talos es una opción difícil de superar.


