En este tutorial se muestra cómo ejecutar una aplicación web detrás de un balanceador de carga de aplicaciones externo configurando el recurso Ingress.
Esta página está dirigida a especialistas en redes que diseñan y desarrollan la red de su organización, así como instalan, configuran y ofrecen asistencia para los equipos de red. Para obtener más información sobre los roles habituales y las tareas de ejemplo a las que hacemos referencia en el contenido, consulta Roles y tareas de usuario habituales de GKE.Google Cloud
Fondo
Google Kubernetes Engine (GKE) ofrece asistencia integrada para dos tipos de Cloud Load Balancing para una aplicación accesible públicamente:
En este tutorial, usarás Ingress.
Entrada
Cuando especifica kind: Ingress
en un manifiesto de recursos, indica a GKE que cree un recurso Ingress. Si incluye anotaciones y cargas de trabajo y servicios compatibles, puede crear un controlador de Ingress personalizado.
De lo contrario, GKE hará las llamadas a la API adecuadas para crear un balanceador de carga de aplicaciones externo. Google Cloud Las reglas de host y los matchers de ruta del mapa de URLs del balanceador de carga hacen referencia a uno o varios servicios de backend, donde cada servicio de backend corresponde a un Service de GKE de tipo NodePort
, tal como se indica en Ingress
. Los backends de cada servicio de backend son grupos de instancias o grupos de puntos finales de red (NEGs). Los NEGs se crean cuando configura el balanceo de carga nativo de contenedores como parte de la configuración de su objeto Ingress. Por cada servicio de backend, GKE crea una Google Cloud comprobación del estado basada en los ajustes de la sonda de preparación de la carga de trabajo a la que hace referencia el servicio de GKE correspondiente.
Si expones un servicio HTTP(S) alojado en GKE, el balanceo de carga HTTP(S) es el método recomendado para balancear la carga.
Desplegar una aplicación web
El siguiente manifiesto describe un Deployment que ejecuta la imagen de contenedor de la aplicación web de ejemplo en un servidor HTTP en el puerto 8080:
Aplica el recurso al clúster:
kubectl apply -f web-deployment.yaml
Exponer un Deployment en un clúster
El siguiente manifiesto describe un Service que hace que la implementación de web
sea accesible en tu clúster de contenedores:
Aplica el recurso al clúster:
kubectl apply -f web-service.yaml
Cuando creas un servicio de tipo NodePort con este comando, GKE hace que tu servicio esté disponible en un número de puerto alto seleccionado aleatoriamente (por ejemplo, 32640) en todos los nodos de tu clúster.
Comprueba que se haya creado el servicio y que se haya asignado un puerto de nodo:
Resultado:kubectl get service web
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE web NodePort 10.35.245.219 <none> 8080:32640/TCP 5m
En el ejemplo de salida, el puerto de nodo del servicio
web
es32640
. Recuerda además que no hay una IP externa asignada para este servicio. Como los nodos de GKE no son accesibles externamente de forma predeterminada, al crear este servicio no se podrá acceder a tu aplicación desde Internet.
Para que se pueda acceder públicamente a tu aplicación de servidor web HTTP(S), debes crear un recurso Ingress.
Crear un recurso Ingress
Ingress es un recurso de Kubernetes que encapsula una colección de reglas y configuraciones para dirigir el tráfico HTTP(S) externo a servicios internos.
En GKE, Ingress se implementa mediante Cloud Load Balancing. Cuando creas un objeto Ingress en tu clúster, GKE crea un balanceador de carga HTTP(S) y lo configura para enrutar el tráfico a tu aplicación.
El siguiente manifiesto describe un recurso Ingress que dirige el tráfico a tu servicio web
:
Aplica el recurso al clúster:
kubectl apply -f basic-ingress.yaml
Después de desplegar este manifiesto, Kubernetes crea un recurso Ingress en tu clúster. El controlador Ingress de GKE crea y configura un balanceador de carga HTTP(S) según la información de Ingress, y dirige todo el tráfico HTTP externo (en el puerto 80) al web
servicio NodePort que has expuesto.
Visitar tu aplicación
Busca la dirección IP externa del balanceador de carga que sirve tu aplicación ejecutando:
kubectl get ingress basic-ingress
NAME HOSTS ADDRESS PORTS AGE basic-ingress * 203.0.113.12 80 2m
Abre la dirección IP externa de tu aplicación en un navegador y verás una respuesta HTTP de texto sin formato como la siguiente:
Hello, world! Version: 1.0.0 Hostname: web-6498765b79-fq5q5
Puede visitar Balanceo de carga en la consola Google Cloud e inspeccionar los recursos de red creados por el controlador de Ingress de GKE.
(Opcional) Configurar una dirección IP estática
Cuando publicas un servidor web en un nombre de dominio, necesitas que la dirección IP externa de una aplicación sea una IP estática que no cambie.
De forma predeterminada, GKE asigna direcciones IP externas efímeras a las aplicaciones HTTP expuestas a través de un objeto Ingress. Las direcciones efímeras están sujetas a cambios. Si tienes previsto ejecutar tu aplicación durante mucho tiempo, debes usar una dirección IP externa estática.
Ten en cuenta que, después de configurar una IP estática para el recurso Ingress, si eliminas el recurso Ingress, no se eliminará la dirección IP estática asociada. No olvides eliminar las direcciones IP estáticas que hayas configurado cuando ya no tengas previsto volver a usarlas.
Para configurar una dirección IP estática, sigue estos pasos:
Reserva una dirección IP externa estática llamada
web-static-ip
:gcloud
gcloud compute addresses create web-static-ip --global
Config Connector
Nota: Para este paso se necesita Config Connector. Sigue las instrucciones de instalación para instalar Config Connector en tu clúster.
Para desplegar este manifiesto, descárgalo en tu máquina como compute-address.yaml y ejecuta el siguiente comando:kubectl apply -f compute-address.yaml
El manifiesto
basic-ingress-static.yaml
añade una anotación en Ingress para usar el recurso de IP estática llamadoweb-static-ip
:Para ver el archivo de manifiesto, haz lo siguiente:
cat basic-ingress-static.yaml
Aplica el recurso al clúster:
kubectl apply -f basic-ingress-static.yaml
Comprueba la dirección IP externa:
kubectl get ingress basic-ingress
Espera hasta que la dirección IP de tu aplicación cambie para usar la dirección IP reservada del recurso
web-static-ip
.Puede que tarde unos minutos en actualizar el recurso Ingress, volver a configurar el balanceador de carga y propagar las reglas de balanceo de carga por todo el mundo. Una vez completada esta operación, GKE libera la dirección IP efímera asignada anteriormente a tu aplicación.
(Opcional) Servir varias aplicaciones en un balanceador de carga
Es posible ejecutar múltiples servicios en un solo balanceador de carga e IP pública configurando reglas de enrutamiento en el Ingress. Si alojas varios servicios en el mismo Ingress, puedes evitar crear balanceadores de carga adicionales (que son recursos facturables) para cada servicio que expongas en Internet.
El siguiente archivo de manifiesto describe una implementación con la versión 2.0
de la misma aplicación web:
Aplica el recurso al clúster:
kubectl apply -f web-deployment-v2.yaml
El siguiente manifiesto describe un servicio que expone web2
internamente al clúster en un servicio NodePort llamado web2
:
Aplica el recurso al clúster:
kubectl apply -f web-service-v2.yaml
El siguiente manifiesto describe un recurso Ingress que realiza lo siguiente:
- Enruta las solicitudes con la ruta que empieza por
/v2/
al servicioweb2
. - ruta todas las demás solicitudes al
web
servicio
Aplica el recurso al clúster:
kubectl create -f fanout-ingress.yaml
Una vez que se haya implementado el Ingress, ejecuta kubectl get ingress fanout-ingress
para averiguar la dirección IP pública del clúster.
A continuación, visita la dirección IP para comprobar que se puede acceder a ambas aplicaciones en el mismo balanceador de carga:
- Visita
http://<IP_ADDRESS>/
y observa que la respuesta contieneVersion: 1.0.0
(ya que la solicitud se ha dirigido al servicioweb
). - Visita
http://<IP_ADDRESS>/v2/
y observa que la respuesta contieneVersion: 2.0.0
(ya que la solicitud se ha dirigido al servicioweb2
).
El único carácter comodín admitido en el campo path
de un Ingress
es el carácter *
. El carácter *
debe ir después de una barra diagonal (/
) y ser el último carácter del patrón. Por ejemplo, /*
, /foo/*
y /foo/bar/*
son formatos válidos, pero *
, /foo/bar*
y /foo/*/bar
no lo son.
Un patrón más específico tiene prioridad sobre un patrón menos específico. Si tienes /foo/*
y /foo/bar/*
, se considera que /foo/bar/bat
coincide con /foo/bar/*
.
Para obtener más información sobre las limitaciones de las rutas y la coincidencia de patrones, consulta la documentación de mapas de URLs.
(Opcional) Monitorizar la disponibilidad y la latencia de tu servicio
LasGoogle Cloud comprobaciones de tiempo de actividad monitorizan las aplicaciones de caja negra desde el punto de vista del usuario, lo que permite determinar la latencia y la disponibilidad de varias IPs externas a la dirección IP del balanceador de carga. En comparación, las comprobaciones del estado Google Cloud realizan una comprobación interna de las IPs de los pods para determinar la disponibilidad a nivel de instancia. Estas comprobaciones son complementarias y ofrecen una visión integral del estado de las aplicaciones.
Puedes crear una comprobación de disponibilidad mediante la Google Cloud consola, la API de Cloud Monitoring o las bibliotecas de cliente de Cloud Monitoring. Para obtener más información, consulta Gestionar comprobaciones de disponibilidad del servicio. Si quieres crear una comprobación de disponibilidad con la consola Google Cloud , sigue estos pasos:
Ve a la página Servicios y entrada de la Google Cloud consola.
Haz clic en el nombre del servicio para el que quieras crear una comprobación de disponibilidad.
Haz clic en Crear comprobación de disponibilidad.
En el panel Crear comprobación de tiempo de actividad, introduce un título para la comprobación de tiempo de actividad y, a continuación, haz clic en Siguiente para ir a los ajustes de Destino.
Los campos Destino de la comprobación de tiempo de actividad se rellenan automáticamente con la información del balanceador de carga de servicio.
Para consultar la documentación completa sobre todos los campos de una comprobación de disponibilidad, consulta el artículo Crear una comprobación de disponibilidad.
Haz clic en Siguiente para ir a la configuración de Validación de respuestas.
Haz clic en Siguiente para ir a la sección Alertas y notificaciones.
Para monitorizar una comprobación de disponibilidad, puedes crear una política de alertas o ver el panel de control de comprobaciones de disponibilidad. Una política de alertas puede enviarte una notificación por correo electrónico o a través de otro canal si falla la comprobación de disponibilidad. Para obtener información general sobre las políticas de alertas, consulta el artículo Introducción a las alertas.
.Haz clic en Crear.
Observaciones
De forma predeterminada, Ingress realiza una comprobación de estado periódica enviando una solicitud GET
a la ruta /
para determinar el estado de la aplicación y espera una respuesta HTTP 200. Si quieres comprobar otra ruta o esperar un código de respuesta diferente, puedes usar una ruta de comprobación de estado personalizada.
Ingress admite casos prácticos más avanzados, como:
Alojamiento virtual basado en nombres: puedes usar Ingress para reutilizar el balanceador de carga en varios nombres de dominio y subdominios, así como para exponer varios servicios en una sola dirección IP y un solo balanceador de carga. Consulta los ejemplos de fan-out simple y hosting virtual basado en nombres para saber cómo configurar Ingress para estas tareas.
Anulación de HTTPS: puedes configurar el recurso Ingress para anular el tráfico HTTPS mediante el balanceador de carga de Cloud.
Cuando se elimina un Ingress, el controlador de Ingress de GKE limpia automáticamente los recursos asociados (excepto las direcciones IP estáticas reservadas).