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…