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

Implementar 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 Kubernetes Service-types y son:

  1. ClusterIP – This Service-type generally exposes the service on an internal IP, reachable only within the cluster, and possibly only within the cluster-nodes.
  2. NodePort – This is the most basic option of exposing your service to be accessible outside of your cluster, on a specific port (called the NodePort) on every node in the cluster. We will illustrate this option shortly.
  3. LoadBalancer – This option leverages on external Load-Balancing services offered by various providers to allow access to your service. This is a more reliable option when thinking about high availability for your service, and has more feature beyond default access.
  4. ExternalName – This service does traffic redirect to services outside of the cluster. As such the service is thus mapped to a DNS name that could be hosted out of your cluster. It is important to note that this does not use proxying.

El tipo de servicio predeterminado es ClusterIP.

En nuestro escenario, queremos usar 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 a los puertos en el 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 más bien 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 emitió 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 , que es 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.