IoT- Solución de Smarthome: Home Assistant en Kubernetes (4/4)

Diego Genise
Ingenia, Architectural Journeys
10 min readNov 7, 2021

En este último artículo de la serie vamos a ver cómo levantar un Home Assistant en un cluster de Kubernetes que correrá sobre dos Raspberries.

¿Por qué montar Home Assistant sobre un cluster de Kubernetes?

Existen varias respuestas posibles a este interrogante. Desde el punto de vista de las funcionalidades de un cluster de Kubernetes, podría proveernos de alta disponibilidad para nuestra aplicación o darnos la posibilidad de escalar en recursos ante la alta demanda sobre HA. Ahora, lo más importante aquí es que Home Assistant no es una aplicación que tradicionalmente necesite escalar ni esté sometida a tener que soportar cargas de trabajo. Finalmente, es una aplicación que está pensada para administrar los dispositivos IoT domésticos. Por lo tanto y asumiendo que uno tenga una casa normal y con una cantidad de dispositivos normales con una sola instancia de HA seguramente no tendremos problemas. Ahora bien, correr HA en un cluster adquiere un rol fundamental cuando pensamos en la funcionalidad de failover que puede darle un cluster de Kubernetes a nuestra instalación de HA. Si pensamos en una instalación de HA con muchos dispositivos IoT conectados y orquestados con scripts y toda nuestra casa dependiendo de esos scripts para realizar tareas automaticas, ahí adquiere mucho más sentido. Si por algún motivo nuestra instalación falla, allí estaría Kubernetes para levantar un nuevo Pod y que HA siga manejando nuestros dispositivos IoT.

Dicho esto, es importante que sepas que voy a usar solo dos Raspberries porque son las que tengo disponibles, pero para cualquier instalación de kubernetes en un entorno productivo y de alta disponibilidad cuantos más nodos tengas mejor. Se aconsejan al menos tres nodos maestros. Este proceso es exactamente igual si tuvieras más RB disponibles.

Ahora bien, para hacer esto vamos a utilizar 2 Raspberries 3 b+ en los siguientes pasos:

Paso 1 : Instalar Raspberry Pi OS (ex Raspbian)

Lo primero que necesitamos es que nuestras RBs tengan un sistema operativo instalado. Raspberry Pi OS es un sistema operativo especialmente diseñado para las RB, basado en Linux y provisto por el fabricante de Raspberry.

La forma más sencilla de instalarlo es usando un software para flashear la memoria SSD de la RB e instalar el Pi OS.

Pi Imager

Insertá la SSD en tu PC, bajalo y seguí los pasos en pantalla. Cuando tengas que seleccionar el sistema operativo usá “Raspberry Pi OS Lite” que es la distribución más liviana del SO. Antes de presionar el botón de WRITE, apretá SHIFT + CRTL + X y aparecerá en pantalla un menú oculto que te va a permitir entre otras cosas configurar el WIFI y habilitar SSH (es muy importante habilitar esta última opción).

Menú de opciones avanzadas de Raspberry Pi Imager

Aquí podrás también identificar el nombre del Host. Se puede usar un nombre significativo como RBMASTER para la que vayas a usar de nodo master en k8s y RBWORKER para el que vayas a usar de nodo worker.

Repetí este proceso por cada una de las RB que vayas a usar en tu cluster. Cada RB debe quedar con Raspberry Pi OS instalado en su SSD.

Paso 2: Conectar las RB, averiguar las direcciones IP y verifcar SSH

Aquí es importante que conectes las RB y que puedas averiguar la IP de cada una de ellas.

Rack de RB impreso en 3D

En mi caso las conecte por cable al router y averigué su dirección IP desde la configuración del mismo (podés hacer lo mismo si las conectaste por wifi). Otro punto importante de las RB es la alimentación. Es importante utilizar fuentes de buena calidad porque son muy sensibles.

Cuando tengas la dirección IP es necesario que compruebes que te podés conectar a todas por SSH con el usuario pi@<ip de la raspberry> y el password que configuraste al momento de instalar el SO en las opciones del paso anterior. Para el próximo paso es necesario que puedas conectarte a la Pi OS utilizando una llave pública. Te dejo aquí un tutorial de cómo hacerlo. Es necesario que esté configurado de esta manera.

Paso 3: Instalar kubernetes usando Ansible

En este paso vamos a dejar de hablar de Kubernetes para hablar de K3s.

¿Qué es K3s?

K3s es una distribución certificada de Kubernetes pero más liviana. Un “Lightweight Kubernetes”. Está pensando para entornos productivos pero con recursos acotados o reducidos, lo cual funciona muy bien para IoT. K3s es un proyecto de RANCHER que luego fue tomado por la Cloud Native Computing Foundation (CNCF) como “sandbox project”.

¿Qué es Ansible?

Ansible es un proyecto de RED HAT y según su web, Ansible es un motor open source que automatiza los procesos para preparar la infraestructura, gestionar la configuración, implementar las aplicaciones y organizar los sistemas, entre otros procedimientos de TI.

Para tomar un ejemplo práctico sobre qué podemos hacer con Ansible, supongamos que tenemos que instalar la misma aplicación repitiendo pasos en un pool de 100 servidores. Esto no sería eficiente y tardaríamos mucho tiempo en ir uno por uno además de que instalar nuestra aplicación seguramente conste de varios pasos y configuraciones.

Para esto Ansible nos permite generar Playbooks. Los Playbooks son archivos YAML que contienen al menos un play y sirven para definir el estado deseado de un sistema. Los plays son un conjunto ordenado de tareas que se ejecutan en los hosts que están listados en un archivo de inventario de Ansible. El archivo de inventario de Ansible es básicamente un archivo donde se enumeran los hosts dónde un determinado Playbook va correr. Los Playbooks sirven para indicarle a Ansible qué tiene que hacer, es decir los pasos a repetir en cada host (el archivo de hosts le dice en qué host debe hacerlo). Si consideramos que los hosts se pueden agrupar y que para cada grupo de hosts el playbook se puede comportar distinto. Es decir, puede tomar diferentes acciones de acuerdo al tipo de host.

Por último, una consideración importante es que al manejarse en archivos YAML todo se vuelve versionable en un repo de GIT con todas las ventajas que eso trae.

Ahora que ya conocemos K3s y Ansible vamos a describir a los pasos específicos.

En este repo de Github la gente de K3s nos provee un Playbook de Ansible listo para usar e instalar K3s en nuestras Raspberries.

1 — Instalar Ansible en tu equipo. Es importante que esté instalado en un equipo desde el cual puedas conectarte por SSH (usando llave pública) a las RB donde instalamos Raspberry Pi OS en el paso anterior. Acá tenés una guía de cómo instalar Ansible.

2 — Clonar el repo de github https://github.com/k3s-io/k3s-ansible en tu equipo.

3 — Pararse en la carpeta (y asumiendo que estas en Linux) ejecutar:

cp -R inventory/sample inventory/my-cluster

4 — Buscar el archivo all.yaml de la carpeta my-cluster/groupvars y editarlo de la siguiente manera: vamos a decirle a Ansible con qué usuario nos vamos a conectar por SSH. Es necesario cambiar el valor ansible_user e indicarle qué es “pi”. Este es nuestro usuario con permisos de root por defecto en la instalación que llevamos adelante en el primer paso del artículo. Y es el usuario que va a usar Ansible para conectarse y ejecutar los pasos para instalar K3s en cada una de las RB.

Cambiar para que quede como en la imagen y guardar los cambios.

5 — Editar el archivo hosts.ini para indicarle a Ansible dónde es necesario correr el Playbook, es decir, tenemos que indicarle las IPs de las RB. A las IPs las obtuvimos del paso dos de este artículo.

Debajo de donde dice [master] es necesario que especifiques la IP de la/s RB que actuará/n de nodo master del cluster de K3s. Y abajo de [node] la IP de la RB que actuará de nodo worker en el cluster. Como dijimos antes, aquí se pueden indicar todas las IPs que quisiéramos. Podriamos tener tres nodos maestros y 20 nodos workers si quisiéramos y tuviéramos más RB disponibles. Si tenés más, enumerá todas las IPs que necesites y recordá que Ansible se va a conectar a todas las IPs que le indiquemos en este archivo.

Guardar los cambios.

6 — ¡Estamos listos! Ahora indicale a Ansible que comience a correr el Playbook en los hosts que configuramos con el siguiente comando:

ansible-playbook site.yml -i inventory/my-cluster/hosts.ini

Si todo está correcto seguramente la salida de la consola será algo así:

Esto quiere decir que todo salió bien y que Ansible logró instalar K3s en nuestras RB.

7 — Apuntar tu kubectl al cluster de K3s de las RB con el siguiente comando, teniendo en cuenta que donde dice IP NODO MAESTRO va la IP de la RB que funciona como nodo maestro:

scp pi@<IP NODO MAESTRO>:~/.kube/config ~/.kube/config

Si estás en este paso asumo que sabes que kubectl es la herramienta para administrar un cluster de Kubernetes por línea de comandos (más información en este link).

8 — Si todo lo anterior fue correcto seguramente puedas usar un kubectl get nodes y ver si tu cluster está listo.

¡Nuestro cluster de K3s está listo para ser utilizado!

Por último, quiero aclarar algo fundamental de este paso, si bien utilizamos un repo donde el playbook para instalar K3s está ya escrito si querés profundizar sobre los pasos que se usaron para la instalación o si creés necesario mejorarlos y armar tu propia versión podés investigar todo lo que está en la carpeta roles del repo y ver en detalle todo lo necesario para instalar K3s.

¡Vamos al último paso!

PASO 4 : Instalar Home Assistant en el cluster K3s usando HELM

¿Qué es HELM?

Helm es una aplicación que te ayuda a administrar e instalar aplicaciones en un cluster de Kubernetes mediante el concepto de charts. Los charts son una colección de archivos que describen un conjunto relacionado de recursos de Kubernetes. Un chart empaqueta todas las configuraciones necesarias a nivel cluster para levantar una aplicación en Kubernetes al volver estas configuraciones versionables en un repo de GIT y repetibles. Los charts además nos aislan de la complejidad de la instalación de una aplicación en un cluster.

Si bien uno puede construir sus propios charts de HELM existe un buen punto de partida que es Artifact Hub en dónde podés encontrar charts oficiales o custom para instalar aplicaciones en Kubernetes.

¿Cómo instalar Home Assistant usando un chart?

1 — Si no tenés instalado HELM es necesario que lo instales siguiendo los pasos de la web oficial aquí.

2 — Una vez que HELM está instalado es necesario que corras los dos comandos que te dejo a continuación. Lo que van a hacer estos comandos es actualizar la lista de repos desde dónde HELM pueden descargar charts y vamos a agregar el de la gente de k8s-at-home que son los autores del chart que vamos a utilizar.

helm repo add k8s-at-home https://k8s-at-home.com/charts/

helm repo update

3 — A continuación, y como último paso tenemos que decirle a HELM que instale el chart de Home Assistant en nuestro cluster de RB y K3s.

helm install home-assistant k8s-at-home/home-assistant

Es importante que sepas que HELM utiliza Kubectl así que es necesario que corras estos comandos desde el equipo en donde tu kubectl esté apuntado al cluster de K3s.

Si todo salió correctamente podrás ver en pantalla algo parecido a la imagen anterior, donde podemos ver STATUS: deployed ¡Eso quiere decir que nuestra instalación fue exitosa! Es importante que sepas que los charts de HELM tienen la posibilidad de setear variables que comandan ciertos valores configurables del chart. Esto se hace para que los charts sean adaptables a diferentes entornos o instalaciones. En este caso como yo realicé la instalación por defecto, el chart me indica que debo correr un par de comandos antes de ver HA en el browser, pero eso puede ser diferente de acuerdo a como cada uno quiera usar el chart. En mi caso seguí las instrucciones como están en la imagen y accedí sin problemas.

A continuación, te muestro con el comando kubectl get all todo lo que configuró el chart por nosotros en el cluster.

Por último, Home Assistant funcionado:

Aquí pueden continuar con todo lo que vimos de HA en los artículos anteriores.

Espero que hayan disfrutado como yo esta serie de articulos.

!Hasta la próxima!

--

--