Kubernetes – montándonos un entorno de pruebas y producción – homeLAB – Parte2

Kubernetes – montándonos un entorno de pruebas y producción – homeLAB – Parte2

Hace unos meses escribí como iniciaba un entorno k8s en casa para hacer pruebas y entender las ventajas de esta nueva plataforma que está revolucionando la forma en que manejamos contenedores.

En mi primer intento me auxilie de varios Raspberry Pi los cuales son excelentes para pequeños procesos y pruebas, lamentablemente en mi caso no me gustó mucho el resultado. En un segundo intento, use la distribución de Rancher junto a su plataforma de administración que permite provisionar un cluster ya sea en premisa o en la nube, en todos mis intentos lo hice en premisa ya que no cuento con un presupuesto para pagar horas en Amazon o Google.

En esta “segunda parte” he llegado mucho más lejos y con mejores resultados, digamos que ahora me he tomado más tiempo para entender cómo se conectan las partes y he decidido administrar k8s sin ningún front-end. Esta vez no he usado RPi, todo se ha instalado en Ubuntu 16.04 con la distribución de Rancher llamada RKE (Rancher Kubernetes Engine). https://github.com/rancher/rke

Rancher Kubernetes Engine, an extremely simple, lightning fast Kubernetes installer that works everywhere.

Esta es la descripción del Proyecto en Github, se puede decir que es una de las maneras más rápidas de tener un cluster de k8s, al menos que yo he probado hasta el momento.

BOM:

  • 3 Ubuntu Servers 16.04 – en mi caso, estos son tres máquinas virtuales.
  • 1 Management server – Otra VM con Ubuntu, no necesariamente debe ser la misma versión que los nodos del cluster.
  • Un rango de direcciones IP para MetalLB.

Instalando RKE:

Primero debemos revisar cumplimos con el Node Requriments. Rancher tiene una tabla con las recomendaciones de OS, hardware y Networking.

https://rancher.com/docs/rancher/v2.x/en/installation/requirements/

Luego procederemos a preparar el equipo que usaremos para levantar el cluster de RKE.

https://rancher.com/docs/rke/v0.1.x/en/installation/

En mi caso fue descargar el binario para Linux y colocarlo en mi PATH, crear un cluster configuration file, este archivo puede tener cualquier nombre, para simplificar los pasos le pondremos cluster.yml igual que la documentación de Rancher.

En este archivo [cluster.yml] colocaremos la información de los nodos que usaremos para formar el cluster, antes de poder lanzar este proceso debemos cumplir con algunos pasos.

  1. En la maquina usada para administración necesitamos contar con SSH keys, desplegar este key en los nodos del cluster, RKE no envía password para hacer login a estos nodos, por esta razón debemos tener ssh-passwordless.
  2. Docker ya instalado y el usuario que cuenta con los keys de SSH en el grupo de Docker.

La forma más rápida de cumplir con este paso es usando un script ya preparado para realizar esta tarea, este script es oficialmente soportado por Rancher.

https://rancher.com/docs/rke/v0.1.x/en/os/

curl https://releases.rancher.com/install-docker/17.03.sh | sh
  1. Tener las herramientas necesarias en la máquina de administración, una de ellas es kubelet. En el caso de Ubuntu se instala como cualquier otro paquete usando APT.

En la siguiente imagen se puede apreciar el mensaje final del script para instalar Docker versión 17.03.

Ya podemos continuar con la preparación del cluster.yaml. Yo he usado uno bastante sencillo:

Ejecutando RKE para inicializar el cluster.

rke up –config rancher-cluster.yml

Al finalizar este proceso, tendremos un mensaje como:

Para probar que nuestros nodos responden y que tenemos un cluster de k8s, copiamos el archivo resultante de la operación anterior [kube_config_rancher-cluster.yml] a la ubicación por defecto usada por kubectl.

cp kube_config_rancher-cluster.yml ~./kube/config

Una alternativa cargarlo en la variable KUBECONFIG:

export KUBECONFIG=$(pwd)/kube_config_rancher-cluster.yml

Hacemos un kubectl get nodes:

… Houston, we have a cluster.

Alguien preguntara: ¿Ya témenos un cluster, ahora que hacemos con él?

En el estado actual, se pueden desplegar aplicaciones que no hagan uso de almacenamiento persistente (no me gusta el hostPath) y que hagan uso del host IP ya que no tenemos un LoadBalacer instalado. Para el próximo articulo estaré desplegando dos soluciones para que nuestro cluster se parezca más a un GKE o un EKS.

LibreNMS – Exportando data a Influxdb para crear gráficos en Grafana.

LibreNMS – Exportando data a Influxdb para crear gráficos en Grafana.

Grafana es un software para crear gráficos con distintas formas y colores, lo interesante es que la data a desplegar se puede manipular de muchas maneras y puede originarse desde diferentes softwares/plataformas.

Esto no es nada nuevo, personalmente vi Grafana hace más de 4 años en un subreddit, quede impresionado e inmediatamente busque como hacer los mismo, el primero intento fue exportando data desde un pfSense para crear un heatmap con los IPs bloqueados por el firewall. Luego de un tiempo se hizo más difícil mantener los equipos enviando información a InfluxDB para graficar en Grafana y decidí detener el proyecto.

LibreNMS soporta exportar a influxDB.

Para mi sorpresa encontré que LibreNMS soportaría exportar data desde su DB en MySQL a una InfluxDB, todo era experimental y en el primero intento nada funciono.

¡En el segundo intento todo funciono a la primera, impresionante!!

Se instaló InfluxDB en el mismo equipo que tiene LibreNMS, también se instaló Grafana. Una vez ambos softwares corriendo correctamente, la configuración de LibreNMS es muy sencilla. Pero primero crearemos la base de datos para LibreNMS en InfluxDB.

CREATE DATABASE librenms
CREATE USER admin WITH PASSWORD ‘admin’ WITH ALL PRIVILEGES
CREATE USER librenms WITH PASSWORD 'admin
GRANT ALL ON librenms TO admin
GRANT READ ON librenms_db TO grafana
exit

Configuración en config.php

$config['influxdb']['enable'] = true;
$config['influxdb']['transport'] = 'http'; # Default, other options: https, udp
$config['influxdb']['host'] = '127.0.0.1';
$config['influxdb']['port'] = '8086';
$config['influxdb']['db'] = 'librenms';
$config['influxdb']['username'] = 'admin';
$config['influxdb']['password'] = 'admin';
$config['influxdb']['timeout'] = 0; # Optional
$config['influxdb']['verifySSL'] = false; # Optional

Si revisamos el documento oficial de como conectar LibreNMS con InfluxDB ( https://docs.librenms.org/#Extensions/metrics/InfluxDB/ ), se puede ver que no se ha cambiado absolutamente nada, ya sé que debería de haber cambiado por lo menos el password, eso será para otra ocasión.

Como validamos que se está exportando data a InfluxDB ¿?

Podemos conectarnos a la InfkuxDB desde la línea de comando y ejecutar un query contra la base de datos de librenms que creamos anteriormente.

$ influx
> use librenms
> show measurements

En pantalla tendremos los nombres de nuestros equipos en LibreNMS con información relacionada a sus NIC, CPU, Espacio en Disco y mucho más, básicamente todo lo que tiene LibreNMS en los gráficos, será exportado a InfluxDB.

¿Pero, si ya tengo graficos en LibreNMS, para que quiero Grafana?

En mi caso, quería crear gráficos personalizados los cuales LibreNMS aún no soporta de una manera tan sencilla como Grafana.

Un ejemplo es relacionado al “app” de ATS-Watts, usando Grafana con la data recibida desde LibreNMS puede crear gráficos que muestren el consumo diario y lo calculen para saber el precio de cada KWh consumido.

En LibreNMS tengo esto:

En Grafana tengo esto:

Otro caso es tener todas las interfaces de equipos de bordes en una misma pantalla, en LibreNMS es muy sencillo hacerlo, pero si decidimos usar Grafana, al momento de compartir esta información es mucho más fácil que con LibreNMS.

El potencial de Grafana es grande, también tenemos la posibilidad de recibir datos desde equipos que no estén en LibreNMS y mezclar esta información en gráficos de la manera que más nos guste.

LibreNMS – Como crear una aplicación para monitorear componentes no soportados.

LibreNMS – Como crear una aplicación para monitorear componentes no soportados.

LibreNMS soporta muchos equipos y dentro de esos equipos existen componentes que también tienen soporte en la plataforma, pero que pasa cuando uno de estos componentes no existe o simplemente el grafico que necesitamos no ha sido creado.

En mi caso todo comenzó cuando agregue un ATS APC el cual tiene soporte SNMP, pero no reporta el consumo en Watts, en realidad tampoco lo reporta en el portal de administración del mismo. Pero si reporta los Amperes consumidos por la regleta en cualquiera de sus líneas de consumo.

Mi primer intento fue usando Collectd, cree un script en Bash que buscaba el OID con el valor de amperes consumidos en el árbol de SNMP y lo calculaba para obtener su equivalente en Watts. Inicialmente todo estaba de maravillas, pero luego el grafico se corrompió y dejo de reportar.

Últimamente eso me ha pasado con varios gráficos que obtenían su información de Collectd, en fin, decidí cambiar de Collectd a otra forma y al parecer la manera oficial en LibreNMS es “desarrollar” una aplicación.

Dentro de LibreNMS existen varias ubicaciones (paths) donde deben existir los componentes de la aplicación, por ejemplo, si se hace un find al nombre de una aplicación existente, se pueden ver cuáles son esas ubicaciones.

En la imagen, realizo una búsqueda del App llamado pi-hole, el autor de esta app describió lo fácil que es crear una aplicación con simplemente copiar pi-hole como base, eso fue lo que hice para resolver el monitoreo de consumo de mi ATS APC.

Nota: en la imagen se puede ver un archivo .rrd, en este caso es el resultado de los valores tomados del host resolver.aanetworks.org que cuenta con pi-Hole y tiene el App habilitado.

ATS-Watts:

Este es el nombre que le he asignado a la nueva “app” que resultó de copiar los archivos usados en la aplicación de pi-hole.

Luego de remover los valores que no necesitaba, en pi-hole se generan alrededor de 12 gráficos. En el caso de ATS-Watts, solo estaré generando uno que es el resultado de un script.

La funcionalidad de este script es colectar la información en SNMP del ATS, este ATS no cuenta con un OID donde muestre el valor en Watts, cuenta con dos valores OID donde la unión con un (.) de estos es el total de Amperes consumidos, luego los multiplica por 110 para tener los Watts.

ats-watts.inc.php:

Este es el primero componente de la aplicación, se puede ver como tomo el OID generado por el script y se asigna a las variables para ser graficadas por rrd.

Para seguir entendiendo como funciona ATS-Watts, se puede ver el resto del código en el repositorio Git que me he montado para jugar un poco y tener mejor control de algunos proyectos que tengo en mente, hello Kubernetes yaml!.

https://git.aanetworks.org/ariel/ATS-Watts

Habilitando la aplicación a un host de LibreNMS:

Una vez terminado de editar los archivos correspondientes, debemos tener la habilita de encender la nueva aplicación en el host que designemos o donde se haya habilitado el script, en mi caso el script de ats-watts.sh se habilito en el mismo servidor de LibreNMS.

 

LibreNMS – backups con Oxidized.

LibreNMS – backups con Oxidized.

Si cuentas con una red con más de dos dispositivos (router o switch), debes considerar realizar respaldos de manera automatizada a esos equipos, está de más decir que también tenemos que monitorear el comportamiento de estos equipos. Podemos monitorear valores tales como CPU, memoria, estado de las interfaces de red y cantidad de tráfico que pasa por estas, esto es solo por mencionar algunos de los objetos disponibles en un equipo de red.

Sorpresa, todo esto se puede hacer con LibreNMS.

Esta plataforma de monitoreo es un fork de Observium el cual cambio su modo de distribución a uno más cerrado y esto causo que usuarios como YO se movieran a LibreNMS. Recuerdo haber usado un paso a paso de cómo mover la data de un software al otro.

En esta entrada nos saltaremos la parte donde instalamos LibreNMS, en la página del proyecto oficial se puede encontrar esta información.

Oxidizedhttps://github.com/ytti/oxidized

Como dice su README en GitHub, este es un intento de reemplazar RANCID, en mi opinión este proyecto ha logrado su cometido, mi experiencia con RANCID no fue la más hermosa o placentera.

Debian es la distribución en la cual está instalado LibreNMS, en la sección de instalación tienen varias distros, FreeBSD y Docker. Los pasos de instalación de Debian aplican para Ubuntu.

Cuando toco instalar oxidized-web, este fallaba y al final pude determinar que faltaba g++, cuando instale Debian seleccione el mínimo de paquetes, lo extraño fue que también paso lo mismo cuando realice la misma instalación en Ubuntu.

Configurando Oxidized –

Una vez instalado los tres componentes, podemos proceder a generar una configuración por defecto la cual podemos editar más adelante. Es recomendado no ejecutar Oxidized como root, debemos crear una cuenta para este servicio.

useradd oxidized

Luego ejecutamos oxidized una vez para que sea creado el directorio y en este los archivos necesarios, aunque no usaremos algunos de ellos.

Los Outputs son una parte esencial de la configuración, debemos seleccionar Git para contar con la funcionalidad de versiones dentro de LibreNMS.

Aquí un ejemplo de configuración para Oxidized que funciona en LibreNMS, este es el usado en mi entorno actualmente.

https://gist.github.com/aredan/8e44cb0485d196020472c9c870f1a60c

En router.db no necesitamos colocar equipos, la integración de LibreNMS se encarga de eso y para que esta funcione debemos decirle a Oxidized cuál es la URL del API y crear un usuario, al mismo usuario debemos asignarle un Token para ser usado desde Oxidized.

Oxidized como servicio –

Muchas veces instalamos componentes que necesita inicializar con el sistema y este se encarga de colocar lo necesario, ya sea en init.d o en system.d, en el caso de Oxidized debemos hacerlo nosotros.

https://github.com/ytti/oxidized#extra

Para este momento debemos tener un Oxidized configurado y corriendo como servicio, ya que la manera de acceder estos respaldos será usando LibreNMS, podemos dejar oxidized-web escuchando solo en 127.0.0.1 siempre y cuando ambas plataformas están instaladas en el mismo equipo.

Configurando LibreNMS –

Usando la opción de configuración mediante Global Settings -> External Settings no funciono, ni siquiera presento errores en el log de LibreNMS, cuando introduje la configuración directamente en config.php, automáticamente apareció la opción de Oxidized en Overview -> Tools. Pasados unos minutos ya podía ver intentos de conexión desde la maquina con LibreNMS/Oxidized a los equipos de red que fueron definidos en la configuración de Oxidized.

$config['oxidized']['enabled'] = TRUE;
$config['oxidized']['url'] = 'http://127.0.0.1:8888';
$config['oxidized']['features']['versioning'] = true;
$config['oxidized']['group_support'] = true;
$config['oxidized']['default_group'] = 'default';
$config['oxidized']['reload_nodes'] = true;
$config['oxidized']['group']['os'][] = array('match' => 'nxos', 'group' => 'nxos');
$config['oxidized']['group']['os'][] = array('match' => 'ios', 'group' => 'ios');
$config['oxidized']['group']['os'][] = array('match' => 'fortigate', 'group' => 'fortinet');
$config['oxidized']['group']['os'][] = array('match' => 'routeros', 'group' => 'routeros');

En las últimas cuatro líneas están definidos los equipos que quiero que LibreNMS compare contra Oxidized, por lo menos así lo entendí yo.

 

 

Aquí algunas capturas de pantalla de LibreNMS accediendo a los respaldos realizados por Oxidized.

 

Kubernetes – usando Rancher 2.0 para crear y administrar clusters de k8s!

Kubernetes – usando Rancher 2.0 para crear y administrar clusters de k8s!

Desde hace semanas estoy jugando con Kubernetes. La idea inicial ha sido armar un cluster usando herramientas nativas de k8s (kubeadm), de esta forma aprendería el funcionamiento base de la plataforma, lo gracioso es que pensé que lo estaba haciendo “de la manera difícil”, pero creo que no era así. Al parecer existe la manera “The hard way” la cual asusta por el simple hecho que todas las configuraciones e instalaciones son de manera manual, sin usar herramientas que autogeneran como es el caso de kubeadm. Al final, la razón de realizar la instalación de esta manera es con fin educativos, es recomendable conocer el porqué de las cosas.

Kubernetes the hard way.

https://github.com/kelseyhightower/kubernetes-the-hard-way

Con Kubernetes, aprender como funcionan los componentes se ha alargado más de la cuenta ya que el ecosistema es inmenso, y cada vez que pensé “Ya está instalado, ahora a desplegar algunos contenedores”, me topaba con que tenía que instalar otras herramientas antes de (¡nginx-ingress, te miro a ti!). otro factor fue que intente mezclar arquitecturas, quería tener adm64 y arm64.

Por ejemplo, cuando ya tenía el cluster creado, surgió la necesidad de acceder a las aplicaciones desde el exterior (¿Internet?), esto se resuelve muy fácil, Ingress Controller! Luego tenemos el tema del almacenamiento y así surgieron otras necesidades que cubrir para tener una solución que funcionara completamente.

Rancher 2.0

Ya había escuchado (leído…) de esta plataforma, al principio me había confundido y pensaba que era de pago también la había confundido con RancherOS, este es un Linux con lo necesario para correr contenedores, igual que CoreOS.

Rancher es una plataforma para la administración de cluster de Kubernetes, esto es así en la versión 2.0, está basada totalmente en Kubernetes.

Instalando Rancher.

La instalación de esta plataforma es tan sencilla como correr cualquier otro Docker container, leyendo en Quick Start Guide, podemos ver que se usa Docker run para inicializar el contenedor. En mi caso he agregado varios valores que no están en la guía de inicio.

docker run -d –restart=unless-stopped -p 80:80 -p 443:443 -v /var/lib/rancher:/var/lib/rancher rancher/rancher:latest –acme-domain rancher.aanetworks.org

-v /var/lib/rancher:/var/lib/rancher

Luego de varios días de usar Rancher, me toco reiniciar el contenedor y para mi sorpresa perdí todos los cambios que había hecho, todo muy básico, pero es poco alentador ver algo así. Resulta que toda la configuración generada por etcd es almacenada en /var/lib/rancher/ junto a otras informaciones de la plataforma.

–acme-domain rancher.aanetworks.org

Luego de la aparición de Let’s Encrypt, ¡porque no tener SSL en los dominios de acceso público o privados!

Con esta línea conseguimos que Rancher solicite un SSL para el dominio que usaremos con la plataforma, debemos tener los puertos 80 y 443 accesible desde Internet para que proceda la validación de dicho dominio.

Esperamos varios minutos (5?) y luego procedemos a acceder al portal de administración, en mi caso es https://rancher.aanetworks.org, lo primero que recibiremos es un mensaje solicitando un cambio de password para el usuario admin, luego de especificar el password, tendremos acceso a la plataforma.

Clusters!

La primera opción ofrecida por Rancher luego de hacer login es la creación de un cluster, a diferencia de la versión 1.x la cual no he usado, la versión 2.0 ofrece crear clusters de Kubernetes o importarlos si ya se tiene alguno.

Tenemos opción de crear Google Kubernetes Engine (GKE), Amazon EKS, Azure Container Service (AKS), hasta se puede conectar con Digital Ocean para provisionar VM allí y agregarlas a un cluster. Por el momento solo he podido jugar con la integración de vSphere y Custom. En caso de Custom, luego de crear el cluster, se nos entrega un comando docker run para ser ejecutado en los nodos que deseamos agregar, estos ya deben tener una versión de Linux soportada junto a docker en una de las versiones soportadas.

En esta captura se pueden ver las opciones ofrecidas por Rancher para la creación de un cluster tipo Custom.

En la versión 2.0 GA, se disponen de las versiones de Kubernetes listadas aqui para ser desplegadas a los nodos.

Como CNI (Container Network Interface) tenemos Flannel, Calico y Canal. Tengo entendido que Canal es una mezcla entre Flannel y Calico. Me gustaría que en lo adelante agregaran wave, aunque entiendo que necesito investigar más sobre Canal.

Pod Security, aún no he usado esta opción, entiendo que es un mecanismo para controlar el acceso a pods cuando están en namespace diferentes.

Rancher publica una lista de versiones de Docker soportadas, pero en la creación del cluster podemos elegir si deseamos que las versiones no soportadas puedan ser usadas.

Podemos ver en el mensaje, debemos ejecutar ese docker run en uno o más servidores que deseamos formen parte de este cluster.

Node Role, necesitamos al menos un etcd, un control y un worker para comenzar a jugar con este cluster, los siguientes equipos que agreguemos al cluter pueden tener el role de Worker.

Así es como se ve un cluster de Kubernetes desde el dashboard de Rancher.

Al hacer click “Launch kubectl”, tendremos esta linda ventana que nos permitirá hacer todo tipo de operaciones usando kubectl. Otra opción es descargar el archivo de configuración, colocarlo en una maquina con kubectl para poder interactuar con el cluster de Kubernetes. Debemos tener en cuenta que de esta manera todas las operaciones son atreves del servidor con Rancher.