Instalar Kubernetes on-premise sin dolor

4
12926

Í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:

$> sudo apt install zfsutils-linux -y 

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:

$> sudo snap install lxd --classic

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

$> sudo usermod -a -G lxd 
$> newgrp lxd

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:

$> lxd init

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:

$> sudo snap install conjure-up --classic

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

$> conjure-up

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:

$> kubectl cluster-info

Y podemos arrancar el proxy con el comando:

$> kubectl proxy

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:

$> juju gui

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:

$> juju add-unit kubernetes-worker -n 2

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.

4 COMENTARIOS

  1. Solo espero recordar este comentario cuando me den luz verde para cambiar Ubuntu todos los sles, aunque sles también vende kubernetes , lo mejor es que es gratis y podemos jugar con kubernetes, por el momento estoy con swarm

  2. […] Entonces la solución pasa por poder ejecutar Kubernetes de forma local y esto es lo que podemos hacer con microk8s, que a diferencia de Minikube no requiere de una máquina virtual sino que podemos instalarlo directamente en Ubuntu como un paquete de snap para tener Kubernetes corriendo en nuestra máquina en segundos y consumiendo muchos menos recursos que si levantamos un clúster como hicimos en este tutorial. […]

  3. Hola. muy biena tu guia, pero encontre un problema siguiendo tus pasos, imagino que por el tema de la version.

    Cuando lanzas el conjure-up, te falla a la hora de hacer la instalacion en localhost porque no encuentra almacenamiento disponible, aunque lo configures en los pasos anteriores.

    Para solventar el problema realice lo siguiente:

    setup@kubernetes:~$ /snap/bin/lxc storage list
    +——+————-+——–+——–+———+
    | NAME | DESCRIPTION | DRIVER | SOURCE | USED BY |
    +——+————-+——–+——–+———+
    setup@kubernetes:~$ sudo /snap/bin/lxd.migrate
    => Connecting to source server
    => Connecting to destination server
    => Running sanity checks

    === Source server
    LXD version: 3.0.3
    LXD PID: 2157
    Resources:
    Containers: 0
    Images: 0
    Networks: 1
    Storage pools: 2

    === Destination server
    LXD version: 3.16
    LXD PID: 3155
    Resources:
    Containers: 0
    Images: 0
    Networks: 0
    Storage pools: 0

    The migration process will shut down all your containers then move your data to the destination LXD.
    Once the data is moved, the destination LXD will start and apply any needed updates.
    And finally your containers will be brought back to their previous state, completing the migration.

    Are you ready to proceed (yes/no) [default=no]? yes
    => Shutting down the source LXD
    => Stopping the source LXD units
    => Stopping the destination LXD unit
    => Unmounting source LXD paths
    => Unmounting destination LXD paths
    => Wiping destination LXD clean
    => Backing up the database
    => Moving the data
    => Updating the storage backends
    => Starting the destination LXD
    => Waiting for LXD to come online

    WARNING: LXD cluster members must all run the exact same LXD version

    You may now need to perform the same operation on the other members

    The upgrade will hold here for up to an hour while you do so

    === Destination server
    LXD version: 3.16
    LXD PID: 3596
    Resources:
    Containers: 0
    Images: 0
    Networks: 1
    Storage pools: 2

    The migration is now complete and your containers should be back online.
    Do you want to uninstall the old LXD (yes/no) [default=yes]?

    All done. You may need to close your current shell and open a new one to have the «lxc» command work.
    To migrate your existing client configuration, move ~/.config/lxc to ~/snap/lxd/current/.config/lxc
    setup@kubernetes:~$ /snap/bin/lxc storage list
    +———+————-+——–+———+———+
    | NAME | DESCRIPTION | DRIVER | STATE | USED BY |
    +———+————-+——–+———+———+
    | default | | zfs | CREATED | 1 |
    +———+————-+——–+———+———+
    | local | | zfs | CREATED | 0 |
    +———+————-+——–+———+———+

    Una vez hecho esto, cuando lanza el conjure-up no te da problemas en l,localhost con el storage.

    Salu2.

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad