Kubernetes: La guía de instalación definitiva

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.

Comparte este artículo

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *