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

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.

¿Qué es la Linux Foundation ?

Linux Foundation juega un papel fundamental en el impulso y la promoción del software de código abierto en todo el mundo. Es una organización sin fines de lucro que se dedica a la promoción, el desarrollo y la colaboración en torno al ecosistema de código abierto, con un enfoque particular en el sistema operativo Linux y las tecnologías relacionadas. Fue fundada en 2007 y brinda apoyo a una amplia gama de proyectos de código abierto, proporcionando recursos, financiamiento, infraestructura y gobernanza neutral para fomentar la innovación y el crecimiento de la comunidad de código abierto. Linux Foundation también organiza eventos, ofrece formación y certificaciones (a través de partners como Loopback0), y promueve estándares abiertos para beneficiar a la industria de la tecnología en general.

¿Qué es la Cloud Native Computing Foundation?

CNCF es una organización sin fines de lucro que se enfoca en fomentar y promover tecnologías de computación nativas de la nube y proyectos de código abierto relacionados. Fundada en 2015 como parte de la Linux Foundation, la CNCF brinda un hogar neutral para proyectos de código abierto de gran impacto, proporcionando infraestructura, gobernanza y apoyo técnico para promover la adopción de tecnologías nativas de la nube.

La CNCF es conocida por alojar y mantener proyectos populares como Kubernetes, Prometheus, Envoy, Fluentd, Linkerd y muchos otros.

¿Qué es Kubernetes?

Kubernetes es un proyecto desarrollado por el equipo de ingeniería de Google que básicamente se trata de una plataforma de código abierto diseñada para automatizar, escalar y gestionar aplicaciones en contenedores. Proporciona herramientas para despliegue, escalamiento automático, manejo de recursos y balanceo de carga, facilitando la gestión de aplicaciones en entornos de infraestructura modernos y distribuidos.

Estructura del clúster de Kubernetes

Un clúster de Kubernetes consiste en una serie de nodos que están interconectados en una red y trabajan juntos para ejecutar y gestionar contenedores. Una descripción de los componentes físicos de un clúster de Kubernetes sería:

  1. Nodos:
    • Los nodos son las unidades básicas de cómputo en un clúster de Kubernetes.
    • Cada nodo puede ser una máquina física o virtual en tu infraestructura de hardware.
    • Los nodos ejecutan un sistema operativo compatible con Kubernetes, como Linux.
    • Cada nodo está configurado con software Kubernetes, incluyendo el Kubelet (agente de Kubernetes) y un runtime para la ejecución de contenedores.
    • Los nodos están interconectados en una red y pueden comunicarse entre sí a través de la red de clúster.
  2. Nodos Maestros:
    • Los nodos maestros son un subconjunto de nodos en el clúster que desempeñan un papel especial en la coordinación y el control del clúster.
    • Los nodos maestros alojan componentes como el API Server, el Scheduler, el Controller Manager y el etcd.
    • Estos componentes trabajan juntos para gestionar y orquestar los recursos en el clúster, como desplegar aplicaciones, escalado automático y manejo de fallos.
  3. Nodos de Trabajo:
    • Los nodos de trabajo son los nodos donde se ejecutan las aplicaciones y los contenedores en el clúster.
    • Cada nodo de trabajo ejecuta el Kubelet para comunicarse con la API Server del nodo maestro y gestionar los contenedores en el nodo.
    • Los nodos de trabajo también ejecutan componentes como el Kube Proxy para la gestión de la red entre los contenedores.
  4. Red de Clúster:
    • La red de clúster conecta todos los nodos en el clúster, permitiendo la comunicación entre los nodos y los contenedores.
    • La red de clúster también permite el tráfico de red entre los pods dentro del clúster, facilitando la comunicación entre las aplicaciones distribuidas.

 

En resumen, un clúster de Kubernetes físicamente consiste en nodos interconectados que ejecutan software Kubernetes y trabajan juntos para gestionar y ejecutar aplicaciones en contenedores de manera eficiente y escalable. Los nodos maestros proporcionan la gestión y el control centralizado del clúster, mientras que los nodos de trabajo ejecutan las aplicaciones y los contenedores. La red de clúster facilita la comunicación entre los nodos y los contenedores en el clúster.

 

Descripción del Laboratorio

En esta guía, 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 un entorno de Kubernetes por primera vez
  • Establecer una conexión entre los nodos
  • Verificar la configuración realizada.

Configuración paso a paso

1. Instalar un sistema operativo en cada nodo

Para el primer paso, tendremos que configurar el sistema operativo en todos los nodos. Sin él, los equipos no tiene ningún sistema para arrancar por defecto.

En esta guía vamos a usar la última versión de Ubuntu que la puedes encontrar aquí.

Elige tu pendrive para la instalación y flashealo con el OS correspondiente. Puedes usar la herramienta UnetBootin

2. Habilitar la conexión mediante SSH

Necesitarás configurar SSH para poder configurar remotamente cada nodo y no tener que estar con conectando el monitor, ni teclado, etc cada vez que queramos administrar un nodo. Acuérdate de configurar el fichero /etc/ssh/sshd_config según tus necesidades

sudo useradd vitoko
sudo passwd vitoko
sudo usermod -aG sudo vitoko
sudo apt install openssh-server
sudo systemctl status ssh

Actualizamos los repositorios e instalamos componentes.

apt-get update && apt-get upgrade -y
apt install curl apt-transport-https vim git wget software-properties-common lsb-release ca-certificates -y

3. Configuración de la red y configuraciones iniciales

Necesitarás que tus nodos tengan dirección IP, para hacer esto, comprueba la tabla de asignaciones del DHCP de tu router. Para esto, nosotros hemos utilizado un MikroTik y hemos generado entradas estáticas para cada uno de los nodos.

Importante: Kubernetes Scheduler nos obliga a deshabilitar swap en nuestros nodos. Existen varias maneras de realizarlo pero nosotros lo utilizaremos el siguiente comando:

sudo apt-get update && sudo apt-get install dphys-swapfile && sudo dphys-swapfile swapoff && sudo dphys-swapfile uninstall && sudo systemctl disable dphys-swapfile

Con el comando swapon –show podemos comprobarlo. También con htop vemos que no se están consumiendo recursos en esta parte

También vamos a configurar los módulos que nos aseguran que estén disponibles para los siguientes pasos.

modprobe overlay
modprobe br_netfilter

Actualizamos la parte de red del kernel para permitir el tráfico necesario.

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

Nos aseguramos que los cambios se hayan establecido con sysctl –system

Loguea por SSH en el primer nodo, este será su nodo maestro, que ejecutará el plano de control de su clúster y comenzamos a configurarlo.

3. Configuración inicial de Docker & Kubernetes

Instalamos las claves necesarias para que el software se descargue e instale correctamente

sudo 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

Instalamos containerd

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

Añadimos las nuevas repos para kubernetes dentro de nuestras sources –> deb http://apt.kubernetes.io/ kubernetes-xenial main

nano /etc/apt/sources.list.d/kubernetes.list

También puedes descargar un archivo tar o utilizar código de GitHub. Crea el archivo y añade una entrada para el repo principal de tu distribución. Estamos usando Ubuntu 20.04 pero el repo kubernetes-xenial del software, también incluye la palabra clave main.

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg apt-key add -
apt-get update

Ahora ya sí nos apareceran los componentes de kubernetes para poder instalarlos. En este momento, podemos decidir que versión instalar, especificándola con el siguiente comando, por ejemplo: apt-get install -y kubeadm=1.27.1-00 kubelet=1.27.1-00 kubectl=1.27.1-00 Nosotros lo dejamos vacío para instalar la última versión disponible. Con el primer comando comprobamos las versiones disponibles.

apt-cache madison kubeadm kubelet kubectl
apt-get install -y kubeadm kubelet kubectl

Para evitar que los componentes se actualicen con los apt-get update, para guardar la coherencia y tenerlos en todos los nodos con la misma versión, procedemos a bloquear las actualizaciones para estos componentes.

apt-mark hold kubelet kubeadm kubectl

Para poder saber la IP primaria del equipo y asignarle un alias DNS local, utilizamos los siguientes comandos y añadimos a nuestro fichero hosts una entrada en la primera línea que vincule la IP con un nombre significativo. En nuestro caso usaremos k8scp

hostname -i
ip addr show
nano /etc/hosts

4. Despliegues. Comenzando a trabajar con .yaml

En Kubernetes, YAML se utiliza para definir y configurar recursos y objetos del clúster, como pods, servicios, despliegues, configuraciones de red, y más. Los archivos YAML de Kubernetes describen la configuración deseada del clúster, incluidos los detalles de implementación y los parámetros de configuración. Esto permite a los administradores de clústeres y desarrolladores definir y gestionar la infraestructura de Kubernetes de manera declarativa y reproducible.

nano kubeadm-config.yaml

Es muy importante respetar la identación, nuestro archivo debe tener este texto dentro -> kubeadm-config.yaml Importante definir el parámetro con la versión correspondiente.

apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: 1.27.1
controlPlaneEndpoint: "k8scp:6443"
networking:
  podSubnet: 192.168.0.0/16

Ejecutamos el .yaml para comenzar el despliegue del clúster y aprovechamos para guardar esa salida inicial en un archivo y poder recuperar esa info posteriormente.

kubeadm init --config=kubeadm-config.yaml --upload-certs | tee kubeadm-init.out

Generamos nuestros archivos de configuración, que son los que nos van a permitir la gestión del clúster.

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

4. Instalando nuestra red. Comenzando a trabajar con .yaml

A estas alturas, tenemos que decidir que Container Networking Interface (CNI) vamos a utilizar. Sólo puede haber una red de pods por clúster, aunque el proyecto CNI-Genie está intentando cambiar esto. La red debe permitir comunicaciones contenedor-a-contenedor, pod-a-pod, pod-a-servicio, y externo-a-servicio. Existen varias CNI como Cilium, Calico, Flannel… En este caso, utilizaremos Calico como un plugin de red que nos permitirá utilizar Network Policies más adelante. En futuros posts, haremos una revisión de los diferentes CNI.

Para poder instalar Calico lo más sencillo es tener Helm instalado. Helm es un administrador de paquetes para Kubernetes que simplifica la gestión, instalación y actualización de aplicaciones en clústeres de Kubernetes. Permite empaquetar y compartir fácilmente aplicaciones Kubernetes como «charts», que contienen descripciones de recursos de Kubernetes y configuraciones predefinidas. Helm facilita la gestión de aplicaciones complejas en entornos de Kubernetes mediante la estandarización y automatización de los procesos de implementación y administración.

wget https://get.helm.sh/helm-v3.8.4-linux-amd64.tar.gz
tar -zxvf helm-v3.8.4-linux-amd64.tar.gz
sudo mv linux-amd64/helm /usr/local/bin/helm
helm version

Ahora ya podemos utilizar Helm para instalar Calico.

helm repo add tigera https://charts.tigera.io
helm repo update
helm install calico tigera/calico

Comprobamos que está funcionando con kubectl get pods -n calico-system

En esta parte, hemos logrado configurar y poner en funcionamiento nuestro nodo principal de Kubernetes, además hemos aprendido a instalar y configurar los componentes esenciales de Kubernetes, como kubelet, kubeadm y kubectl. Además, hemos explorado cómo inicializar un clúster de Kubernetes utilizando kubeadm y hemos establecido un nodo maestro listo para recibir conexiones de los nodos de trabajo.

En la siguiente parte de este tutorial, nos enfocaremos en hacer crecer nuestro clúster de Kubernetes agregando nodos de trabajo adicionales. Aprenderemos cómo configurar y unir nuevos nodos al clúster existente y cómo distribuir la carga de trabajo de manera equitativa entre los nodos.

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