Clúster de Kubernetes | Home lab

Primero que todo ¿qué es un clúster de Kubernetes?

Un clúster de Kubernetes es un conjunto de máquinas de nodos que ejecutan aplicaciones en contenedores. Si ejecuta Kubernetes, está ejecutando un clúster.

Un clúster posee un nodo de trabajo y un nodo maestro como mínimo. El nodo maestro es el encargado de mantener el estado deseado del clúster y de controlar, por ejemplo, las aplicaciones que se ejecutan y las imágenes en contenedores que se utilizan. Los nodos de trabajo son los que realmente ejecutan las aplicaciones y las cargas de trabajo.

La ventaja más importante de Kubernetes es la capacidad de programar y ejecutar contenedores en un grupo de máquinas, ya sean físicas o virtuales, on-premise o en la nube, y esto es posible gracias al clúster. Los contenedores de Kubernetes no están ligados a ninguna máquina individual. De hecho, están aislados en el clúster.

En este blog, aprenderemos como crear un clúster de Kubernetes sobre máquinas virtuales en CentOS 8.

A partir de CentOS 8 (y por ende RHEL 8), docker ahora ha sido reemplazado de forma nativa por podman y buildah, que son herramientas de Redhat. De hecho, el paquete de Docker ahora se ha eliminado del repositorio de paquetes predeterminado.

La idea de Redhat es simplificar el proceso de creación y uso de contenedores, sin necesidad de permisos especiales, mientras que, al mismo tiempo, mantiene la compatibilidad con las imágenes Docker y las opera sin necesidad de un daemon. Podman promete ofrecer más flexibilidad cuando se ejecuta en entornos de Kubernetes. En este blog, analizaremos el proceso de instalación de Kubernetes en una plataforma CentOS 8, que se ejecuta en Docker-CE (Community Edition).

La meta de este blog, es poder crear un Home Lab adecuado para poder probar la tecnología de Kubernetes, administración de clúster y despliegue de aplicaciones.

Requisitos previos:

  • Tres servidores virtuales que ejecuten CentOS 8: 1 nodo master y 2 nodos de workers.
  • Se recomienda que sus nodos tengan al menos 2 CPU con 2 GB de RAM o más por máquina. Este no es un requisito estricto, pero depende en gran medida de las necesidades de la aplicación que desea ejecutar. Al ser un laboratorio, no estos recursos son suficientes.
  • Conectividad a Internet en todos sus nodos. Obtendremos paquetes de Kubernetes y Docker de repositorios en internet. Del mismo modo, deberá asegurarse de que el administrador de paquetes DNF esté instalado de forma predeterminada y pueda recuperar paquetes de forma remota.
  • Todos sus nodos también deberían poder conectarse entre sí, ya sea en una red pública o privada.
  • También necesitará acceso a una cuenta con privilegios de root o sudo. En esta guía, usaré mi cuenta de root.

Topología del laboratorio:

Este laboratorio esta diseñado para que el Master-Node controle los dos Worker-Nodes. Al final de esta instalación, nuestra arquitectura lógica se verá así.

Nodo maestro: esta máquina generalmente actúa como el plano de control y ejecuta la base de datos del clúster y el servidor API (con el que se comunica la CLI de kubectl).

Nuestro clúster de Kubernetes de 3 nodos se verá así:

Sobre el laboratorio:

Existen múltiples maneras de realizarlo, ya sea con máquinas físicas o  máquinas virtuales, en mi caso, utilizaré máquinas virtuales dentro de Virtualbox. Este software OpenSource está disponible tanto para Linux como Windows.

Descarga de recursos:

Virtualbox

CentOS 8 iso

Hardware usado en el laboratorio:

MSI, CORE i7 10th Gen, RAM: 16GB, OS Ubuntu 20.4.1

Nota: Este hardware no es requerido, esta es simplemente información sobre lo utilizado en el lab.

Despliegue de máquinas virtuales

Antes de poder crear el clúster de Kubernetes, necesitamos crear las 3 máquinas virtuales que serviran como servidores para el clúster. Los siguientes pasos nos guiarán paso a paso en la creación de los servidores.

Características de las máquinas:

Nombre máquinaCaracterísticas
Master node4GB RAM, 2 vCPUs
Worker node-13GB RAM, 2 vCPUs
Worker node-23GB RAM, 2 vCPUs

Una vez instalemos Virtualbox y descarguemos el iso de CentOS 8 podemos empezar.

Las 3 máquinas virtuales tienen características similares, la instalación de las 3 también es similar.

Pasos para crear la máquina:

Comenzaremos con el master-node.

New > Elegir el nombre de máquina, en mi caso “master-node” > Seleccionar el sistemo operativo, en este caso seleccioné Fedora 64-bit > Next

Memory size: 4GB para el master > Next

Disco duro virtual: Create a virtual har disk now > Create > VDI image > Expert mode > Next > Dynamically allocated > Create.

Nota: Al elegir “dynamically allocted”, estamos indicándole al OS que no debe utilizar los los 20 Gbs de inmediato, si no que llene el disco conforme sea necesario.

La máquina ha sido creada, antes de encenderla, debemos asegurarnos de tener 2 vCPUs y agregar el iso a la máquina para poder comenzar con la instalación del sistema operativo.

CPU> Settings > System > Processor > 2 vCPUs

Agregar OS para instalación: Storage > Empty > Optical Drive, click en el disco celeste > Elegir “Choose/create optical disk”. Debemos buscar el iso de CentOS 8 y seleccionarlo para que al encender la  máquina, podamos usarlo como disco de instalación.

Siguiente Add > buscar el archivo iso > Open > Choose > OK:

Nuestra primera máquina virtual ya esta lista, click en START e iniciar la máquina.

Al encender la máquina, se abrirá una pantalla adicional, desde aquí realizaremos la configuración de CentOS. Seleccionar enter en “Install CentOS Linux”, si no se elige una opción, se usará la primera por defecto.

Los siguientes pasos, son parte de la configuración de el sistema operativo CentOS.

Seleccionar el idioma, en mi caso inglés > Continue

Click en System > Installation destination > Seleccionar el disco 20 GB creado anteriormente > Done > Begin Installation

Dos pasos importantes:

  • Creación de un usuario
  • Y password para la cuenta root

Configurar password deseado | Password > Done

User creation > elegir nombre de usuario, por simplicidad usé centos, es importante marcar este usuario como administradorde lo contrario no podrá utilizar comandos sudo “Make this user administrator” > Done > Y como mencionamos anteriorment, el usuario debe de tener privilegios.

Finish configuration > Reboot

Luego del reboot, apagamos la máquina para remover el disco de instalación. Para apagarla, seleccionar la X en la esquina superior derecha, luego “Power off the machine”

Para remover el iso: Vamos a settings > Storage > Seleccionamos el disco creado anteriomente > en la parte inferior derecha, tendremos una imagen con X, click en ella > Remove.

Y ahora, encendemos la máquina en “Start”.

Una vez encendidad, podemos utizar nuestro usuario y contraseña, además probar conectividad al internet.

Configuración de red

En mi caso, para facilitar el acceso a internet, utilizaré la interface WiFi de mi máquina física en modo bridge, esto le dará acceso a mi red física a las máquinas virtuales del clúster.
Para este laboratorio voy a utilizar una configuración IP estática, así evitaremos que las IPs de los nodos cambien. Usaremos la herramienta nmtui desde la línea de comandos de nuestra nueva máquina virtual.

Una vez en el GUI, seleccionar “Edit a connection”, por defecto tendremos la interface enp0s3, con las flechas del teclado, vamos a “Edit”, enter.

Desde acá podemos desde modificar el nombre de la interface, hasta cambiar la MAC virtual de la máquina.

Con las flechas del teclado, vamos a seleccionar “IPV4 CONFIGURATION” > “Show” > Enter.

Agregar detalles específicos de acuerdo a topología creada anteriormente, seleccionar OK. Tomar en cuenta que esta configuración IP depende lo se decida en la topología, lo usado acá es parte de la administración de mi red local.

Probamos conectividad.

Hasta este punto, tenemos el Master node, para crear las demás, tenemos dos opciones.

  • Utilizar los pasos anteriores y crear dos máquinas con sus respectiva configuración individual.
  • Clonar el master-node y cambiar configuración de red.

En mi caso, utilizaré la segunda opción, copia completa.

  1. Apagar el master-node
  2. Click derecha, utilizar la opción “Clone”
  3. Click en “Expert mode”, nombrar la máquina, worker-node-1 > Full clone > Everything
  4. Clone

5- Encender la máquina y modificarla por medio de nmtui, asignar la IP de worker-node-1, en mi caso 192.168.68.21/24 GW 192.168.68.1

Importante: Luego de asignar la IP correcta, se debe reiniciar el servicio de red:

sudo nmcli networking off
sudo nmcli networking on

Una vez hecho los cambios, podemos comprobar conectividad entre el master-node y el worker-node-1

En este output podemos observar el worker-node-1 192.168.68.21 enviando un ping hacia master-node 192.168.68.20

6- Repetir el mismo proceso para el worker-node-2, clonar basado en el master-node, asignar IP correspondiente, en mi caso 192.168.68.22/24. Nota: no encender el master-node hasta que la Ip haya sido modificada para evitar conflictos IP.

Las 3 máquinas tienen conectividad entre sí, esto es necesario para poder crear el clúster.

Prueba de conectivida entre las 3 máquinas

Listo, ahora tenemos las 3 máquinas virtuales necesarias para el laboratorio, manos a la obra con Kubernetes.

Instalación de Kubernetes Clúster en el master-node

Para que Kubernetes funcione, necesitaremos un motor de contenedores. Como se mencioné, usaremos Docker-CE.

Las siguientes instituciones se realizarán en CentOS 8 Master-Node.

Paso 1: Preparar el hostname de las máquinas, el firewall y SELinux.

En un escenario de producción se debería de utilizar un servidor de DNS, sin embargo, en mi caso, son solo los 3 nodos, por simplicidad modificaré los archivos /etc/hosts de las máquinas para que la resolución de nombres sea de manera local. Muchos de los siguientes pasos necesitan acceso privilegiado, por eso cambiare a usuario “root”

Nota: para estos pasos lo ideal es acceder por ssh a los nodos del clúster para poder copiar/pegar los comandos.

Cambio de hostname

hostnamectl set-hostname master-node

Agregar nombres de dominio al archivo de host

cat <<EOF>> /etc/hosts
192.168.68.20 master-node
192.168.68.21 node-1 worker-node-1
192.168.68.22 node-2 worker-node-2
EOF
Resultado: ping usando nombres de dominio funciona correctamente.

A continuación, deshabilitaremos Selinux, ya que es necesario para permitir que los contenedores accedan al sistema de archivos del host, que necesitan las redes de los contenedores y otros servicios.

setenforce 0

Establecer setenforce en 0 efectivamente establece SELinux en modo permisivo, estará deshabilitado hasta el próximo reinicio. Para deshabilitarlo por completo, use el siguiente comando y reinicie. Nota: si esta utilizando ssh la sesión será terminada.

sed -i –follow-symlinks ‘s/SELINUX=enforcing/SELINUX=disabled/g’ /etc/sysconfig/selinux
reboot

Mientras la máquina se reinicia, veamos que más necesitamos para Kubernetes.

Kubernetes hace uso de varios puertos para la comunicación y el acceso, y estos puertos deben ser accesibles para Kubernetes y no estar limitados por ningún firewall.

Abrir puertos en el firewall para permitir conexión de los nodos.

firewall-cmd –permanent –add-port=6443/tcp
firewall-cmd –permanent –add-port=2379-2380/tcp
firewall-cmd –permanent –add-port=10250/tcp
firewall-cmd –permanent –add-port=10251/tcp
firewall-cmd –permanent –add-port=10252/tcp
firewall-cmd –permanent –add-port=10255/tcp
firewall-cmd –reload

Modprobe br_netfilter: Este módulo es necesario para habilitar el enmascaramiento transparente y facilitar el tráfico de virtual extensible LAN (VxLAN) para la comunicación entre los pods de Kubernetes en todo el clúster.

modprobe br_netfilter
echo ‘1’ > /proc/sys/net/bridge/bridge-nf-call-iptables

Paso 2: Instalar Docker-CE

Primero debemos agregar el repositorio de Docker, ya que ya no se encuentra en la lista de paquetes predeterminada mediante el siguiente comando dnf config-manager.

dnf config-manager –add-repo=https://download.docker.com/linux/centos/docker-ce.repo

Además, debemos instalar el paquete containerd.io, que está disponible como un daemon que administra el ciclo de vida completo del contenedor, desde la transferencia y el almacenamiento de imágenes hasta la ejecución y supervisión del contenedor, el almacenamiento, los configuraciones de red y más.

dnf install https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm

Durante este proceso, posiblemente deba aceptar instalación de los componentes, utilizar ‘y’ y enter para que continue.

Resultado:

Ahora instalemos la última versión de docker-ce.

dnf install docker-ce

Durante este proceso, posiblemente deba aceptar instalación de los componentes, utilizar ‘y’ y enter para que continue.

Listo, podemos habilitar e iniciar el servicio Docker.

systemctl enable docker
systemctl start docker

Paso 3: Instalar Kubernetes (Kubeadm)

Debemos agregar los repositorios de Kubernetes manualmente, ya que no vienen instalados de forma predeterminada en CentOS 8.

cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1 gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF

Kubeadm es una herramienta creada para proporcionar kubeadm init y kubeadm join como «rutas rápidas» de mejores prácticas para crear clústeres de Kubernetes. kubeadm realiza las acciones necesarias para poner en funcionamiento un clúster viable mínimo. Por diseño, solo se preocupa por el arranque del clúster, y no por el aprovisionamiento de contenedores.

Kubeadm también admite otras funciones del ciclo de vida del clúster, como actualizaciones, degradación y administración de tokens de arranque. Kubeadm también se integra fácilmente con otras herramientas de orquestación como Ansible y Terraform.

Ahora si, con el repositorio de paquetes listo, podemos instalar el paquete kubeadm.

dnf install kubeadm -y

Cuando la instalación se complete correctamente, habilite e inicie el servicio.

systemctl enable kubelet
systemctl start kubelet

Paso 4: Crear el nodo maestro del plano de control con kubeadm

El master-node de Kubernetes, actúa como el plano de control además del clúster, ejecuta algunos servicios críticos necesarios para el clúster. Como tal, el proceso de inicialización realizará una serie de comprobaciones previas para garantizar que la máquina esté lista para ejecutar Kubernetes. Estas comprobaciones previas exponen advertencias y puede mostrar de errores. kubeadm init luego descarga e instala los componentes del plano de control del clúster.

Ya estamos listos para inicializar el master-node, pero antes de eso, debemos deshabilitar la memoria swap para luego ejecutar el comando «kubeadm init».

Se espera que todos los nodos de Kubernetes tengan la memoria swap deshabilitada. Esto es lo recomendado por la comunidad de Kubernetes. Si la memoria swap no está deshabilitada, el servicio de kubelet no se iniciará.

swapoff -a

Luego ingresar a vi /etc/fstab y agregar un # para excluir la memoria swap de lectura de la máquina, esto hará que el cambio sea permanente.

La inicialización master-node de Kubernetes es un proceso completamente automatizado que se controla mediante el comando «kubeadm init –pod-network-cidr=172.16.0.0/16» (172.16.0.0/16 será la red de los PODs). Importante: esta red debe de ser diferente a la red de los nodos del clúster.

Ahora, copie el siguiente comando y guárdelo, ya que con este comando añadiremos los workers al master-node para administración.

kubeadm join 192.168.68.20:6443 –token o0qzoq.sf5ghw3cuph6tph3 \     –discovery-token-ca-cert-hash sha256:85598ab2a080be922ca79063ad1ff791bc96f4b325dc27fdd09ab9154be3232f

Tech tip: A veces, el comando anterior puede mostrar errores al aplicarlo en los worker-nodes, por lo que para evitar errores, puede eliminar el carácter «\» el comando final se verá así.

kubeadm join 192.168.68.20:6443 –token o0qzoq.sf5ghw3cuph6tph3     –discovery-token-ca-cert-hash sha256:85598ab2a080be922ca79063ad1ff791bc96f4b325dc27fdd09ab9154be3232f

Una vez que Kubernetes se inicializó correctamente, debe permitir que su usuario comience a usar el clúster. En nuestro escenario, usaremos el usuario root. También puede iniciar el clúster usando sudo user como se muestra aquí:

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

Si quiere usar otro usuario con privilegios sudo:

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

Ahora confirmemos que kubectl está activado.

kubectl get nodes

En este momento, verá que el estado del nodo principal es «NotReady». Esto se debe a que todavía tenemos que implementar la red pod en el clúster.

La red de pod es la red overlay para el clúster, que se implementa en la parte superior de la red de nodos actual. Está diseñado para permitir la conectividad de las aplicaciones que correrán el cluster.

Paso 5: Configurar red de pods

La implementación del clúster de red es un proceso muy flexible según las necesidades y hay muchas opciones disponibles.

Llegó la hora de seleccionar nuestro CNI (Container Network Interface) para nuestra red de PODs.

CNI, es un proyecto de Cloud Native Computing Foundation, consta de una especificación y bibliotecas para escribir complementos para configurar interfaces de red en contenedores Linux, junto con una serie de complementos compatibles. CNI se preocupa solo por la conectividad de red de los contenedores y la eliminación de los recursos asignados cuando se elimina el contenedor. Debido a este enfoque, CNI tiene una amplia gama de soporte y la especificación es simple de implementar. Hay muchísimas opciones, en mi caso usaré Calico.

Calico tiene algunos requisitos mínimos, más info en Quickstart for Calico on Kubernetes

Instalación Calico

1- Instale el operador Tigera Calico y las definiciones de recursos personalizadas.

kubectl create -f https://docs.projectcalico.org/manifests/tigera-operator.yaml

2- Instale Calico creando el recurso personalizados necesario. Por ejemplo, definir una subnet específica para los PODs, para más detalle Installation reference

La plantilla de Calico esta disponible en https://docs.projectcalico.org/manifests/custom-resources.yaml

tiene por defecto la subnet 192.168.0.0/16, en mi casi lo voy a cambiar a 172.16.0.0/16. Descargaré el archivo y lo modificaré offline. La subnet elegida debe coincidir con lo indicado en el comando –pod-network-cidr=172.16.0.0/16

root@master-node ~]# wget https://docs.projectcalico.org/manifests/custom-resources.yaml  

[root@master-node ~]# ls
anaconda-ks.cfg  custom-resources.yaml  

[root@master-node ~]# vi custom-resources.yaml
 
Resultado:
# This section includes base Calico installation configuration.
# For more information, see: https://docs.projectcalico.org/v3.16/reference/installation/api#operator.tigera.io/v1.Installation
apiVersion: operator.tigera.io/v1
kind: Installation
metadata:
name: default
spec:
# Configures Calico networking.
calicoNetwork:
# Note: The ipPools section cannot be modified post-install.
ipPools:
– blockSize: 26
cidr: 172.16.0.0/16
encapsulation: VXLANCrossSubnet
natOutgoing: Enabled
nodeSelector: all()

Ahora ejecutamos la instalación de Calico:

root@master-node ~]# kubectl create -f custom-resources.yaml

installation.operator.tigera.io/default created

Ahora, validamos la instalación:

3- Elimine los “Taints” en el master-node para que pueda crear pods en él.

kubectl taint nodes –all node-role.kubernetes.io/master-

Resultado:

node/<your-hostname> untainted

Confirmemos que ahora tenemos un nodo en el clúster con el siguiente comando.

kubectl get nodes -o wide

El estado del master-node en este momento debe de ser “Ready”.

Agregar worker-nodes al clúster de Kubernetes

Como lo hicimos con el master-node, el DNS será local desde el host fila de las máquinas virtuales. Además se configura el nombre de dominio de cada máquina.

Tomar en cuenta que se deben aplicar los mismos pasos para worker-node-1 y worker-node-2, el cambio más importante es el hostname de la máquina.

Paso 1:

Configurar hostname:

hostnamectl set-hostname  node-1

Configurar host file para resolución de nombres de dominio:

cat <<EOF>> /etc/hosts
192.168.68.20 master-node
192.168.68.21 node-1 worker-node-1
192.168.68.22 node-2 worker-node-2
EOF

Probar que la resolución de nombres funciona correctamente.

Ahora, deshabilitamos SELinux y agregamos reglas del Firewall.

setenforce 0
sed -i –follow-symlinks ‘s/SELINUX=enforcing/SELINUX=disabled/g’ /etc/sysconfig/selinux
firewall-cmd –permanent –add-port=6783/tcp
firewall-cmd –permanent –add-port=10250/tcp
firewall-cmd –permanent –add-port=10255/tcp
firewall-cmd –permanent –add-port=30000-32767/tcp
firewall-cmd  –reload
modprobe br_netfilter
echo ‘1’ > /proc/sys/net/bridge/bridge-nf-call-iptables

Paso 2: Instalar Docker-CE

Agregamos el repositorio de Docker con el dn config-manager.

dnf config-manager –add-repo=https://download.docker.com/linux/centos/docker-ce.repo

Además instalamos el paquete containerd.io para la administración de los contenedores y demás.

dnf install https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm

Durante este proceso, posiblemente deba aceptar instalación de los componentes, utilizar ‘y’ y enter para que continúe.

Resultado:

Ahora, instalamos la última versión de docker-ce.

dnf install docker-ce

Durante este proceso, posiblemente deba aceptar instalación de los componentes, utilizar ‘y’ y enter para que continúe.

Ahora podemos habilitar e iniciar el servicio Docker.

systemctl enable docker
systemctl start docker

Paso 3: Instalar Kubernetes (Kubeadm)

Agregar repositorios de Kubernetes, ya que como se mencionó no vienen incluídos en CentOS 8.

cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1 gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF

Con el repositorio listo, podemos continuar e instalar el paquete kubeadm.

dnf install kubeadm -y

Cuando la instalación se complete correctamente, habilite e inicie el servicio.

systemctl enable kubelet
systemctl start kubelet

Por último, deshabilitamos la memoria swap de ambos nodos.

Luego ingresar a vi /etc/fstab y agregar un # para excluir la memoria swap de lectura de la máquina, esto hará que el cambio sea permanente.

Paso 4: Añadir nodos al clúster de Kubernetes

Ahora necesitamos el token que generó kubeadm init para unir los nodos al clúster.  Debemos copiarlo y pegarlo en los nodo-1 y nodo-2. (este es el resultado del comando kubeadm init aplicado en el master-node)

kubeadm join 192.168.68.20:6443 –token o0qzoq.sf5ghw3cuph6tph3     –discovery-token-ca-cert-hash sha256:85598ab2a080be922ca79063ad1ff791bc96f4b325dc27fdd09ab9154be3232f

Como se sugiere en la última línea, regrese a su master-node y confirme si el node-1 y node-2 se han unido al clúster mediante el siguiente comando.

kubectl get nodes

Resultado:

[root@master-node centos]# kubectl get nodes
NAME          STATUS   ROLES    AGE    VERSION
master-node   Ready    master   20h    v1.19.4
node-1        Ready    <none>   106s   v1.19.4
node-2        Ready    <none>   99s    v1.19.4
[root@master-node centos]#

Si todos los pasos se ejecutan correctamente, deberíamos de ver el nodo-1 y el nodo-2 en estado “Ready” en el nodo principal.

Con esto, se ha implementado con éxito un clúster de Kubernetes en CentOS 8. El ambiente esta listo para desplegar aplicaciones basadas en contenedores. Recordar que está topología esta basada en un laboratorio y no se recomienda para ambientes de producción.

Ejemplos de despliegue de aplicaciones:

Desplegar Nginx en Kubernetes


Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Translate »