Javier Jerónimo


kubernetes = cluster servicios docker fácil

15 Nov 2014 » cloud

Llevo varios meses dándole vueltas al tema. He hecho algún intento de meter la cabeza en el ecosistema de docker. Es el futuro. Portabilidad. deploy-anywhere.

Esta semana he podido sacar la cabeza de los proyectos en los que estaba apoyando en el trabajo. Me le limpiado un poco el barro de los brazos y he podido navegar y echar un vistazo a las newsletters que recibo. Otro producto de Google Cloud Platform: el motor de contenedores (Google Container Engine).

La excusa que me faltaba para terminar de probar docker: una interfaz para crear un cluster de nodos “docker”, gestionar los servicios desplegados, y con soporte para varios proveedores: Vagrant, vSphere, AWS, Google Compute Engine…).

Así que comienzo a probarlo (OS X):

  1. Vagrant >=1.6.2
  2. VirtualBox
  3. Kubernetes (distribución binaria… tampoco vamos a perder el tiempo…): https://github.com/GoogleCloudPlatform/kubernetes/releases

Vamos a echar un vistazo al Vagrantfile de kubernetes.

Anecdótico: el editor atom de GitHub está desarrollado sobre Chromium (Comando+Tab me muestra esto):

Captura de pantalla 2014-11-15 a las 22.06.59

Puntos reseñables, ya sí, sobre el Vagrantfile de kubernetes:

  • Código Ruby para hacer parametrizable el entorno que construirá el Vagrantfile. Elegante.
  • La distribución preferida para los nodos es Fedora 20 + Chef.
  • Código Ruby (bucle) para crear N máquinas en el cluster (minions). Elegante.

Este Vagrantfile es un ejemplo de por qué es una buena opción usar Ruby como base para un DSL (domain specific language).

Estilo vagrant:

curl ...
tar xvzf kubernetes...
cd kubernetes
vagrant up

Y al cabo de un rato…

$ export KUBERNETES_PROVIDER=vagrant
$ ./cluster/kubecfg.sh list /minions
Minion identifier
----------
10.245.2.3
10.245.2.2

$ cluster/kubecfg.sh list /pods
ID Image(s) Host Labels Status
---------- ---------- ---------- ---------- ----------

$ cluster/kubecfg.sh list /services
ID Labels Selector Port
---------- ---------- ---------- ----------

$ cluster/kubecfg.sh list /replicationControllers
ID Image(s) Selector Replicas
---------- ---------- ---------- ----------

Y pruebo a lanzar un cluster de 3 servidores nginx como indica la documentación:

$ cluster/kubecfg.sh -p 8080:80 run dockerfile/nginx 3 myNginx
id: myNginx
creationTimestamp: 2014-11-15T21:43:15Z
selfLink: /api/v1beta1/replicationControllers/myNginx
resourceVersion: "3"
namespace: default
desiredState:
 replicas: 3
 replicaSelector:
 simpleService: myNginx
 podTemplate:
 desiredState:
 manifest:
 version: v1beta2
 id: ""
 volumes: []
 containers:
 - name: mynginx
 image: dockerfile/nginx
 ports:
 - hostPort: 8080
 containerPort: 80
 protocol: TCP
 imagePullPolicy: ""
 restartPolicy:
 always: {}
 labels:
 simpleService: myNginx
currentState:
 replicas: 0
 podTemplate:
 desiredState:
 manifest:
 version: ""
 id: ""
 volumes: []
 containers: []
 restartPolicy: {}

Im-presionante:

$ cluster/kubecfg.sh list /pods
ID Image(s) Host Labels Status
---------- ---------- ---------- ---------- ----------
67a3b726-6d10-11e4-a8de-0800279696e1 dockerfile/nginx 10.245.2.2/10.245.2.2 replicationController=myNginx,simpleService=myNginx Waiting
67a4dbae-6d10-11e4-a8de-0800279696e1 dockerfile/nginx 10.245.2.3/10.245.2.3 replicationController=myNginx,simpleService=myNginx Waiting
67a4fc05-6d10-11e4-a8de-0800279696e1 dockerfile/nginx <unassigned> replicationController=myNginx,simpleService=myNginx Waiting

$ cluster/kubecfg.sh list /replicationControllers
ID Image(s) Selector Replicas
---------- ---------- ---------- ----------
myNginx dockerfile/nginx simpleService=myNginx 3

Y al cabo de un rato, los dos “minions” (nodos del cluster) terminan de aprovisionar los contenedores docker de NGINX:

$ cluster/kubecfg.sh list /pods
ID Image(s) Host Labels Status
---------- ---------- ---------- ---------- ----------
67a3b726-6d10-11e4-a8de-0800279696e1 dockerfile/nginx 10.245.2.2/10.245.2.2 replicationController=myNginx,simpleService=myNginx Running
67a4dbae-6d10-11e4-a8de-0800279696e1 dockerfile/nginx 10.245.2.3/10.245.2.3 replicationController=myNginx,simpleService=myNginx Running
67a4fc05-6d10-11e4-a8de-0800279696e1 dockerfile/nginx <unassigned> replicationController=myNginx,simpleService=myNginx Waiting

Y…

Captura de pantalla 2014-11-15 a las 22.52.08

Tengo que seguir investigando…