Hoy empiezo con Kubernetes

Desde que te dije que iba a empezar con Docker, la verdad es que ya hemos recorrido un largo camino, pero todav√≠a queda mucho por aprender ūüôā Si no has tenido oportunidad de ver los art√≠culos anteriores al respecto creo que te pueden ayudar, si tu idea es empezar tambi√©n con Kubernetes. Aqu√≠ te dejo el listado de lo visto hasta ahora:

Hoy voy a empezar a ver contigo Kubernetes y quiero hacerlo con una breve descripci√≥n de qu√© es y c√≥mo montar tu primer cl√ļster en local ¬°Empecemos!

¬ŅQu√© es Kubernetes?

Al igual que Docker Swarm, Kubernetes es un orquestador de contenedores, creado por Google, por lo que su trabajo es arrancar y parar aplicaciones basadas en contenedores. Adem√°s, es capaz de decidir por nosotros en qu√© parte del cl√ļster pondr√° nuestra aplicaci√≥n y nos promete adem√°s abstracci√≥n de la infraestructura que hay por debajo. Por √ļltimo existe este concepto llamado Desired State, que b√°sicamente lo que dice es que podemos definir c√≥mo son nuestras aplicaciones y Kubernetes ser√° el encargado de que esto se cumpla. Esto ocurr√≠a tambi√©n cuando te cont√© Swarm, con nuestro archivo YAML, que especifica qu√© pinta tiene nuestra aplicaci√≥n y este se encargaba de desplegarlo en el cl√ļster y mantener el n√ļmero de replicas que hab√≠amos elegido para nuestra aplicaci√≥n.
Una de las mayores ventajas de usar Kubernetes es su rápidez tanto en despliegue como en recuperación, de ahí que se haya hecho tan famoso.

Al igual que ocurre con Swarm, en un cl√ļster con Kubernetes tenemos dos roles: master, que es el que gestiona el cl√ļster, y nodes, que son los que curran ūüėČ En cada m√°quina hay un agente instalado llamado kubelet, que es el que se utiliza para que el master pueda comunicarse con los nodos. Seg√ļn la documentaci√≥n oficial, un cl√ļster productivo deber√≠a de tener un m√≠nimo de tres nodos.

Para este art√≠culo voy a mostrarte c√≥mo montar un cl√ļster de Kubernetes en local utilizando VirtualBox, para que lo puedas hacer en el sistema operativo que quieras. Existen varias formas de instalarlo, por ejemplo:

Para este caso voy a utilizar kubeadm que hace mucho del trabajo por nosotros y adem√°s pretende seguir las buenas pr√°cticas establecidas. No pretendo montar un entorno productivo pero si ver qu√© es lo m√≠nimo necesario para poder montar tu propio cl√ļster.

Crear las m√°quinas virtuales en VirtualBox

Para este ejemplo voy a utilizar 2 nodos (k8s-node1 y k8s-node2) y 1 máster (k8s-master) sobre VirtualBox. Me he descargado Ubuntu Server 18.04.2 LTS desde aquí. He modificado el tipo de adaptador a Bridge Adapter (Adaptador puente), en el apartado Settings > Network de cada máquina, para que las mismas pertenezcan a mi red local y así hacer más fácil el acceso.

Cambia el adaptador a Bridged Adapter para poder ver las VMs en tu red local

En la m√°quina que va a hacer de m√°ster es importante que tenga 2GB de RAM y 2 cores, ya que sino en alg√ļn momento se quejar√°. Se puede modificar en Settings > System > Processor > 2 CPUs.

El resultado debería de ser el siguiente:

Por √ļltimo, asocia la ISO de Ubuntu y comienza la instalaci√≥n en cada una de las m√°quinas.

Durante la instalaci√≥n, he utilizado los valores por defecto que se me iban ofreciendo en cada momento. Lo que s√≠ he marcado es la instalaci√≥n de OpenSSH server, para que lanzar comandos a mis m√°quinas sea m√°s sencillo, ya que usar√© Visual Studio Code como entorno de trabajo durante todo el art√≠culo. En cuanto a la parte de Server Snaps no instales nada por defecto, que lo que queremos es aprender ūüôā (aunque puedes ver que aparece docker, micro8ks, powershell, etc√©tera). Una vez que tus m√°quinas hayan terminado la instalaci√≥n, anota sus IPs locales para poder acceder a ellas a trav√©s de SSH, aunque tambi√©n puedes ir lanzando los pasos en cada una de las VMs directamente.

Para mantener las IPs estáticas de las máquinas debes modificar el archivo /etc/netplan/50-cloud-init.yaml en cada una de ellas. Aquí te dejo de ejemplo la configuración de mi máster.

# This file is generated from information provided by
# the datasource.  Changes to it will not persist across an instance.
# To disable cloud-init's network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
network:
    ethernets:
        enp0s3:
            dhcp4: no
            addresses: [192.168.1.51/24]
            gateway4: 192.168.1.1
            nameservers:
              addresses: [8.8.8.8,8.8.4.4]
    version: 2

Una vez modificado el archivo lanza el siguiente comando para aplicar los cambios:

sudo netplan apply

Nota: En entornos productivos las distribuciones que se suelen utilizar son Alpine Linux, Ubuntu Core o Container Linux.

Instalación de paquetes en las máquinas virtuales

Hay una serie de pasos que van a ser comunes tanto para la m√°quina que har√° de m√°ster como para los nodos, por lo que voy a paralelizar las tareas que hay que lanzar en todas y luego te muestro los pasos adicionales tanto en el master como en los nodos.

Pasos comunes

Lo primero que necesitas es deshabilitar el swap de todas las m√°quinas.

sudo swapoff -a

Comenta también en el fichero /etc/fstab la linea relacionada con el swap.

sudo vi /etc/fstab

A√Īade la clave para el repositorio de Google y a√Īade el repositorio de Kubernetes a tu lista de repos.

#Add Google's apt repository gpg key
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -

#Add the Kubernetes apt repository
sudo bash -c 'cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF'

Actualiza la lista de paquetes disponibles e instala docker, que ser√° el tipo de contenedores que vamos a desplegar en nuestro cl√ļster (Kubernetes acepta otros tambi√©n), kubelet, kubeadm y kubectl.

sudo apt-get update
sudo apt-get install -y docker.io kubelet kubeadm kubectl

Marca adem√°s estos paquetes como “no actualizables”.

sudo apt-mark hold docker.io kubelet kubeadm kubectl

Para terminar, asegurate de que kubelet y docker se inician autom√°ticamente cuando el sistema arranque.

sudo systemctl enable kubelet.service
sudo systemctl enable docker.service

Aquí puedes ver todos los pasos sobre el terminal:

Configuración del máster

El nodo m√°ster es el encargado de iniciar el cl√ļster y aqu√≠ es donde nos va a ayudar kubeadm. Antes de lanzar el siguiente comando ten en cuenta esto: cuando inicias el cl√ļster vas a necesitar especificar un par√°metro llamado –pod-network-cidr que, como su propio nombre indica, viene a decir cu√°l va a ser el CIDR que se va a utilizar para la red donde van a vivir los pods del cl√ļster. Si no est√°s familiarizado/a con el concepto, simplemente es el rango de IPs que se van a asignar a tus aplicaciones seg√ļn se vayan creando (lo veremos en el siguiente art√≠culo). Este punto es muy importante ya que si no lo configuras bien puedes tener problemas de conflictos de IPs con la red donde est√° el host. Por ahora qu√©date con que este rango no puede ser el mismo que est√°s utilizando en tu red local. Por ejemplo, como en mi caso, si estoy en una red que trabaja en el rango 192.168.1.0, debo cambiar este a otro distinto, por ejemplo 10.0.0.0. Creo que es esta es la parte que m√°s me ha costado entender de Kubernetes (y todav√≠a sigo) que, si bien es potente, es un jaleo de IPs importante.

sudo kubeadm init --pod-network-cidr=10.0.0.0/16

Esta operaci√≥n tardar√° unos instantes y finalmente te notificar√° de que el cl√ļster se ha iniciado correctamente. Adem√°s, te mostrar√° el comando que los nodos deben lanzar para unirse al mismo.

Your Kubernetes master has initialized successfully!

Como pone en el mensaje de salida, para poder empezar usar el cl√ļster debes lanzar el siguiente comando con un usuario que no sea root.

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

Para finalizar con la configuración del máster, uno de los puntos más importantes que debes de decidir, antes de alojar tus apps en Kubernetes, es qué topología de red quieres. Para este ejemplo vamos a trabajar con el proyecto calico, por lo que necesitas descargar los siguientes archivos.

wget https://docs.projectcalico.org/v3.3/getting-started/kubernetes/installation/hosted/rbac-kdd.yaml
wget https://docs.projectcalico.org/v3.3/getting-started/kubernetes/installation/hosted/kubernetes-datastore/calico-networking/1.7/calico.yaml

El archivo calico.yaml utiliza por defecto el CIDR 192.168.0.0/16. Si est√°s en el mismo caso que yo, antes de aplicar la configuraci√≥n que viene en dicho archivo, debes modificar el valor de la propiedad CALICO_IPV4POOL_CIDR para que coincida con el valor que has asignado a –pod-network-cidr.

Puedes acceder al archivo a través del terminal utilizando el editor vi.

vi calico.yaml

Y después debes buscar CALICO_IPV4POOL_CIDR y modificarlo a 10.0.0.0/16.

Utiliza estos dos ficheros para aplicarlos a tu cl√ļster.

kubectl apply -f rbac-kdd.yaml
kubectl apply -f calico.yaml

¬°Ya tienes tu cl√ļster listo para empezar! Ahora vamos a por la configuraci√≥n de los nodos.

Nodos

A parte de lo que vimos en el apartado de tareas comunes, lo que nos falta es a√Īadir estas m√°quinas al cl√ļster. Cuando lanzaste el comando kubeadm este te devolvi√≥ el comando que deb√≠as lanzar en los nodos para que estos se puedan unir. El comando ser√° parecido al siguiente:

sudo kubeadm join 192.168.1.51:6443 \
    --token dkvf4t.c87k9rfqz77co877 \
    --discovery-token-ca-cert-hash sha256:9237727ee4a487faa76ba357c609a6b8bab2c69885689b6f4432054805dd6bcd

Cuando lo lances, en cada uno de los nodos obtendr√°s un mensaje como el siguiente:

This node has joined the cluster

Comprobar que todo funciona correctamente

Ya tienes todas las m√°quinas configuradas y unidas al cl√ļster. Esta configuraci√≥n ha sido muy b√°sica y muy por defecto pero creo que lo suficientemente buena para arrancar con Kubernetes. Para terminar este art√≠culo puedes lanzar los siguientes comandos para ver que todo funciona correctamente:

#Get cluster information
kubectl cluster-info

#Get all nodes in the cluster
kubectl get nodes

#Get pods
kubectl get pods

En este video puedes ver el resultado de cada uno de los comandos.

En el próximo artículo veremos cómo se despliegan las aplicaciones en Kubernetes.

¬°Saludos!