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
  • talosctl instalado en tu máquina local
  • kubectl instalado 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.