Docker con Kubernetes

En esta entrada se proponen un par de formas para poder utilizar Kubernetes desde Docker, esto nos da la posibilidad de poder desplegar un clúster de Kubernetes en contenedores Docker para ejecutar dentro el ecosistema de Kubernetes sin necesidad de instalarlo en el sistema ni modificar nada, solamente necesitamos Docker para ejecutarlo.

Kubernetes es un orquestador de contenedores creado/usado por Google y donado a la Linux Foundation. Un orquestador se encarga del despliegue, escalado y manejo de aplicaciones de los contenedores; esto facilita en gran medida la gestión del sistema de contenedores. El orquestador nativo de Docker el famoso Swarm finalmente ha sido deprecado, ya no se utiliza debido a las capacidades que ofrecen otros orquestadores como Kubernetes.

Actualmente existen proyectos que realizan esta tarea, uno de ellos es el proyecto k3d que despliega un rancher en Docker y se basa en k3s (un clúster ligero de Kubernetes), un rancher facilita la gestión de la operativa y de la seguridad del clúster, incluso puede gestionar varios clústeres de Kubernetes a la vez.

Para iniciar un rancher desde Docker se ejecuta

$ docker run -ti --rm --name rancher -p 80:80 -p 443:443 -v $PWD/rancher:/var/lib/rancher --privileged rancher/rancher

Este comando crea un clúster de Kubernetes con un balanceador dentro del mismo docker de la máquina, ya que el modo privilegiado deja acceder desde el contenedor a los recursos de la máquina nativa, solo habría que entrar en algún nodo master del clúster de Kubernetes para comenzar a trabajar.

Y la otra forma es hacerlo nosotros

Como crear un clúster desde cero

Se arranca el contenedor Docker de k3d:

$ docker run -ti --rm --name k3d --privileged -p2375:2375 -p2376:2376 rancher/k3d

Se crea el cluster1 con 3 masters y 3 workers:

$ docker run -ti --name k3d-client --privileged -v/var/run/docker.sock:/var/run/docker.sock -v/tmp:/tmp -vk3d-cluster1-images --rm rancher/k3d:linux-amd64 cluster create cluster1 -p 8080:30001@server:0 --api-port 127.0.0.1:6443 --servers=3 --agents=3

Se accede a uno de los masters servers del clúster:

$ docker exec -ti k3d-cluster1-server-1 sh

Ya podemos usar kubernetes desde el contenedor para realizar un despliegue por ejemplo:

/ # kubectl create deployment deploy-prueba1 --image=nginx --dry-run=client -o yaml --port=80 > deploy.yaml
/ # kubectl apply -f deploy.yaml 
deployment.apps/deploy-prueba1 created
/ # kubectl expose -f deploy.yaml 
service/deploy-prueba1 exposed

Se comprueba que el contenedor responde desde fuera del clúster:

$ curl 192.168.X.X/
404 page not found

Finalmente si se quieren eliminar todos los contenedores de Docker que están funcionando:

$ for x in $(docker ps -a -q); do docker stop -t 0 $x; docker rm $x; done

Y quedaría todo el sistema limpio porque solamente usamos contenedores de Docker.

Espero que os haya gustado como introducción, nos leemos en la próxima entrada.