Pido disculpas por el título, fue el primero que me llego a la cabeza.
Kubernetes.
Desde hace unos años esta plataforma ha estado disponible para ser usada de manera gratuita, por lo menos el nombre ha estado apareciendo en búsquedas relacionadas a Containers. La instalación de la misma, por lo que he podido investigar era algo complicada, luego aparecieron herramientas para facilitar esto y proveer un método fácil de seguir para montar esta plataforma y poder crear ambientes de prueba para luego poder desplegar en producción.
“Minikube is a tool that makes it easy to run Kubernetes locally. Minikube runs a single-node Kubernetes cluster inside a VM on your laptop for users looking to try out Kubernetes or develop with it day-to-day.”
“kubeadm is a toolkit that helps you bootstrap a best-practice Kubernetes cluster in an easy, reasonably secure and extensible way. It also supports managing Bootstrap Tokens for you and upgrading/downgrading clusters.”
“There are multiple ways to run a Kubernetes cluster with Ubuntu. These pages explain how to deploy Kubernetes on Ubuntu on multiple public and private clouds, as well as bare metal.”
“conjure-up provides the quickest way to deploy Kubernetes on Ubuntu for multiple clouds and bare metal. It provides a user-friendly UI that prompts you for cloud credentials and configuration options”
He iniciado mis pruebas usando kubeadm, debido a que la mayoría de los “blog posts y how to” son para crear un cluster de k8s usando Raspberry Pi. En mi caso he iniciado usando LXD para correr el master y los worker estarían siendo ejecutados en RPi con Raspbian.
Luego de mirar un poco y leer sobre el concepto de k8s decidí probar con Conjure-up, con esta solución terminamos con un Cluster de Kubernetes listo para recibir despliegues de software ya que el “conjuro” usado crea todos los componentes necesarios. El siguiente en mi lista es Minukube.
Mi objetivo final es tener una infraestructura de k8s la cual pueda usar no solo para aprender de que trata todo esto, si no también, ejecutar tareas las cuales serán partes de mi homelab.
Más adelante publicare un post donde explico paso a paso como montarnos un cluster de Kubernetes usando Ubuntu + LXD, de esta manera podremos tener todo ejecutando en una misma máquina, este es el mismo objetivo que se consigue con Conjure-up pero con la ventaja que se hace todo paso a paso y así entendemos mejor el proceso de inicialización de un cluster.
Si se hace una búsqueda en Internet relacionada a Docker, contenedores y demás, podremos notar que se ha convertido en algo muy aceptado. Desde hace un tiempo estoy sacando provecho de Docker en mi NAS. unRAID es actualmente mi sistema de preferencia para servicios de filesharing y un beneficio adicional es la facilidad con la que se pueden lanzar contenedores con Docker y tener servicios funcionales y fáciles de mantener.
Pero en este post me gustaría hablar de LXD, esto es un desarrollo realizado por Canonical, los creadores de Ubuntu. Durante un tiempo, no era atraído por esta distribución de Linux, pero eso está cambiando gracias a las utilidades que han creado y liberado para la comunidad. Todo comenzó con LXC, lo usé para solucionar un impase en una implementación relacionada al manejo de datos .xml que necesitaban ser recibidos de manera segura, el proveedor solicitaba SFTP en un entorno aislado, en ese momento probé LXC y se crearon varios contenedores para cada proveedor. Todo funciono de maravilla y decidí seguir investigando.
De manera casi inmediata encontré un caso de uso para tenerlo en mi casa y este fue, tener pequeños Ubuntus corriendo servicios claves (DNS, MySQL, PHP, AD Blocking…), todo fue de maravilla. Hace unos días pude terminar de completar una “nueva máquina” con un board Mini-ITX + 6GB de RAM y varios SSD de tamaños entre 120GB y 60GB. Teniendo un consumo de apenas 20Watts, esta pequeña maquina es ideal para estar encendida 24/7.
Investigando la mejor manera de tener LXC, veo que Ubuntu ahora hace referencia a LXD como el siguiente paso de LXC, tomar en cuenta que LXD no es un reemplazo y es más que un complemento.
“ LXD isn't a rewrite of LXC, in fact it's building on top of LXC to provide a new, better user experience. Under the hood, LXD uses LXC through liblxc and its Go binding to create and manage the containers.
It's basically an alternative to LXC's tools and distribution template system with the added features that come from being controllable over the network. “
Instalando LXD.
Los siguientes pasos son basados en el documento oficial de LinuxContainers en la sección de LXD:
Nota: LXD puede ser instalado en las siguientes distribuciones:
ArchLinux
Fedora
Gentoo
Ubuntu
Debian
En este caso he seleccionado Ubuntu por que debería ser la distribución mejor soportada, ¿cierto?
apt install lxd lxd-client
sudo lxd init
Una serie de preguntas deben ser contestadas luego de ejecutar el lxd init. Siendo las más importantes la relacionada a redes, aquí se podría seleccionar crear un Bridge o utilizar uno ya existente, en mi caso opte por utilizar uno que ya había creado. La segunda opción con relevancia es el Storage, inicialmente seleccione dir como Storage backend, luego adicione un segundo disco usando ZFS.
Validando la instalación de LXD.
Luego de realizar la instalación podemos verificar que nuestro manejador de contenedores está operando de manera correcta con los siguientes comandos:
lxc infolxc image list - en un entorno recién instalado este comando no presenta información.lxc storage listlxc network listlxc list – en un entorno recién instalado este comando no presenta información.
Iniciando un contenedor.
Un nuevo contenedor puede ser creado desde una imagen, un contenedor existente o un snapshot. Por defecto LXD viene con tres repositorios de imágenes que podemos usar para crear contenedores.
ubuntu
ubuntu-daily
images
podemos investigar cuales imágenes están disponibles de la siguiente manera:
lxc image list ubuntu:
en pantalla nos mostrara la lista de imágenes disponibles para ser usadas, en este repositorio tenemos las versiones de Ubuntu.
Si cambiamos “ubuntu:” por “ubuntu-daily: podemos ver los snapshots generados diariamente. Si en lugar de Ubuntu usamos “images:”, tendremos una lista de todas las distribuciones que han generado imágenes y enviado al repositorio de Linux Containers, incluyendo a Ubuntu.
El resultado de este comando puede ser abrumador ya que contiene bastante información, en cambio si queremos ver la lista de una versión de Ubuntu o una distribución específica, podemos hacer:
lxc image list ubuntu:xenial
De esta manera solo tendremos las imágenes de Xenial.
Por otro lado, si queremos buscar imágenes de Debian:
Ya sabemos el nombre de la imagen que queremos usar como base de nuestro contenedor. Usando los siguientes comandos podemos crear contenedores.
lxc init ubuntu:xenial cont1
– un nuevo contenedor será creado usando Xenial como base.
lxc launch ubuntu:xenial cont2
– a diferencia del anterior, de este modo podemos crear e inmediatamente iniciar el nuevo contenedor.
Interactuando con los contenedores.
Bien, ya tenemos nuestros contenedores. Necesitamos actualizarlo, instalar aplicaciones, usarlo tal cual usaríamos un servidor en físico o una máquina virtual que ya conocemos y queremos.
lxc exec cont1 – bash
– inmediatamente ejecutado este comando estaremos en el contenedor llamado cont1, el acceso es otorgado directamente con permisos de root. En lo adelante todo es exactamente igual que cualquier instalación de Ubuntu. Para salir del contenedor escribimos exit.
Aquí termina esta pequeña introducción a LXD, la capacidad de esta herramienta es bastante amplia, tengo varios planes y pruebas para realizar. Entre ella están tales como correr Kubernetesen LXD o crear un Docker Swarm usando contenedores en LXD y Raspberry Pi3.