Cluster Kubernetes Raspberry Pi 2


Kubernetes
Facebooktwittergoogle_plusredditpinterestlinkedinmailFacebooktwittergoogle_plusredditpinterestlinkedinmail

Después de un tiempo investigando como funciona y haciendo varios test hoy vamos a explicar como hemos montado un cluster de Kubernetes con 3 Raspberry Pi 2. Para ello hemos utilizado la imagen de Hypriot Cluster Lab. Hemos utilizado 3 nodos de Raspberry Pi 2 pero podríamos haber usado mas o menos dependiendo de nuestras necesidades.

Lo primero que debemos hacer es flashear 3 tarjetas SD con la imagen de hypriot cluster lab. Recomendamos utilizar el script flash.sh que hemos explicado en posts anteriores y que nos servirá para poder dar nombre a los nodos. En nuestro caso usaremos los típicos de los tutoriales de hypriot: cl-master, cl-node-1 y cl-node-2.

Una vez arrancamos nos conectamos a nuestro nodo cl-master y una vez allí configuramos el master del cluster de la siguiente forma:

curl -L -o k8s-on-rpi.zip https://github.com/awassink/k8s-on-rpi/archive/master.zip

apt-get update && apt-get install unzip && unzip k8s-on-rpi.zip

k8s-on-rpi-master/install-k8s-master.sh

El script que estamos ejecutando lo que hará será instalar 5 servicios de kubernetes:

  • docker-bootstrap.service – Es un demonio para ejecutar etcd y flannel nos sirven para la configuración de red y se ejecutan antes que el demonio de docker (docker.service).
  • k8s-etcd.service – Es el servicio etcd para guardar los datos de flannel y kubelet.
  • k8s-flannel.service – Es el proceso de flannel que nos da red interna a todos los nodos del cluster.
  • docker.service – Es el demonio standard de docker utilizando flannel como bridge. Es el encargado de ejecutar los containers de docker.
  • k8s-master.service – Es el servicio master de kubernetes que nos da la funcionalidad de clúster.

Bien, una vez se ha ejecutado este script con la instalación correcta lo que haremos será comprobar que todo está funcionando correctamente, primero vamos a ver que docker esta corriendo en la máquina:

ps -ef | grep docker

 

docker

 

Revisamos que los containers etcd y flannel están up:

docker -H unix:///var/run/docker-bootstrap.sock ps

etcd and flannel

 

Containers con hyperkube kubelet, apiserver, scheduler, controller y proxy están corriendo.

docker

 

Una vez tenemos instalado Kubernetes lo que vamos a hacer es ejecutar nuestro primer servicio. Para ello nos descargaremos kubectl para procesadores ARM disponible desde googleapis storage. Si ejecutamos kubectl get nodes veremos los nodos registrados en nuestro clúster.

curl -fsSL -o /usr/bin/kubectl https://storage.googleapis.com/kubernetes-release/release/v1.1.2/bin/linux/arm/kubectl
chmod 775 /usr/bin/kubectl
kubectl get nodes

kubectl get nodes

 

Una vez llegados a este punto la instalación en el nodo cl-master ya ha terminado. Ahora lo que vamos a hacer es la instalación en los nodos cl-node-1 y cl-node-2. Para ello seguiremos estos pasos:

curl -L -o k8s-on-rpi.zip https://github.com/awassink/k8s-on-rpi/archive/master.zip

apt-get update && apt-get install unzip && unzip k8s-on-rpi.zip

mkdir /etc/kubernetes

cp k8s-on-rpi-master/rootfs/etc/kubernetes/k8s.conf /etc/kubernetes/k8s.conf

Una vez hemos copiado la configuración en /etc/kubernetes/k8s.conf editamos precisamente este fichero para indicarle la IP del nodo cl-master quedando así:

K8S_MASTER_IP=192.168.1.22

Una vez hecha esta modificación ejecutamos el siguiente script:

k8s-on-rpi-master/install-k8s-worker.sh

 

Cuando ya hemos ejecutado estos pasos en los workers lo que haremos será ir al nodo master y ejecutar el comando kubectl get nodes para así ver que se han añadido correctamente:

kubectl get nodes

 

Una manera fácil para testear el funcionamiento de Kubernetes es utilitzar el clásico container “Busybox” que también como ya sabemos tiene una imagen para ARM. Kubectl ejecuta un container dentro de un pod. Si ejecutamos kubectl get pods veremos los pods que tenemos registrados con el estado actual. Un pod viene a ser un container dentro de kubernetes.

kubectl run busybox –image=hypriot/rpi-busybox-httpd
kubectl get pods -o wide
busybox kubernetes

 

 

como veis en la imagen ejecutamos el pod “busybox” y seguidamente vemos que kubernetes ha elegido el nodo con IP 192.168.1.222 para ejecutar-lo allí. Seguidamente ejecutamos el comando kubectl get pods -o wide para ver el estado en el que se encuentra. Inicialmente esta en “pending” porque esta ejecutándolo sobre el nodo indicado y finalmente cambia el estado a “Running” por qué ya está ejecutándose en el nodo indicado.

 

Ahora el escenario es el siguiente, tenemos nuestro clúster de Kubernetes corriendo con 3 nodos y hemos ejecutado un pod (Busybox) sobre el nodo 192.168.1.222 pero de momento no tenemos “acceso” a él. Y eso es por qué al igual que con Docker, en Kubernetes debemos hacer un bind de puertos. En este caso le tenemos que indicar por linea de comandos el puerto que exponemos de un pod en concreto de la siguiente forma:

kubectl expose rc busybox –port=80 –target-port=80 –external-ip=192.168.1.222

kubectl get svc

kubernetes expose

 

Ahora ya podemos ir a nuestro navegador y acceder a http://192.168.1.222 y veremos el frontal web del pod busybox!

Facebooktwittergoogle_plusredditpinterestlinkedinmailFacebooktwittergoogle_plusredditpinterestlinkedinmail