Instalar Kubernetes on-premise sin dolor

Índice de contenidos

1. Entorno

Este tutorial está escrito usando el siguiente entorno:

  • Hardware: Slimbook Pro 13.3″ (Intel Core i7, 32GB RAM)
  • Sistema Operativo: LUbuntu 16.04
  • LXD 2.21
  • Snap 2.3.1
  • conjure-up 2.5.2
  • JuJu 2.3.1
  • Kubernetes 1.9.3

2. Introducción

Todo el que haya intentado instalar Kubernetes on-premise, es decir, es su propio servidor o máquina de desarrollo sabe de qué estoy hablando con lo de dolor.

Aquí tenéis un vídeo donde se hace la instalación para CentOS 7, venga ánimo! 😉

Hacer la instalación desde cero requiere tener conocimientos profundos de sistemas y redes que no suele ser lo habitual en los que nos dedicamos al desarrollo; y me atrevería a decir que tampoco en muchos DevOps.

Esto hace que muchas organizaciones, de forma inteligente pero con un coste añadido, paguen las nubes para que le gestionen todo la infraestructura que mueve el cada vez más querido por tod@s Kubernetes.

Pero si yo solo quiero hacer pruebas en desarrollo, ¿de verdad no hay una forma sencilla de tener Kubernetes en mi máquina?

Tienes la opción de utilizar Minikube que es una versión mini de Kubernetes, que no es recomendable poner en producción y que a veces no cubre toda la funcionalidad de su hermano mayor.

Lo que quiero presentar en este tutorial es una forma “mágica” de instalar Kubernetes en todo su esplendor en un máquina de desarrollo, pero que perfectamente se podría utilizar en producción.

Esta magia la proporciona Canonical con su stack Ubuntu, Snap, LXD, Juju y Conjure-up, por lo que tienes que tener en cuenta que esta forma de instalación solo va a funcionar en máquinas (o máquinas virtuales) con Ubuntu o, cualquiera de sus sabores, como LUbuntu (mi preferido), con la versión recomendada 16.04.

3. Vamos al lío

Partimos de que estamos en un máquina con Ubuntu 16.04 recién instalada con un usuario que tenga permiso de sudo. La máquina tiene que tener un mínimo de 4 GB de RAM pero mejor si pueden ser 8 GB.

Lo primero que vamos a hacer es instalar ZFS que es el sistema de ficheros que vamos a utilizar para almacenar los contenedores LXD, simplemente ejecutamos:

Ahora vamos a instalar LXD que es la herramienta de Ubuntu para la gestión de los contenedores LXC, que hay que entenderlos como contenedores de sistemas que permiten levantar “máquinas virtuales” completas mucho más ligeras que con VirtualBox, KVM, Vmware, … y dentro pueden ejecutar contenedores de Docker.

Para hacer la instalación vamos a utilizar la herramienta de Canonical “Snap” que permite hacer la instalación en Ubuntu de distintas herramientas y utilidades, podéis ver un listado completo aquí. Así que simplemente para instalar LXD tenemos que ejecutar:

Para evitar tener que anteponer “sudo” a todos los comandos vamos a añadir nuestro usuario al grupo LXD con los siguientes comandos:

Ahora vamos a inicializar LXD para permitir la creación de los contenedores de sistema LXC que ya hemos dicho que se pueden tratar como máquinas virtuales al uso compatibles con Docker, que serían contenedores de aplicación. Simplemente ejecutamos:

Al ejecutar este comando el sistema nos va a solicitar la siguiente información:

  • Do you want to configure a new storage pool (yes/no) [default=yes]? –> Le decimos que sí queremos configurar un nuevo almacenamiento.
  • Name of the new storage pool [default=default]: –> Le damos el nombre que queramos al nuevo almacenamiento o dejamos “default”
  • Name of the storage backend to use (dir, btrfs, ceph, lvm, zfs) [default=zfs]: –> Nos pide seleccionar el tipo de almacenamiento, nos quedamos con el recomendado ZFS.
  • Create a new ZFS pool (yes/no) [default=yes]? –> Le respondemos que sí queremos crear un nuevo pool de ZFS.
  • Would you like to use an existing block device (yes/no) [default=no]? –> Nos pregunta si queremos utilizar un dispositivo existente, le decimos que no.
  • Size in GB of the new loop device (1GB minimum) [default=15GB]: –> Podemos dejar el tamaño que nos ofrece por defecto, o ampliarlo según las condiciones de espacio de la máquina con la que estemos trabajando.
  • Would you like LXD to be available over the network (yes/no) [default=no]? –> Nos pregunta si queremos exponer está instancia de LXD fuera de la red. Puede ser útil para centralizar imágenes corporativas, pero para este caso, le decimos que no.
  • Would you like stale cached images to be updated automatically (yes/no) [default=yes]? –> Nos pregunta si queremos que las imágenes se actualicen automáticamente, le decimos que sí.
  • Would you like to create a new network bridge (yes/no) [default=yes]? –> Nos pregunta si queremos crear un puente de red, esto es necesario para poder intercomunicar los contenedores y acceder a ellos, así que le decimos que sí.
  • What should the new bridge be called [default=lxdbr0]? –> Nos pregunta cómo queremos llamar al puente, os aconsejo dejar el nombre por defecto, porque en todos los documentos relacionados lo vais a encontrar así.
  • What IPv4 address should be used (CIDR subnet notation, “auto” or “none”) [default=auto]? –> Nos pide información sobre la red para IPv4, lo mejor en este caso es dejar el valor de auto.
  • What IPv6 address should be used (CIDR subnet notation, “auto” or “none”) [default=auto]? –> Ahora nos solicita la mismo para IPv6, es imprescindible que pongamos “none” dado que no hay un soporte completo a este protocolo.

Después de contestar a estas preguntas el sistema nos informa de que está correctamente configurado con un claro “LXD has been successfully configured”.

Ya tenemos todo lo necesario para poder instalar y utilizar la herramienta conjure-up que tenemos que instalar con snap:

Ya es el momento de empezar la instalación de Kubernetes para ello ejecutamos en el terminal:

Este comando arranca la herramienta mostrando todos los “spells” que tenemos disponibles para instalar, seleccionamos “Kubernetes Core” haciendo uso de las flechas del teclado.

Pulsando “Intro” pasamos a la siguiente pantalla, donde podemos seleccionar el proveedor de cloud donde queremos hacer la instalación o como es nuestro caso, localhost.

Pulsamos “Intro” y pasamos a la siguiente pantalla, donde podemos seleccionar el puente de red y el almacenamiento a utilizar, dejamos los valores por defecto.

Le damos al tabulador para seleccionar el botón “SAVE” y pulsamos “Intro” para avanzar a la siguiente pantalla, donde podremos seleccionar el tipo de plugin de red a utilizar en la instalación de Kubernetes, dejamos flannel.

Pulsamos en “Intro” y el asistente nos solicita la password de sudo para poder realizar las instalaciones.

Establecemos nuestro password de sudo y pulsamos en “Intro” para avanzar a la siguiente pantalla, donde vemos un resumen de las herramientas y número de unidades que se van a instalar.

Le damos al tabulador para seleccionar “Deploy all 4 Remaining Applications” y pulsamos en “Intro” para empezar el proceso de instalación, el cual creará los contenedores LXC oportunos e instalará y configurará dentro de ellos todo lo necesario (interfaces de red de flannel, incluidas) para tener un clúster de Kubernetes 100% operativo. Este proceso puede durar varios minutos, pero solo tenemos que mirar la pantalla o irnos a tomar un café 😉

Una vez todo el proceso haya finalizado se mostrará una página de resumen con todos las URLs de acceso a los distintos servicios.

Pulsamos en “Quit” y ya tenemos el clúster de Kubernetes instalado en nuestra máquina.

Para comprobar que efectivamente se ha instalado correctamente, vamos a recuperar la información del clúster con el comando:

Y podemos arrancar el proxy con el comando:

Si accedemos a la URL http://localhost:8001/ui podremos ver el dashboard de Kubernetes solicitando las credenciales de autorización.

Si pulsamos en “Skip” (la configuración de autenticación la dejo para otro tutorial especifico de Kubernetes) podemos ver el dashboard inicial.

Podéis ver gráficamente la topología de instalación si ejecutáis en el terminal:

Lo que nos devolverá una URL y las credenciales de acceso al dashboard de juju y podremos ver algo como esto.

Ahora si por lo que sea queremos más workers en nuestro clúster simplemente tenemos que ejecutar:

Y automáticamente se instalarán dos nuevos workers con toda la configuración necesaria de dependencias y redes. !Listo para usar!

4. Conclusiones

Como ves, el stack de Canonical te permite de forma muy sencilla tener tu propia nube en local o en cualquier otro proveedor. En este tutorial hemos instalado Kubernetes pero podríamos haber instalado de forma igual de fácil (aunque con más requisitos de sistema) OpenStack.

Además hemos visto un caso práctico de contenedores LXD que nos permite tener “máquinas virtuales” tan ligeras como procesos que comparten la memoria de la máquina (también se puede limitar la memoria por contenedor) y que se puede ejecutar contenedores de Docker dentro de ellos. Si esta misma instalación la hubiéramos hecho con máquinas virtuales en VirtualBox no habría máquina de desarrollo en el mercado que lo que soportase.

Este es un motivo más que suficiente para adoptar Ubuntu como sistema operativo de referencia tanto en escritorio como en servidores.

Cualquier duda o sugerencia en la zona de comentarios.

Saludos.