Tras horas y horas leyendo documentación y peleándome con errores a la hora de crear un cluster de Kubernetes sobre VMs, en este artículo vamos a tener los pasos y comandos necesarios para una puesta en marcha exitosa. En mi caso, el SO que yo he elegido para empezar a jugar con el cluster es Ubuntu 18.04.
Mi cluster se va a componer de 1 nodo Master y 2 Workers. Por lo tanto, lo primero de todo es reservarme 3 IPs, hostnames y crear esas 3 VMs. Como mínimo la VM que hará de Master tiene que tener 2 CPUs y 2GB de memoria, y las que harán de Workers basta con 1 CPU y 1GB de memoria.
Lo siguiente será modificar el fichero hosts de cada VM, añadiendo tanto la IP y el hostname del Master como la de los Workers.
sudo vi /etc/hosts
A partir de aquí, para aclarar y facilitar he dividido los pasos de instalación por: Comunes para ambos nodos (Master y Workers), Solo en Master, Solo en Worker
Comunes para Master y Workers
Lo primero que vamos a hacer es instalar y habilitar Docker en ambos. Seguramente nos pedirá también actualizar apt-get.
sudo apt-get update sudo apt install docker.io sudo systemctl enable docker sudo systemctl start docker
Antes de pasar a instalar los componentes de Kubernetes, lo siguiente será deshabilitar el firewall y la memoria de intercambio ya que si no Kubernetes no funciona correctamente.
sudo ufw disable sudo swapoff -a
Ahora instalamos el paquete «apt-transport-https» para descargar Kubernetes
sudo apt-get update && sudo apt-get install -y apt-transport-https
Necesitamos tener las claves públicas para acceder a los paquetes en Google Cloud.
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add
Instalamos el agente kubelet, kubeadm y la herramienta kubectl para usar la CLI.
sudo apt-get update && sudo apt-get install -y kubelet kubeadm kubectl
Por último, lo único que va a ser común de estos 3 será el kubelet. Lo habilitamos e inicializamos.
sudo systemctl enable kubelet sudo systemctl start kubelet
Solo en nodo Master
Es aquí donde vamos a tener el API Server y desde donde vamos a inicializar el cluster de K8s.
NOTA: Es importante que anotes la información que devuelve este comando (comandos, IP, Token), ya que será lo que necesites más adelante para añadir los Workers.
sudo kubeadm init --apiserver-advertise-address=[IP del nodo Master] --pod-network-cidr=10.244.0.0/16
Si todo ha ido bien, leerás algo así:

Como bien dice, para interactuar con el clúster de Kubernetes mediante kubectl, necesitamos tener el archivo «kube» de configuración con nosotros.
Para ello, copiamos los comandos que nos ha devuelto el paso anterior para obtener el archivo de configuración «kube» y colocarlo en el directorio de trabajo.
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
Una vez que el Master del clúster está listo y los servicios se están ejecutando, con el fin de hacer que los contenedores sean accesibles entre sí a través de la red, necesitamos configurar la red para la comunicación de contenedores.
Obtenemos la configuración de CNI (interfaz de red de contenedores) de Flannel
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
NOTA: Como estamos trabajando en VMs, primero debemos verificar la IP de nuestra interfaz Ethernet.
ip a s
En mi caso me fijo en la ens160.
Ahora necesitamos agregar los argumentos adicionales para ens160 en el fichero kube-flannel.yml
NOTA: Recomiendo ejecutar gedit para editar el fichero y facilitar la búsqueda
gedit kube-flannel.yml
Buscar “flanneld ” y añadir la interfaz correspondiente en la sección “args ”: –iface=ens160

Lo siguiente será configurar esa red de comunicación entre pods
kubectl apply -f kube-flannel.yml
Solo en nodos Worker
Lo único que tenemos que hacer en los Workers será unirnos al cluster mediante el comando que nos devolvía la inicialización. Lo copiamos de ahí.
kubeadm join [IP del Master]:6443 --token [...] --discovery-token-ca-cert-hash sha256:[token]
Crear Dashboard

El dashboard nos va a permitir tener una vista del estado de nuestro cluster, además de facilitarnos mucho a la hora de crear Deployments, Jobs, Servicios o lo que sea. No va a ser más que un pod más, bajo el namespace kube-system, en el que se instalan los pods del sistema.
Para crearlo, lo vamos a hacer desde el nodo Master.
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml
Si el cluster funciona correctamente, deberíamos ver la confirmación de la creación de un grupo de componentes de Kubernetes.
Comprobamos que tenemos 2 nuevos pods ejecutándose:
kubectl get pods -A ... kubernetes-dashboard dashboard-metrics-scraper-6b4884c9d5-v4z89 1/1 Running 0 30m kubernetes-dashboard kubernetes-dashboard-7b544877d5-m8jzk 1/1 Running 0 30m
Por último, nos falta conseguir el token para el acceso
kubectl get secret -n kubernetes-dashboard $(kubectl get serviceaccount admin-user -n kubernetes-dashboard -o jsonpath="{.secrets[0].name}") -o jsonpath="{.data.token}" | base64 --decode
A continuación, nos dará una salida de una larga cadena de caracteres aparentemente aleatorios. El token se crea cada vez que se implementa el dashboard y es necesario para iniciar sesión en él. T
NOTA: Tenga en cuenta que el token cambiará si el pod del dashboard se detiene y se vuelve a implementar.
Para acceder al dashboard, necesitamos exponer el pod. En un entorno de no producción la forma más sencilla de exponer un pod es a través del comando kubectl proxy.
kubectl proxy --address 0.0.0.0 --accept-hosts '.*' ... Starting to serve on [IP del Master]:8001
Ahora ya podemos acceder desde el navegador: http://[IP del Master]:8001/api/v1/namespaces/kube-system/services/kubernetes-dashboard/proxy/#!/node?namespace=default
Si todo ha salido bien, nos saldrá una ventana para el login:

Selecciona el método de autenticación mediante Token y copiamos nuestro token de administrador en el campo a continuación. Hacemos click en el botón de Sign In y ya deberíamos tener una vista general de nuestro cluster de Kubernetes.