Introducción
Kubernetes es una herramienta de código abierto que es crucial en la orquestación de contenedores. Kubernetes funciona orquestando y administrando clústeres a escala en varios entornos de nube o incluso en servidores locales. Un clúster es un conjunto de hosts destinados a ejecutar aplicaciones y servicios en contenedores. Un clúster necesita un mínimo de dos nodos para funcionar – uno nodo maestro y un nodo trabajador. Teniendo en cuenta la escalabilidad, tiene la opción de expandir el clúster con tantos nodos trabajadores como sea necesario.
Un nodo en Kubernetes se refiere a un servidor. Un nodo maestro es un servidor que administra el estado del clúster. Los nodos trabajadores son servidores que ejecutan las cargas de trabajo – estas son típicamente aplicaciones y servicios en contenedores.
Esta guía lo guiará a través de los pasos para instalar y desplegar un clúster de Kubernetes que consta de dos nodos en Ubuntu 20.04. Como se mencionó, tener dos nodos es la configuración más básica al trabajar con Kubernetes. También tiene la opción de agregar más nodos trabajadores una vez que comprenda los conceptos fundamentales. Además, le mostraremos cómo vincular los dos servidores para permitir que el nodo maestro controle al nodo trabajador.
Para probar nuestra configuración, desplegaremos un contenedor Docker que ejecuta el servidor web Nginx en el clúster. Esta es una aplicación típica de la vida real de Kubernetes. Aprenderá más sobre algunos componentes definitorios de Kubernetes como kubectl y kubeadm a medida que avancemos. También es recomendable familiarizarse primero con nuestro tutorial sobre conocer los conceptos básicos del conjunto de herramientas de Kubernetes para familiarizarse con los conceptos básicos de la plataforma Kubernetes.
¡Ahora, empecemos!
Requisitos previos
Deberá aprovisionar dos servidores, que se ejecuten en Ubuntu 20.04. Para un mejor rendimiento, los requisitos mínimos del sistema para Kubernetes son 2 GB de RAM y 2 CPU. Puede seguir los pasos 1 al 4 de este tutorial paso a paso para ayudarle a configurar su servidor Ubuntu en CloudSigma. Un servidor será el nodo maestro, el otro será el nodo trabajador. Hemos nombrado acertadamente a nuestros dos servidores como kubernetes-master y kubernetes-worker. Esto facilita el seguimiento del tutorial. Sin embargo, es libre de elegir los nombres de host que prefiera.
-
Asegúrese de agregar un usuario con privilegios de sudo en ambos nodos que utilizaremos para ejecutar los comandos como se describe en el tutorial anterior. Siga este tutorial sobre cómo configurar el archivo sudoers de Linux para obtener instrucciones.
-
Conectividad de red – los servidores en el clúster deben poder comunicarse. Cuando despliega sus máquinas virtuales desde CloudSigma, se conectarán a Internet con una IP pública de forma predeterminada. Si está trabajando desde una red local, es posible que deba editar su archivo /etc/hosts en cada servidor y vincularlos adecuadamente.
-
Deberá instalar y habilitar Docker en cada uno de los nodos. Kubernetes se basa en un entorno de ejecución de contenedores para ejecutar contenedores en pods. Aunque hay otras plataformas de contenedores para elegir, utilizaremos Docker en este tutorial. Docker proporcionará el entorno de ejecución necesario para Ubuntu. Puede seguir los pasos 1, 2 y 3 de nuestro tutorial sobre cómo instalar y operar Docker.
Paso 1: Instalar Kubernetes
En este paso, instalaremos Kubernetes. Al igual que hizo con Docker en los requisitos previos, debe ejecutar los comandos en ambos nodos para instalar Kubernetes. Use ssh para iniciar sesión en ambos nodos y proceder. Comenzará instalando el paquete apt-transport-https que permite trabajar con http y https en los repositorios de Ubuntu. Además, instale curl ya que será necesario para los siguientes pasos. Ejecute el siguiente comando:
|
1 |
sudo apt install apt-transport-https curl |
Luego, agregue la clave de firma de Kubernetes a ambos nodos ejecutando el comando:
|
1 |
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add |
A continuación, agregamos el repositorio de Kubernetes como fuente de paquetes en ambos nodos usando el siguiente comando:
|
1 2 |
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" >> ~/kubernetes.list sudo mv ~/kubernetes.list /etc/apt/sources.list.d |
Después de eso, actualice los nodos:
|
1 |
sudo apt update |
- Instalar herramientas de Kubernetes
Una vez completada la actualización, instalaremos Kubernetes. Esto implica instalar las diversas herramientas que componen Kubernetes: kubeadm, kubelet, kubectl, y kubernetes-cni. Estas herramientas se instalan en ambos nodos. Definimos cada herramienta a continuación:
-
kubelet – un agente que se ejecuta en cada nodo y maneja la comunicación con el nodo maestro para iniciar cargas de trabajo en el entorno de ejecución del contenedor. Ingrese el siguiente comando para instalar kubelet:
|
1 |
sudo apt install kubelet |
-
kubeadm – parte del proyecto Kubernetes y ayuda a inicializar un clúster de Kubernetes. Ingrese el siguiente comando para instalar kubeadm:
|
1 |
sudo apt install kubeadm |
-
kubectl – la herramienta de línea de comandos de Kubernetes que le permite ejecutar comandos dentro de los clústeres de Kubernetes. Ejecute el siguiente comando para instalar kubectl:
|
1 |
sudo apt install kubectl |
-
kubernetes-cni – permite la red dentro de los contenedores asegurando que los contenedores puedan comunicarse e intercambiar datos. Ejecute el siguiente comando para instalar:
|
1 |
sudo apt-get install -y kubernetes-cni |
Opcionalmente, puede instalar los cuatro en un solo comando:
|
1 |
sudo apt-get install -y kubelet kubeadm kubectl kubernetes-cni |
Paso 2: Deshabilitar la memoria swap
Kubernetes no funciona en un sistema que está utilizando memoria swap. Por lo tanto, debe deshabilitarse en el nodo maestro y en todos los nodos de trabajo. Ejecute el siguiente comando para deshabilitar la memoria swap:
|
1 |
sudo swapoff -a |
Este comando deshabilita la memoria swap hasta que se reinicie el sistema. Debemos asegurarnos de que permanezca desactivada incluso después de los reinicios. Esto debe hacerse en el nodo maestro y en todos los nodos de trabajo. Podemos hacerlo editando el archivo fstab file y comentando la línea /swapfile con un #. Abra el archivo con el editor de texto nano ingresando el siguiente comando:
|
1 |
sudo nano /etc/fstab |
Dentro del archivo, comente la línea swapfile como se muestra en la siguiente captura de pantalla:

Si no ve la línea swapfile, simplemente ignórela. Guarde y cierre el archivo cuando haya terminado de editar. Siga el mismo proceso para ambos nodos. Ahora, la configuración de la memoria swap permanecerá desactivada, incluso después de que se reinicie el servidor.
Paso 3: Configurar nombres de host únicos
Sus nodos deben tener nombres de host únicos para facilitar su identificación. Si está implementando un clúster con muchos nodos, puede configurarlo para identificar nombres para sus nodos de trabajo como node-1, node-2, etc. Como habíamos mencionado anteriormente, hemos nombrado a nuestros nodos como kubernetes-master y kubernetes-worker. Los hemos configurado al momento de crear el servidor. Sin embargo, puede ajustar o configurar los suyos si aún no lo ha hecho desde la línea de comandos. Para ajustar el nombre de host en el nodo maestro, ejecute el siguiente comando:
|
1 |
sudo hostnamectl set-hostname kubernetes-master |
En el nodo de trabajo, ejecute el siguiente comando:
|
1 |
sudo hostnamectl set-hostname kubernetes-worker |
Puede cerrar la sesión de terminal actual y volver a conectarse por ssh al servidor para ver los cambios.
Paso 4: Permitir que Iptables vea el tráfico puenteado
Para que los nodos maestro y de trabajo vean correctamente el tráfico puenteado, debe asegurarse de que net.bridge.bridge-nf-call-iptables esté configurado en 1 en su configuración. Primero, asegúrese de que el módulo br_netfilter esté cargado. Puede confirmar esto emitiendo el comando:
|
1 |
lsmod | grep br_netfilter |
Opcionalmente, puede cargarlo explícitamente con el comando:
|
1 |
sudo modprobe br_netfilter |
Ahora, puede ejecutar este comando para establecer el valor en 1:
|
1 |
sudo sysctl net.bridge.bridge-nf-call-iptables=1 |
Paso 5: Cambiar el controlador de Cgroup de Docker
Por defecto, Docker se instala con “cgroupfs” como el controlador de cgroup. Kubernetes recomienda que Docker debería ejecutarse con “systemd” como el controlador. Si omite este paso e intenta inicializar kubeadm en el siguiente paso, recibirá la siguiente advertencia en su terminal:
|
1 2 |
[preflight] Ejecutando pre-flight comprobaciones [ADVERTENCIA IsDockerSystemdCheck]: detectado "cgroupfs" como el Docker cgroup controlador. El recomendado controlador es "systemd". Por favor, siga la guía en https://kubernetes.io/docs/setup/cri/ |
Tanto en el nodo maestro como en los de trabajo, actualice el cgroupdriver con los siguientes comandos:
|
1 2 3 4 5 6 7 8 9 |
sudo mkdir /etc/docker cat <<EOF | sudo tee /etc/docker/daemon.json { "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "storage-driver": "overlay2" } EOF |
Luego, ejecute los siguientes comandos para reiniciar y habilitar Docker en el arranque del sistema:
|
1 2 3 |
sudo systemctl enable docker sudo systemctl daemon-reload sudo systemctl restart docker |
Once that is set, we can proceed to the fun stuff, deploying the Kubernetes cluster!
Paso 6: Inicializar el nodo maestro de Kubernetes
El primer paso para implementar un clúster de Kubernetes es iniciar el nodo maestro. Mientras esté en la terminal de su nodo maestro, ejecute el siguiente comando para inicializar el kubernetes-maestro:
|
1 |
sudo kubeadm init --pod-network-cidr=10.244.0.0/16 |
Si ejecuta el comando anterior y su sistema no cumple con los requisitos esperados, como la RAM o CPU mínimas, tal como se explica en la sección de Requisitos previos, recibirá una advertencia y el clúster no se iniciará:

La siguiente captura de pantalla muestra que la inicialización fue exitosa. También hemos agregado una bandera para especificar la red de pods con la IP 10.244.0.0. Es la IP predeterminada que utiliza kube-flannel. Discutiremos más sobre la red de pods en el siguiente paso.

En la salida, puede ver el comando kubeadm join (hemos ocultado nuestra dirección IP) y un token único que ejecutará en el nodo de trabajo y en todos los demás nodos de trabajo que desee unir a este clúster. A continuación, copie y pegue este comando, ya que lo utilizará más adelante en el nodo de trabajo.
En la salida, Kubernetes también muestra algunos comandos adicionales que debe ejecutar como usuario normal en el nodo maestro antes de comenzar a usar el clúster. Ejecutemos estos comandos:
|
1 2 3 |
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config |
Ahora hemos inicializado el nodo maestro. Sin embargo, también tenemos que configurar la red de pods en el nodo maestro antes de unir los nodos de trabajo.
Paso 7: Implementar una red de pods
Una red de pods facilita la comunicación entre servidores y es necesaria para el correcto funcionamiento del clúster de Kubernetes. Puede leer más sobre Kubernetes Cluster Networking en la documentación oficial. Utilizaremos la red de pods Flannel para este tutorial. Flannel es una red superpuesta simple que cumple con los requisitos de Kubernetes.
Antes de desplegar la red de pods, debemos verificar el estado del cortafuegos. Si ha habilitado el cortafuegos después de seguir el paso 5 del tutorial sobre cómo configurar su servidor Ubuntu, primero debe agregar una regla de cortafuegos para crear excepciones para el puerto 6443 (el puerto predeterminado para Kubernetes). Ejecute los siguientes ufw comandos tanto en el nodo maestro como en los de trabajo:
|
1 2 |
sudo ufw allow 6443 sudo ufw allow 6443/tcp |
Después de eso, puede ejecutar los siguientes dos comandos para desplegar la red de pods en el nodo maestro:
|
1 2 |
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/k8s-manifests/kube-flannel-rbac.yml |
Esto puede tardar desde un par de segundos hasta un minuto, dependiendo de su entorno, para cargar la red flannel. Ejecute el siguiente comando para confirmar que todo está en marcha:
|
1 |
kubectl get pods --all-namespaces |
La salida del comando debería mostrar el estado de todos los servicios como en ejecución si todo se realizó correctamente:

También puede ver el estado de salud de los componentes utilizando el comando get component status:
|
1 |
kubectl get componentstatus |

Este comando tiene una forma abreviada cs:
|
1 |
kubectl get cs |

Si ve el estado no saludable (unhealthy), modifique los siguientes archivos y elimine la línea en (spec->containers->command) que contiene esta frase - --port=0 :
|
1 |
sudo nano /etc/kubernetes/manifests/kube-scheduler.yaml |
Haga lo mismo para este archivo:
|
1 |
sudo nano /etc/kubernetes/manifests/kube-controller-manager.yaml |
Finalmente, reinicie el servicio de Kubernetes:
|
1 |
sudo systemctl restart kubelet.service |
Paso 8: Unir nodos de trabajo al clúster de Kubernetes
Con el nodo maestro de -Kubernetes activo y la red de pods lista, podemos unir nuestros nodos de trabajo al clúster. En este tutorial, solo tenemos un nodo de trabajo, por lo que trabajaremos con ese. Si tiene más nodos de trabajo, siempre puede seguir los mismos pasos que explicaremos a continuación para unirse al clúster.
Primero, inicie sesión en su nodo de trabajo en una sesión de terminal separada. Utilizará su comando kubeadm join que se mostró en su terminal cuando inicializamos el nodo maestro en el Paso 6. Ejecute el comando:
|
1 |
sudo kubeadm join 127.0.0.188:6443 --token u81y02.91gqwkxx6rnhnnly --discovery-token-ca-cert-hash sha256:4482ab1c66bf17992ea02c1ba580f4af9f3ad4cc37b24f189db34d6e3fe95c2d |
Debería ver una salida similar a la captura de pantalla de abajo cuando se complete la unión al clúster:

Una vez que se complete el proceso de unión, cambie a la terminal del nodo maestro y ejecute el siguiente comando para confirmar que su nodo de trabajo se ha unido al clúster:
|
1 |
kubectl get nodes |
En la captura de pantalla de la salida del comando anterior, podemos ver que el nodo de trabajo se ha unido al clúster:

Paso 9: Desplegar una aplicación en el clúster de Kubernetes
En este punto, ha configurado con éxito un clúster de Kubernetes. Hagamos que el clúster sea utilizable desplegando un servicio en él. Nginx es un servidor web popular que cuenta con velocidades increíbles incluso con miles de conexiones. Desplegaremos el servidor web Nginx en el clúster para demostrar que puede utilizar esta configuración en una aplicación de la vida real.
Ejecute el siguiente comando en el nodo maestro para crear un despliegue de Kubernetes para Nginx:
|
1 |
kubectl create deployment nginx --image=nginx |
Puede ver el despliegue creado utilizando el comando describe deployment :
|
1 |
kubectl describe deployment nginx |

Para hacer que el nginx servicio sea accesible a través de internet, ejecute el siguiente comando:
|
1 |
kubectl create service nodeport nginx --tcp=80:80 |

El comando anterior creará un servicio orientado al público para el despliegue de Nginx. Al ser este un nodeport despliegue, Kubernetes asigna al servicio un puerto en el rango de 32000+.
Puede obtener los servicios actuales emitiendo el comando:
|
1 |
kubectl get svc |

Puede ver que nuestro puerto asignado es 32264. Tome nota del puerto que se muestra en su terminal para usarlo en el siguiente paso.
Para verificar que el despliegue del servicio Nginx se ha realizado correctamente, realice una llamada curl al nodo worker desde el maestro. Reemplace la IP de su nodo worker y el puerto que obtuvo del comando anterior:
|
1 |
curl su-kubernetes-worker-ip:32264 |
Debería ver la salida del archivo index.html:

Opcionalmente, puede visitar la combinación de dirección IP y puerto del nodo worker en su navegador y ver la página de inicio predeterminada de Nginx:

Puede eliminar un despliegue especificando el nombre del mismo. Por ejemplo, este comando eliminará nuestro despliegue:
|
1 |
kubectl delete deployment nginx |
¡Ahora hemos probado con éxito nuestro clúster!
Conclusión
En este tutorial, ha aprendido a instalar un clúster de Kubernetes en Ubuntu 20.04. Ha configurado un clúster que consta de un nodo maestro y un nodo worker. Ha podido instalar el conjunto de herramientas de Kubernetes, ha creado una red de pods y ha unido el nodo worker al nodo maestro. También hemos probado nuestro concepto realizando un despliegue básico de un servidor web Nginx en el clúster. Esto debería servir como base para trabajar con clústeres de Kubernetes en Ubuntu.
Aunque solo utilizamos un nodo worker, puede ampliar su clúster con tantos nodos como desee. Si desea profundizar en DevOps con herramientas de automatización como Ansible, tenemos un tutorial que profundiza en el aprovisionamiento de despliegues de clústeres de Kubernetes con Ansible y Kubeadm, compruébelo. Si quiere aprender cómo desplegar una aplicación PHP en un clúster de Kubernetes, consulte este tutorial.
¡Feliz informática!
Comentarios
Aún no hay comentarios. Sea el primero.