Cómo construir y gestionar un clúster de Kubernetes de Raspberry Pi con fines educativos
Tags: kubernetes, raspberrypi, clustercomputing, educationaltechnology
Published: 2024-05-05 18:27:05

## Introducción
Esta guía está dirigida a estudiantes de ingeniería informática que tienen la intención de aprender a construir y gestionar un sistema de computación descentralizado como Kubernetes, con un ejemplo práctico de cómo crear un cluster utilizando dispositivos Raspberry Pi.

### ¿Qué es Kubernetes?
Kubernetes es una plataforma de código abierto que automatiza las operaciones de contenedores Linux. Elimina muchos de los procesos manuales involucrados en el despliegue y la escalabilidad de aplicaciones contenerizadas.

### Objetivo
Al final de este tutorial, podrás:
- Configurar varios Raspberry Pis para formar un cluster.
- Instalar y configurar Kubernetes usando una herramienta ligera llamada k3s.
- Desplegar y gestionar aplicaciones contenerizadas en el cluster.

## Configuración del Hardware
Nuestro cluster, llamado **clusperry**, consiste en 6 unidades de Raspberry Pi 4B, cada una con 4GB de RAM.

![Vista del Cluster](https://i.ibb.co/VwftyjW/IMG-6147.jpg)

### Configuración Inicial
1. **Crear Imágenes Linux:**
   - Usaremos una herramienta GUI desarrollada para generar imágenes de Linux, las cuales luego serán grabadas en tarjetas microSD.
   - Herramienta disponible en: [clusperry-installer](https://github.com/nullxx/clusperry-installer).

2. **Descargar y Configurar:**
   - Obtén la herramienta desde la [página de lanzamientos](https://github.com/nullxx/clusperry-installer/releases).
   - Elige el sistema operativo para los nodos y configura los ajustes de red y las llaves SSH.

![Configurar Nodos](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vdxxs4jcgdnrkbv0m5k7.gif)

3. **Escribir y Cargar Imágenes del SO:**
   - Escribe las imágenes del SO descargadas en tarjetas microSD.
   - Carga estas imágenes en tus Raspberry Pis.

## Configuración del Software

### Instalación de Kubernetes con k3s
k3s es una versión ligera de Kubernetes ideal para entornos de edge, IoT y CI que requieren un menor consumo de recursos, como en nuestro caso.

1. **Preparación para la Instalación:**
   - Utiliza Ansible para la automatización.
   - Clona el repositorio Ansible de k3s:
     ```bash
     git clone https://github.com/k3s-io/k3s-ansible.git
     cd k3s-ansible
     cp -R inventory/sample inventory/my-cluster
     nano inventory/my-cluster/hosts.ini
     ```

2. **Configuración:**
   - Configura `inventory/my-cluster/hosts.ini` y `inventory/my-cluster/group_vars/all.yml` con detalles como la versión de Kubernetes, el usuario del sistema y la IP del nodo maestro.

3. **Despliegue:**
   - Ejecuta el playbook de Ansible para instalar k3s en tus nodos:
     ```bash
     ansible-playbook site.yml -i inventory/my-cluster/hosts.ini
     ```

4. **Instalar kubectl:**
   - Instala kubectl en tu máquina local para interactuar con el cluster.
     ```bash
     brew install kubectl
     scp ubuntu@192.168.1.100:~/.kube/config ~/.kube/config
     ```

### Verificación de la Instalación
Asegúrate de que todos los nodos estén listos ejecutando:
```bash
kubectl get nodes
```

### Despliegue de Aplicaciones
#### Desplegando una Aplicación de Prueba
1. Configurar DNS Local:
  - Añade una entrada DNS a /etc/hosts para el dominio de prueba.
```bash
sudo echo "192.168.1.100 test.com" >> /etc/hosts
```

2. Desplegar una Aplicación:
  - Crea un despliegue, servicio e ingreso para el servidor web Nginx.

<details>
<summary>YAML de Despliegue</summary>

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2 # indica al despliegue ejecutar 2 pods replicados
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  labels:
    name: nginx-service
spec:
  ports:
    - port: 80
      name: http
  selector:
    name: nginx-deployment
--------

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx-ingress
  annotations:
    kubernetes.io/ingress.class: traefik
spec:
  rules:
  - host: "test.com"
    http:
      paths:
      - path: /
        backend:
          serviceName: nginx-service
          servicePort: 80
```

</details>

3. Verifica el despliegue:
```bash
kubectl get pods
curl http://test.com
```
### Limpieza y Aprendizaje Adicional
- Recuerda eliminar cualquier configuración temporal como las entradas DNS.
- Para soluciones de almacenamiento persistente, consulta esta [guía](https://dev.to/nullxx/persistent-storage-for-raspberry-pi-k8s-cluster-2ncf).

## Conclusión
Este ejercicio práctico introduce los conceptos básicos y los pasos para configurar un cluster de Kubernetes en Raspberry Pi. Esta configuración fomenta el aprendizaje mediante la experiencia práctica y es ideal para fines educativos en currículos de ingeniería informática.