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):
- Vagrant >=1.6.2
- VirtualBox
- 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):
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…
Tengo que seguir investigando…

