Poniendo a correr un WEB en NodeJS con Kubernetes.
Creamos una app simple en Nodejs (server web que devuelve un “Hola Dockertips!” )
# vi node server.js
var http = require('http');
var handleRequest = function(request, response) {
console.log('Received request for URL: ' + request.url);
response.writeHead(200);
response.end('Hola Dockertips!');
};
var www = http.createServer(handleRequest);
www.listen(8888);
Lo probamos con un
# node server.js
y accedemos mediante un navegador a
* http://127.0.0.1:8888
Crearemos un nuevo contenedor basándonos en uno de Node V. 6.9.2
# vi Dockerfile
FROM node:6.9.2
EXPOSE 8080
COPY server.js .
CMD node server.js
Construimos la imágen.
# docker build -t hello-node:v1 .
Sending build context to Docker daemon 3.072kB
Step 1/4 : FROM node:6.9.2
6.9.2: Pulling from library/node
75a822cd7888: Pull complete
57de64c72267: Pull complete
4306be1e8943: Pull complete
871436ab7225: Pull complete
0110c26a367a: Pull complete
1f04fe713f1b: Pull complete
ac7c0b5fb553: Pull complete
Digest: sha256:2e95be60faf429d6c97d928c762cb36f1940f4456ce4bd33fbdc34de94a5e043
Status: Downloaded newer image for node:6.9.2
---> faaadb4aaf9b
Step 2/4 : EXPOSE 8080
---> Running in f0e8e3226440
---> dea00f0cc475
Removing intermediate container f0e8e3226440
Step 3/4 : COPY server.js .
---> 567d0c6d3366
Removing intermediate container e78804e31889
Step 4/4 : CMD node server.js
---> Running in 769d68dde466
---> 8540ce4f93a8
Removing intermediate container 769d68dde466
Successfully built 8540ce4f93a8
Successfully tagged hello-node:v1
Nuestra imágen mide 655 MB incluyendo nuestro servidor web en Nodejs.
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
node 6.9.2 faaadb4aaf9b 12 months ago 655MB
Ponemos en marcha el contenedor.
# kubectl run hello-node --image=hello-node:v1 --port=8080
deployment "hello-node" created
Vemos que está en funcionamiento.
# docker stats
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
05f57d09e86b k8s_hello-node_hello-node-75ddf8bc9d-dqtmp_default_d2a49e4c-e5a4-11e7-ac4c-08002789f4ab_0 0.00% 8.664MiB / 1.953GiB 0.43% 1.18kB / 0B 0B / 0B 7
Como continuamos con el despliegue anterior, vemos dos contenedores corriendo.
# kubectl get deployments
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
hello-node 1 1 1 1 1m
kubernetes-bootcamp 1 1 1 1 51m
# kubectl get pods
NAME READY STATUS RESTARTS AGE
hello-node-75ddf8bc9d-dqtmp 1/1 Running 0 2m
kubernetes-bootcamp-6db74b9f76-6jkwt 1/1 Running 0 51m
Desde la interfaz web podemos ver MiniKube funcionando.
GRAFICO7:
GRAFICO8:
Ahora vemos los eventos
# kubectl get events
LAST SEEN FIRST SEEN COUNT NAME KIND SUBOBJECT TYPE REASON SOURCE MESSAGE
2m 2m 1 hello-node-75ddf8bc9d-dqtmp.15020e52ad2f7329 Pod Normal Scheduled default-scheduler Successfully assigned hello-node-75ddf8bc9d-dqtmp to minikube
2m 2m 1 hello-node-75ddf8bc9d-dqtmp.15020e52b96f2d36 Pod Normal SuccessfulMountVolume kubelet, minikube MountVolume.SetUp succeeded for volume "default-token-668vt"
2m 2m 1 hello-node-75ddf8bc9d-dqtmp.15020e52f56a8e75 Pod spec.containers{hello-node} Normal Pulled kubelet, minikube Container image "hello-node:v1" already present on machine
2m 2m 1 hello-node-75ddf8bc9d-dqtmp.15020e5304ac6090 Pod spec.containers{hello-node} Normal Created kubelet, minikube Created container
2m 2m 1 hello-node-75ddf8bc9d-dqtmp.15020e53140df2b5 Pod spec.containers{hello-node} Normal Started kubelet, minikube Started container
2m 2m 1 hello-node-75ddf8bc9d.15020e52ab3eb298 ReplicaSet Normal SuccessfulCreate replicaset-controller Created pod: hello-node-75ddf8bc9d-dqtmp
2m 2m 1 hello-node.15020e52a83372ad Deployment Normal ScalingReplicaSet
Para que el servidor pueda dar servicio a la red lo publicamos.
# kubectl expose deployment hello-node --type=LoadBalancer
Podemos acceder al servidor de MiniKube son un shell.
# minikube ssh
_ _ ( ) ( )
___ ___ (_) ___ (_)| |/') _ _ | |_ __
/' _ ` _ `\| |/' _ `\| || , < ( ) ( )| '_`\ /'__`\
| ( ) ( ) || || ( ) || || |\`\ | (_) || |_) )( ___/
(_) (_) (_)(_)(_) (_)(_)(_) (_)`\___/'(_,__/'`\____)
$ uname -a
Linux minikube 4.9.13 #1 SMP Thu Oct 19 17:14:00 UTC 2017 x86_64 GNU/Linux
$ exit
logout
# kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hello-node LoadBalancer 10.101.211.128 <pending> 8080:30676/TCP 1m
Este comando nos abrirá una ventana en un navegador donde nos correrá el WEB. ( http://192.168.99.100:30676/ )
# minikube service hello-node
Plugins/Addons que se pueden activar o desactivar en MiniKube.
# minikube addons list
- default-storageclass: enabled
- storage-provisioner: enabled
- efk: disabled
- ingress: disabled
- registry-creds: disabled
- addon-manager: enabled
- dashboard: enabled
- coredns: disabled
- kube-dns: enabled
- heapster: disabled
- registry: disabled
Para parar y borrar, hacemos.
# kubectl delete service hello-node
# kubectl delete deployment hello-node
# minikube stop
Stopping local Kubernetes cluster...
Este comando borrará la máquina virtual completa.
# -- minikube delete