Kubernetes – Guía para crear nuestro clúster (II)

A pesar de llevar un cierto tiempo usando Kubernetes en producción, ha sido este año cuando hemos comenzado a impartir las formaciones oficiales de la Linux Foundation, haciendo un foco especial en Kubernetes. Podéis comprobar nuestra oferta disponible en el catálogo de productos o en nuestra tienda virtual.

Añadiendo nodos workers

En nuestro primer post, vimos cómo comenzar a crear nuestro clúster de Kubernetes. Para ello instalamos en el primer nodo los componentes necesarios para establecer este nodo como «master» o el nodo que actuará como Plano de Control. Este nodo máster es el encargado de los componentes esenciales para el correcto funcionamiento del clúster. En él se ejecutan los pods de sistema. Los nodos workers son los que ejecutarán la carga de nuestras aplicaciones.

Descripción del Laboratorio

En esta guía, continuación de este post, vamos a utilizar equipos físicos como los nodos participantes de nuestro clúster de Kubernetes. En este laboratorio, prepararemos un escenario en el que necesitaremos el siguiente material:

  • Equipos que funcionarán como nodos (también podemos usar máquinas virtuales en nuestro home-lab)
  • Un cable ethernet por cada nodo
  • Un switch de red o router

Objetivos de la práctica

  • Instalar los componentes del nodo worker.
  • Adopción del nodo worker.
  • Verificar la configuración realizada.

Configuración paso a paso

1. Instalando componentes esenciales: Containerd

Partimos de la base que tenemos el sistema operativo ya funcional, con una red para el clúster configurada y accesible por SSH. Para comenzar el proceso para crear un worker que formará parte del clúster, actualizamos los repositorios e instalamos componentes de manera similar a como hicimos con el nodo máster

apt-get update && apt-get upgrade -y
apt install curl apt-transport-https vim git wget software-properties-common lsb-release ca-certificates -y
swapoff -a
modprobe overlay
modprobe br_netfilter
cat << EOF | tee /etc/sysctl.d/kubernetes.conf
  net.bridge.bridge-nf-call-ip6tables = 1
  net.bridge.bridge-nf-call-iptables = 1
  net.ipv4.ip_forward = 1
  EOF
sysctl --system
mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
apt-get update && apt-get install containerd.io -y
containerd config default | tee /etc/containerd/config.toml
sed -e 's/SystemdCgroup = false/SystemdCgroup = true/g' -i /etc/containerd/config.toml
systemctl restart containerd

2. Instalando Kubernetes

Como ya hicimos en el post anterior, añadimos los repositorios de Kubernetes –> deb http://apt.kubernetes.io/ kubernetes-xenial main y la clave GPG antes de instalar los componentes. Importante tener en cuenta que coincidan las versiones de nodo máster y nodo worker.

nano /etc/apt/sources.list.d/kubernetes.list
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
apt-get update
apt-cache madison kubeadm kubelet kubectl
apt-get install -y kubeadm=1.27.1-00 kubelet=1.27.1-00 kubectl=1.27.1-00
apt-mark hold kubelet kubeadm kubectl

3. Uniendo el worker al clúster

En este punto podríamos copiar y pegar el comando join del nodo master. Necesitamos encontrar el token en el nodo master. Ese comando sólo funciona durante 2 horas, así que construiremos nuestro propio join por si queremos añadir nodos en el futuro. Si ha pasado más tiempo, y no hay ningún token presente podemos generar uno nuevo con el comando sudo kubeadm token create, visto en el siguiente comando.

sudo kubeadm token list
sudo kubeadm token create

Creamos un Discovery Token CA Cert Hash desde el nodo master para asegurar que el nodo worker se une al cluster de forma segura. Ejecutaremos esto en el nodo master (o donde tengamos) una copia del archivo CA. Obtendremos una cadena larga como salida.

openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/ˆ.* //'

En el nodo worker añadiremos un alias DNS local para el nodo master. Editamos el archivo /etc/hosts para añadir la dirección IP del master y le asignamos el nombre k8scp. La entrada debe ser exactamente la misma que la editada en el master.

nano /etc/hosts

Utilizaremos el token y el hash, en este caso como sha256:long-hash para unir al cluster desde el nodo worker. Usaremos la dirección IP privada del nodo master y el puerto 6443. La salida del kubeadm init en el master también tiene un ejemplo para usar, si todavía está disponible.

kubeadm join --token 27eee4.6e66ff60318za928 k8scp:6443 --discovery-token-ca-cert-hash sha256:6d541678b05652e1fa5d43908e75e67376e994c3483d6683f2a18673e5d4c34

Intentamos ejecutar el comando kubectl en el nodo worker. Debería fallar puesto que en el nodo worker no tenemos las claves de cluster o de autenticación en su archivo local .kube/config.

kubectl get nodes
cd ~/
mkdir .kube
cd .kube
scp vitoko@k8scp:/home/vitoko/.kube/config
kubectl get nodes

En esta parte, hemos logrado configurar y poner en funcionamiento nuestro nodo secundario de Kubernetes y también hemos repasado como a instalar y configurar los componentes esenciales de Kubernetes, como kubelet, kubeadm y kubectl.

En la siguiente parte de este tutorial, nos enfocaremos en hacer despliegues de aplicaciones, repasando los conceptos de los diferentes elementos que componen Kubernetes, una vez ya tenemos nuestro cluster funcional

En las certificaciones oficiales de Linux Foundation impartidas en loopback0, explicamos en profundidad los diferentes tipos de configuraciones para Kubernetes y sus diferentes aplicaciones.