Instalando k3s en hardware baremetal - tutorial paso a paso y con terraform

Instalando little k3s kubernetes en un clúster de homelab

Índice

Aquí tienes un recorrido paso a paso de
instalación de un clúster K3s de 3 nodos
en servidores de metal desnudo (1 maestro + 2 trabajadores).

Este guía asume que estás empezando con una instalación mínima
de Linux
(por ejemplo, Ubuntu 22.04 o Debian) en cada servidor,
y quieres auto-hospedar tu plano de control y cargas de trabajo.

clúster Kubernetes de metal desnudo

K3s
es una
versión ligera de Kubernetes,
que se adapta bien para este pequeño laboratorio doméstico.

⚙️ Topología del Clúster

Nombre del Nodo Rol Hostname/IP
master-1 Servidor (Plano de Control) 192.168.1.100
worker-1 Agente (Nodo Trabajador) 192.168.1.101
worker-2 Agente (Nodo Trabajador) 192.168.1.102

✅ Requisitos previos

🧱 Hardware (Mínimo):

  • CPU: 2 núcleos
  • RAM: 2GB+ por nodo
  • Disco: 20GB+ por nodo

🛠 Requisitos del sistema operativo:

  • Linux (Ubuntu 22.04, Debian 12, etc.)
  • curl, ssh y sudo instalados
  • Acceso como root o con sudo

🧼 Red limpia:

  • Asegúrate de que todos los nodos puedan resolver y hacer ping entre sí por IP o nombre de host.

  • Desactiva el intercambio:

    sudo swapoff -a
    sudo sed -i '/ swap / s/^/#/' /etc/fstab
    

🚀 Instalación paso a paso


📍Paso 1: Instalar K3s en el plano de control (master-1)

curl -sfL https://get.k3s.io | sh -

Después de la instalación:

sudo cat /var/lib/rancher/k3s/server/node-token
  • Esto te da el token de unión necesario para los nodos trabajadores.

Confirma que el clúster está en ejecución:

sudo kubectl get nodes

k3s incluye un kubectl instalado como k3s kubectl o enlazado como kubectl.


📍Paso 2: Instalar agentes K3s (worker-1 y worker-2)

Repite en cada nodo trabajador:

Reemplaza <MASTER_IP> y <NODE_TOKEN> con los valores del paso 1.

curl -sfL https://get.k3s.io | K3S_URL=https://192.168.1.100:6443 K3S_TOKEN=<NODE_TOKEN> sh -

Ejemplos:

K3S_URL=https://192.168.1.100:6443 \
K3S_TOKEN=K10abcde123456789::server:abcde123456789 \
sh -c "$(curl -sfL https://get.k3s.io)"

📍Paso 3: Verificar el clúster desde master-1

kubectl get nodes

Deberías ver:

NAME        STATUS   ROLES    AGE   VERSION
master-1    Ready    control  5m    v1.29.2+k3s1
worker-1    Ready    <none>   2m    v1.29.2+k3s1
worker-2    Ready    <none>   2m    v1.29.2+k3s1

🔐 (Opcional) Habilitar alta disponibilidad (HA)

Para una alta disponibilidad similar a producción (opcional en laboratorios domésticos):

  • Usa una base de datos externa (por ejemplo, MySQL/PostgreSQL/etcd).
  • Ejecuta múltiples nodos de servidor con la bandera --server y base de datos compartida.
  • Ver: Documentación de HA de K3s

🧪 Probar una implementación

kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=LoadBalancer
kubectl get svc

Verifica el acceso mediante curl http://<worker-ip>:<port> o configura MetalLB para IPs de balanceador externo.


🧰 Notas útiles

  • Kubeconfig: /etc/rancher/k3s/k3s.yaml

    • Copia a tu máquina local y export KUBECONFIG=... para gestionar desde remoto.
  • Servicios systemd:

    • sudo systemctl status k3s
    • sudo systemctl status k3s-agent (en trabajadores)

💡 Extras (Opcionales)

  • K9s: Interfaz de terminal para gestionar Kubernetes: brew install k9s o sudo snap install k9s

  • Dashboard: Actívalo con manifiestos:

    kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
    
  • MetalLB: Agrega soporte de balanceo de carga para metal desnudo:

    kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.10/config/manifests/metallb-native.yaml
    

📦 Limpieza

Para eliminar k3s:

# En el maestro:
/usr/local/bin/k3s-uninstall.sh

# En el trabajador:
/usr/local/bin/k3s-agent-uninstall.sh

Instalar un clúster K3s de 3 nodos de metal desnudo con Terraform

Aquí hay una plantilla de Terraform
que ayuda a provisionar un clúster K3s de 3 nodos de metal desnudo asumiendo que estás gestionando servidores Linux ya provisionados (por ejemplo, en tu LAN/laboratorio doméstico) mediante SSH y Ansible. Terraform invocará playbooks de Ansible para instalar K3s.


🧱 Suposiciones


📁 Estructura de directorios

k3s-cluster/
├── main.tf
├── inventory.ini
├── ansible/
│   └── install_k3s.yml
└── variables.tf

📄 variables.tf

variable "master_ip" {
  default = "192.168.1.100"
}

variable "worker_ips" {
  default = ["192.168.1.101", "192.168.1.102"]
}

variable "ssh_user" {
  default = "tu_usuario"
}

variable "ssh_private_key" {
  default = "~/.ssh/id_rsa"
}

📄 main.tf

provider "null" {}

resource "null_resource" "install_k3s" {
  provisioner "local-exec" {
    command = "ANSIBLE_HOST_KEY_CHECKING=False ansible-playbook -i inventory.ini ansible/install_k3s.yml --private-key ${var.ssh_private_key} -u ${var.ssh_user}"
  }

  triggers = {
    always_run = "${timestamp()}"
  }
}

📄 inventory.ini

[masters]
192.168.1.100

[workers]
192.168.1.101
192.168.1.102

[all:vars]
ansible_python_interpreter=/usr/bin/python3

📄 ansible/install_k3s.yml

---
- hosts: masters
  become: yes
  tasks:
    - name: Instalar k3s master
      shell: |
        curl -sfL https://get.k3s.io | sh -        
    - name: Obtener node-token
      shell: cat /var/lib/rancher/k3s/server/node-token
      register: node_token
      delegate_to: localhost

- hosts: workers
  become: yes
  tasks:
    - name: Unir trabajador al clúster
      shell: |
        curl -sfL https://get.k3s.io | K3S_URL=https://{{ hostvars['192.168.1.100']['ansible_host'] }}:6443 K3S_TOKEN={{ hostvars['192.168.1.100']['node_token']['stdout'] }} sh -        

Nota: Puedes necesitar ajustar el acceso a variables de IP o token según las versiones de Ansible. También puedes generar el token en el maestro y guardarlo en un archivo antes de ejecutar la instalación del trabajador.


🚀 Cómo ejecutar

Desde el directorio k3s-cluster/:

terraform init
terraform apply

🧰 Mejoras (Opcionales)

  • Usar generación dinámica de inventario (por ejemplo, desde DHCP/dnsmasq).
  • Añadir implementación de MetalLB mediante Ansible.
  • Añadir nombres de host y características de HA.
  • Reemplazar con rol de Ansible como xanmanning.k3s para mayor flexibilidad.

Enlaces útiles