Cómo implementar Nginx en un clúster de Kubernetes


En nuestro último artículo, analizamos cómo configurar y ejecutar un clúster de Kubernetes, analicemos cómo podemos implementar el servicio NGINX en nuestro clúster.

Ejecutaré esta implementación en una máquina virtual alojada por un proveedor de nube pública. Como ocurre con muchos servicios de nube pública, muchos generalmente mantienen un esquema de IP pública y privada para sus Máquinas Virtuales.

Master Node - Public IP: 104.197.170.99 and Private IP: 10.128.15.195
Worker Node 1 - Public IP: 34.67.149.37 and Private IP: 10.128.15.196
Worker Node 2 - Public IP: 35.232.161.178 and Private IP: 10.128.15.197

Implementación de NGINX en un clúster de Kubernetes

Ejecutaremos esta implementación desde el nodo maestro.

Comencemos por verificar el estado del clúster. Todos sus nodos deben estar en estado LISTO.

# kubectl get nodes

Creamos un despliegue de NGINX usando la imagen de NGINX.

# kubectl create deployment nginx --image=nginx

Ahora puede ver el estado de su implementación.

# kubectl get deployments

Si desea ver más detalles sobre su implementación, puede ejecutar el comando describe. Por ejemplo, es posible determinar cuántas réplicas de la implementación se están ejecutando. En nuestro caso, esperamos ver una réplica de 1 en ejecución (es decir, réplicas 1/1).

# kubectl describe deployment nginx

Ahora que su implementación de Nginx está activa, es posible que desee exponer el servicio NGINX a una IP pública accesible en Internet.

Kubernetes ofrece varias opciones al exponer su servicio en función de una función llamada tipos de servicio de Kubernetes y son:

  1. ClusterIP: este tipo de servicio generalmente expone el servicio en una IP interna, accesible solo dentro del clúster y posiblemente solo dentro de los nodos del clúster.
  2. NodePort: esta es la opción más básica para exponer su servicio para que sea accesible fuera de su clúster, en un puerto específico (llamado NodePort) en cada nodo del clúster. Ilustraremos esta opción en breve.
  3. LoadBalancer: esta opción aprovecha los servicios externos de equilibrio de carga ofrecidos por varios proveedores para permitir el acceso a su servicio. Esta es una opción más confiable cuando se piensa en la alta disponibilidad para su servicio y tiene más funciones más allá del acceso predeterminado.
  4. ExternalName: este servicio redirecciona el tráfico a servicios fuera del clúster. Como tal, el servicio se asigna a un nombre DNS que podría alojarse fuera de su clúster. Es importante tener en cuenta que esto no utiliza proxy.

El tipo de servicio predeterminado es ClusterIP.

En nuestro escenario, queremos utilizar el tipo de servicio NodePort porque tenemos una dirección IP pública y privada y no necesitamos un equilibrador de carga externo por ahora. Con este tipo de servicio, Kubernetes asignará este servicio en los puertos del rango 30000+.

# kubectl create service nodeport nginx --tcp=80:80

Ejecute el comando get svc para ver un resumen del servicio y los puertos expuestos.

# kubectl get svc

Ahora puede verificar que la página de Nginx sea accesible en todos los nodos usando el comando curl.

# curl master-node:30386
# curl node-1:30386
# curl node-2:30386

Como puede ver, el mensaje "¡BIENVENIDO A NGINX!" se puede acceder a la página.

Como habrás notado, Kubernetes informa que no tengo una IP pública activa registrada, o mejor dicho, no tengo una IP EXTERNA registrada.

# kubectl get svc

Verifiquemos si es cierto, que no tengo una IP EXTERNA adjunta a mis interfaces mediante el comando IP.

# ip a

No hay IP pública como puede ver.

Como se mencionó anteriormente, actualmente estoy ejecutando esta implementación en una máquina virtual ofrecida por un proveedor de nube pública. Entonces, aunque no hay una interfaz en particular asignada a una IP pública, el proveedor de VM ha emitido una dirección IP externa efímera.

Una dirección IP externa efímera es una dirección IP temporal que permanece adjunta a la VM hasta que se detiene la instancia virtual. Cuando se reinicia la instancia virtual, se asigna una nueva IP externa. Básicamente, es una forma sencilla para que los proveedores de servicios aprovechen las IP públicas inactivas.

El desafío aquí, aparte del hecho de que su IP pública no es estática, es que la IP pública efímera es simplemente una extensión (o proxy) de la IP privada y, por esa razón, solo se accederá al servicio en el puerto 30386. Eso significa que se accederá al servicio en la URL , es decir 104.197.170.99:30386, que si revisa su navegador, debería poder ver la página de bienvenida.

Con eso, hemos implementado con éxito NGINX en nuestro clúster de Kubernetes de 3 nodos.