Instalando k3s en hardware baremetal - tutorial paso a paso y con terraform
Instalando little k3s kubernetes en un clúster de homelab
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.
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
ysudo
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 unkubectl
instalado comok3s kubectl
o enlazado comokubectl
.
📍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.
- Copia a tu máquina local y
-
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
osudo 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
-
Ya tienes:
- 3 servidores con IPs fijas, accesibles mediante SSH.
- Acceso SSH (basado en claves).
- Terraform y Ansible instalados localmente.
-
Sistema operativo objetivo: Ubuntu/Debian (puede personalizarse).
-
Estás usando provisionador de Terraform
local-exec
o plugin de provisionador de Ansible (usaremoslocal-exec
aquí por portabilidad).
📁 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
- https://k3s.io/
- Hoja de trucos de Kubernetes
- Instalar Kubernetes con Kubespray
- Hoja de trucos de Terraform - comandos útiles y ejemplos
- Distribuciones de Kubernetes - vista general de kubeadm, k3s, MicroK8s, Minikube, Talos Linux y RKE2
- Comparación de distribuciones de Kubernetes para un laboratorio doméstico de 3 nodos
- Cómo instalar Ubuntu 24.04 y herramientas útiles
- Hoja de trucos de Docker
- Hoja de trucos de Docker Compose - comandos más útiles con ejemplos