Desplegar infraestructura de Kubernetes en equipos Linux Ubuntu Server 24, con un master y dos nodos workers.

Requisitos para desplegar infraestructura de Kubernetes en Linux

Necesitaremos disponer de tres equipos con el sistema operativo Linux Ubuntu Server 24, uno de ellos será el master (el principal) y los otros dos los nodos workers. En el siguiente enlace mostramos cómo instalar Linux Ubuntu Server 24 en una máquina virtual:

Los equipos que componen el clúster deberán tener, al menos, dos vCPU:

Por lo tanto, dispondremos de los siguientes equipos con Linux Ubuntu Server 24 (para despliegue en un entorno de pruebas):

EquipoUsoCPURAMIP red internaIP puente
srvmasterMaster, nodo principal del clúster46GB192.168.100.2
192.168.1.88
srvworker1Nodo 1 esclavo worker del clúster46GB
192.168.100.3

192.168.1.90
srvworker2Nodo 2 esclavo worker del clúster46GB
192.168.100.4

192.168.1.91

Los tres equipos deben tener UUID diferente y MAC diferente. Esto es importante, de lo contrario, el proceso de instalación puede dar error. Para obtener el UUID del equipo, podemos ejecutar el siguiente comando:

Realizaremos una actualización del sistema en los tres equipos, ejecutando los comandos:

Se debe desactivar el uso de swap, comprobaremos si está activo con el comando:

En caso de devolver una línea indicará que está activa, desactivaremos el uso de swap con el comando:

Y la desactivamos también en el arranque (de forma permanente), ejecutando el comando:

El comando anterior comenta la línea /swap/s… del fichero /etc/fstab.

Instalamos Docker en los tres nodos:

Activamos Google API KEY:

Add Kubernetes apt repository:

Prevent automatic updates/removals of Kubernetes packages.

Para permitir la comunicación entre Pods a través de diferentes redes, el sistema debe poder enrutar el tráfico entre ellos. Esto se puede lograr habilitando el reenvío de IP. Sin el reenvío de IP, los contenedores no podrán comunicarse con recursos fuera de su espacio de nombres de red, lo que limitaría su funcionalidad y utilidad.

Para habilitar el reenvío de IP, establezca el valor de net.ipv4.ip_forward en .1

Aplicaremos los cambios con:

overlay proporciona soporte para el sistema de archivos superpuesto. OverlayFS es un tipo de sistema de archivos de unión utilizado por los tiempos de ejecución del contenedor para superponer el sistema de archivos raíz del contenedor sobre el sistema de archivos host.

br_netfilter El módulo proporciona soporte para el filtrado de paquetes en redes de puentes Linux en función de varios criterios, como la dirección IP de origen y destino, los números de puerto y el tipo de protocolo.

Comprobamos si estos módulos está cargados/habilitados en el sistema, con:

Si no devuelve nada indica que no están cargados, para cargarlo ejecutaremos:

Del mismo modo, habilite el filtro de red de puente del kernel de Linux para pasar el tráfico de puente a iptables para su filtrado. Esto significa que los paquetes que se puentean entre las interfaces de red se pueden filtrar usando iptables/ip6tables, como si fueran paquetes enrutados.

Y:

Del mismo modo, habilite el filtro de red de puente del kernel de Linux para pasar el tráfico de puente a iptables para su filtrado. Esto significa que los paquetes que se puentean entre las interfaces de red se pueden filtrar usando iptables/ip6tables, como si fueran paquetes enrutados.

Aplicamos los cambios con:

Instalaremos ahora Containerd Runtime en todos los nodos (master y workers). Para ello usaremos los repositorios APT de Docker Engine, ejecutando:

Actualizamos la caché de paquetes:

Instalaremos Containerd Runtime:

Creamos la carpeta:

Creamos el fichero de configuración:

Iniciar y habilitar servicios:

Iniciamos el servicio kubelet en el nodo master, ejecutar en el master:

Ahora debemos inicializar la máquina que ejecutará los componentes del control plane, que incluye etcd (la base de datos del clúster) y el servidor API.

Hacemos un pull de las imágenes de los contenedores:


Si se produce el siguiente error al iniciar el pull con el comando anterior:

Seguiremos los siguientes pasos para solucionarlo:


Creamos el clúster:

Creamos la carpeta del cluster:

Copie el archivo de configuración de administración de Kubernetes en el directorio del clúster creado anteriormente.

Establezca la propiedad adecuada para el archivo de configuración del clúster.:

Verifique el estado del clúster de Kubernetes;:

Para obtener la dirección del panel de control:

Indicando además el comando con el token para añadir nodos:

Cgroup (grupos de control) es una característica del kernel de Linux que permite el aislamiento, la priorización y la supervisión de los recursos del sistema, como la CPU, la memoria y la E/S de disco para un grupo de procesos. Kubernetes (kubelet y tiempo de ejecución de contenedores, como containerd) utiliza controladores cgroup para interactuar con grupos de control con el fin de administrar y establecer límites para los recursos asignados a los contenedores.

Kubernetes admite tres tipos de controladores Cgroup;

  • cgroupfs (control groups filesystem): This is the default cgroup driver used by Kubernetes kubelet to manage resources for containers.
  • systemd: This is the default initialization system and service manager in some Linux systems. it offers functions such as starting of daemons, keeping track of processes using Linux cgroups etc.

Para los sistemas que usan Systemd como su sistema de inicio predeterminado, se recomienda usar el controlador cgroup systemd para Kubernetes en lugar de cgroupfs.

El archivo de configuración predeterminado para containerd es /etc/containerd/config.toml. Cuando containerd se instala desde repositorios APT de Docker, este archivo se crea con pequeñas configuraciones. Si se instala desde los binarios oficiales, no se crea el archivo de configuración containerd.

De cualquier manera, actualice el archivo de configuración containerd ejecutando el siguiente comando:

Obtendrá una configuración por defecto.

Una vez que genere la configuración predeterminada, debe habilitar systemd cgroup para el tiempo de ejecución del contenedor de bajo nivel containerd, runc, cambiando el valor de SystemdCgroup de false a true.

e recomienda utilizar «registry.k8s.io/pause:3.9» como imagen del sandbox del CRI. Pause Container Image es una imagen de contenedor minimalista que permite a containerd proporcionar aislamiento de red para pods en Kubernetes. Containerd usa pausa:3.8.

Para ello, ejecutaremos:

Iniciaremos containerd  y lo habilitaremos en el arranque con:

Instalar Kubernetes en Linux Ubuntu Server 24

Hay una serie de componentes de nodo necesarios para proporcionar un entorno de tiempo de ejecución de Kubernetes que debe instalarse en cada nodo. Entre ellas se encuentran:

  • kubelet: se ejecuta como un agente en cada nodo de trabajo y garantiza que los contenedores se ejecuten en un pod.
  • kubeadm: Bootstraps Clúster de Kubernetes
  • kubectl: Se utiliza para ejecutar comandos en clústeres de Kubernetes.

Estos componentes no están disponibles en los repositorios predeterminados de Ubuntu. Por lo tanto, debe instalar repositorios de Kubernetes para instalarlos.

Run the command below to install Kubernetes repo GPG key.

Instalaremos la versión 1.30:

A continuación, instale el repositorio de Kubernetes de la versión que coincida con la clave GPG instalada anteriormente:

Actualizamos la caché de paquetes:

Instalamos Kubernetes:

Para mantener la estabilidad del clúster, es importante mantener versiones específicas de paquetes críticos como , , y . Esto se puede hacer instruyendo al sistema de gestión de paquetes (APT) para evitar que esos paquetes se actualicen utilizando el comando apt-mark hold. kubeadmkubeletkubectl

Para comprobar si los paquetes están en espera o no, puede utilizar :apt-mark showhold

Si desea permitir la actualización de estos paquetes de nuevo, puede eliminar la retención usando :aptapt-mark unhold

Iniciar Kubernetes Cluster en Control Plane usando Kubeadm

Una vez completados los pasos anteriores, inicialice el clúster de Kubernetes en el nodo principal. El maestro de Kubernetes es responsable de mantener el estado deseado para el clúster.

Dado que solo estamos ejecutando un clúster de Kubernetes de un solo nodo maestro en esta guía (con fines de demostración), sin planes de actualizar a un clúster de alta disponibilidad, especificaremos solo la dirección IP del plano de control mientras arrancamos nuestro clúster.

Por lo tanto, ejecute el siguiente comando en el nodo maestro para arrancar el nodo del plano de control de Kubernetes.

Indicando:

Preparar el nodo master e iniciar Kubernetes

Creamos la carpeta del cluster:

Copie el archivo de configuración de administración de Kubernetes en el directorio del clúster creado anteriormente.

Establezca la propiedad adecuada para el archivo de configuración del clúster.:

Verifique el estado del clúster de Kubernetes;:

Para obtener la dirección del panel de control:

Indicando además el comando con el token para añadir nodos:

Instalar el complemento Pod Network en el nodo maestro

Un pod es un grupo de uno o más contenedores relacionados en un clúster de Kubernetes. Comparten el mismo ciclo de vida, almacenamiento/red. Para que los pods se comuniquen entre sí, debes implementar un 
Container Network Interface (CNI) based Pod network add-on.

Hay varios complementos de red Pod entre los que puede elegir. Consulte la página de complementos para obtener más información.

Usaremos Calico:

A continuación, descargue los recursos personalizados necesarios para configurar Calico. La red predeterminada para el complemento Calico es 192.168.0.0/16. Si ha utilizado el CIDR de pod personalizado tal y como se ha definido anteriormente (–pod-network-cidr=10.100.0.0/16), descargue el archivo de recursos personalizado y modifique la red para que coincida con la personalizada.

Actulizamos la red de Calico para que coincida con la desplegada en los Kubernetes:

Aplicamos los cambios:

Una vez que se complete el comando, puede enumerar los pods en los espacios de nombres ejecutando el comando a continuación;

Cortafuegos en nodos

If firewall is running on the nodes, then there are some ports that needs to be opened on the firewall;

Control Plane ports;

ProtocolDirectionPort RangePurposeUsed By
TCPInbound6443Kubernetes API serverAll
TCPInbound2379-2380etcd server client APIkube-apiserver, etcd
TCPInbound10250Kubelet APISelf, Control plane
TCPInbound10259kube-schedulerSelf
TCPInbound10257kube-controller-managerSelf

Add Worker Nodes to Kubernetes Cluster

Ahora puede agregar nodos de trabajo al clúster de Kubernetes mediante el comando kubeadm join de la siguiente manera.

Antes de eso, asegúrese de que el tiempo de ejecución del contenedor esté instalado, configurado y en ejecución. Estamos usando CRI en contenedores;

Errores y su solución:

Solución: ampliar CPU.