En este instructivo, se muestra cómo ejecutar una aplicación web detrás de un balanceador de cargas de aplicaciones externo mediante la configuración del recurso Ingress.
Esta página está dirigida a los especialistas en redes que diseñan y diseñan la red para su organización, y que instalan, configuran y admiten equipos de red. Para obtener más información sobre los roles comunes y las tareas de ejemplo a las que hacemos referencia en el contenido de Google Cloud, consulta Tareas y roles comunes de los usuarios de GKE Enterprise.
Fondo
Google Kubernetes Engine (GKE) ofrece compatibilidad integrada con dos tipos de Cloud Load Balancing para una aplicación de acceso público:
En este instructivo, usarás Ingresses.
Entrada
Cuando especificas kind: Ingress
en un manifiesto de recursos, le indicas a GKE que cree un recurso Ingress. Si incluyes anotaciones y cargas de trabajo y objetos Service compatibles, puedes crear un controlador Ingress personalizado.
De lo contrario, GKE realiza llamadas a la API de Google Cloud adecuadas para crear un balanceador de cargas de aplicaciones externo. Las reglas de host y los comparadores de rutas de acceso de la asignación de URL del balanceador de cargas hacen referencia a uno o más servicios de backend, en el que cada servicio de backend corresponde a un Service de tipo NodePort
de GKE, como se indica en Ingress
. Los backends para cada servicio de backend son grupos de instancias o grupos de extremos de red (NEG). Los NEG se crean cuando configuras el balanceo de cargas nativo del contenedor como parte de la configuración del Ingress. Para cada servicio de backend, GKE crea una verificación de estado de Google Cloud, según la configuración del sondeo de preparación de la carga de trabajo a la que hace referencia el Service de GKE correspondiente.
Si estás exponiendo un servicio HTTP(S) alojado en GKE, el método recomendado para el balanceo de cargas es balanceo de cargas HTTP(S).
Objetivos
- Crear un clúster de GKE.
- Implementar la aplicación web de muestra en el clúster
- Expón la app de ejemplo a Internet detrás de un balanceador de cargas de aplicaciones externo.
Costos
En este documento, usarás los siguientes componentes facturables de Google Cloud:
Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios.
Cuando finalices las tareas que se describen en este documento, puedes borrar los recursos que creaste para evitar que continúe la facturación. Para obtener más información, consulta Cómo realizar una limpieza.
Antes de comenzar
Sigue los pasos que se indican a continuación para habilitar la API de Kubernetes Engine:- Consulta la página Kubernetes Engine en la consola de Google Cloud.
- Crea o selecciona un proyecto.
- Espera a que la API y los servicios relacionados se habiliten. Esto puede tardar varios minutos.
-
Make sure that billing is enabled for your Google Cloud project.
Instala las siguientes herramientas de línea de comandos de este instructivo:
-
gcloud
se usa para crear y borrar clústeres de Kubernetes Engine.gcloud
se incluye en la CLI degcloud
. -
kubectl
se usa para administrar Kubernetes, el sistema de organización de clústeres que emplea Kubernetes Engine. Puedes instalarkubectl
congcloud
:gcloud components install kubectl
Clona el código de ejemplo desde GitHub:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples cd kubernetes-engine-samples/networking/load-balancing
Establece valores predeterminados para la herramienta de línea de comandos de gcloud
Para ahorrar tiempo cuando escribes las opciones del ID del proyecto y la zona de Compute Engine en la herramienta de línea de comandos de gcloud
, puedes establecer valores predeterminados:gcloud config set project project-id gcloud config set compute/zone compute-zone
Crea un clúster de GKE
Crea un clúster de GKE Autopilot:
gcloud container clusters create-auto loadbalancedcluster
Implementa una aplicación web
En el siguiente manifiesto, se describe un Deployment que ejecuta la imagen de contenedor de la aplicación web de muestra en un servidor HTTP en el puerto 8080:
Aplica el recurso al clúster:
kubectl apply -f web-deployment.yaml
Expón tu Deployment en tu clúster
En el siguiente manifiesto, se describe un Service que hace que la implementación web
sea accesible dentro del clúster del contenedor:
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 Service esté disponible en un número alto de puerto seleccionado de forma aleatoria (p. ej., 32640) en todos los nodos de tu clúster.
Verifica que se haya creado el Service y que se asigne un puerto de un nodo:
Salida: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 resultado de muestra, el puerto del nodo para el Service
web
es32640
. Además, ten en cuenta que no hay ninguna IP externa asignada para este servicio. Dado que los nodos GKE no son accesibles externamente de manera predeterminada, crear este servicio no hace que tu aplicación sea accesible desde Internet.
Para que tu aplicación de servidor web HTTP(S) sea de acceso público, debes crear un recurso de Ingress.
Crea un recurso de Ingress
Ingress es un recurso Kubernetes que encapsula una colección de reglas y configuración para enrutar el tráfico HTTP(S) externo a los servicios internos.
En GKE, se implementa Ingress con Cloud Load Balancing. Cuando creas un Ingress en tu clúster, GKE crea un balanceador de cargas de HTTP(S) y lo configura para enrutar el tráfico a tu aplicación.
En el siguiente manifiesto, se describe un recurso de Ingress que dirige el tráfico a tu Service web
:
Aplica el recurso al clúster:
kubectl apply -f basic-ingress.yaml
Después de implementar este manifiesto, Kubernetes crea un recurso Ingress en tu clúster. El controlador de Ingress de GKE crea y configura un balanceador de cargas de HTTP(S) de acuerdo con la información de Ingress y enruta todo el tráfico HTTP externo (en el puerto 80) al Service NodePort web
que expones.
Visita tu aplicación
Averigua la dirección IP externa del balanceador de cargas que entrega tu aplicación ejecutando lo siguiente:
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 observa una respuesta HTTP de texto sin formato como la siguiente:
Hello, world! Version: 1.0.0 Hostname: web-6498765b79-fq5q5
Puedes visitar Balanceo de cargas en la consola de Google Cloud para inspeccionar los recursos de red que crea el controlador de Ingress de GKE.
(Opcional) Configura una dirección IP estática
Cuando expones 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.
Según la configuración predeterminada, GKE asigna direcciones IP externas efímeras para aplicaciones HTTP expuestas a través de un Ingress. Las direcciones efímeras están sujetas a cambios. Si planeas 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 de Ingress, la eliminación de Ingress no borrará la dirección IP estática asociada a él. Asegúrate de limpiar las direcciones IP estáticas que configuraste una vez que ya no planees usarlas nuevamente.
Para configurar una dirección IP estática, completa los siguientes 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: En este paso, se necesita Config Connector. Sigue las instrucciones de instalación para instalar Config Connector en el clúster.
Para implementar este manifiesto, descárgalo en tu máquina como compute-address.yaml y ejecuta lo siguiente:kubectl apply -f compute-address.yaml
Mediante el manifiesto
basic-ingress-static.yaml
, se agrega una anotación a Ingress para usar el recurso IP estático llamadoweb-static-ip
:Visualiza el manifiesto:
cat basic-ingress-static.yaml
Aplica el recurso al clúster:
kubectl apply -f basic-ingress-static.yaml
Verifica la dirección IP externa:
kubectl get ingress basic-ingress
Espera hasta que la dirección IP de la aplicación cambie para usar la dirección IP reservada del recurso
web-static-ip
.Puede tomar unos minutos actualizar el recurso de Ingress existente, volver a configurar el balanceador de cargas y propagar las reglas del balanceo de cargas en todo el mundo. Una vez que se complete esta operación, GKE libera la dirección IP efímera asignada antes a tu aplicación.
Entrega varias aplicaciones en un balanceador de cargas (opcional)
Puedes ejecutar múltiples servicios en una IP pública y un único balanceador de cargas configurando las reglas de enrutamiento en Ingress. Si alojas varios servicios en el mismo Ingress, se evita tener que crear balanceadores de cargas adicionales (que son recursos facturables) para cada servicio que expones en Internet.
En el siguiente manifiesto, se describe un Deployment 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
En el siguiente manifiesto, se describe un Service que expone web2
de forma interna al clúster en un Service de NodePort llamado web2
:
Aplica el recurso al clúster:
kubectl apply -f web-service-v2.yaml
El siguiente manifiesto describe un recurso Ingress que:
- Enruta las solicitudes con una ruta que comienza con
/v2/
al servicioweb2
. - Enruta todas las demás solicitudes al servicio
web
.
Aplica el recurso al clúster:
kubectl create -f fanout-ingress.yaml
Una vez que Ingress se haya implementado, ejecuta kubectl get ingress fanout-ingress
para buscar la dirección IP pública del clúster.
Luego, visita la dirección IP para ver si se puede acceder a ambas aplicaciones en el mismo balanceador de cargas:
- Visita
http://<IP_ADDRESS>/
y presta atención a la respuesta, que contieneVersion: 1.0.0
(ya que la solicitud se enruta al servicioweb
) - Visita
http://<IP_ADDRESS>/v2/
y presta atención a la respuesta, que contieneVersion: 2.0.0
(ya que la solicitud se enruta al servicioweb2
)
El único carácter comodín admitido para el campo path
de un Ingress es el carácter *
. El carácter *
debe estar después de una barra diagonal (/
) y debe ser el último carácter del patrón. Por ejemplo, /*
, /foo/*
y /foo/bar/*
son patrones válidos, pero *
, /foo/bar*
y /foo/*/bar
no lo son.
Un patrón más específico tiene prioridad sobre uno menos específico. Si tienes /foo/*
y /foo/bar/*
, entonces se considera que /foo/bar/bat
coincide con /foo/bar/*
.
Para obtener más información sobre las limitaciones de ruta y la coincidencia de patrones, consulta la documentación de mapas de URL.
(Opcional) Supervisa la disponibilidad y la latencia de tu servicio
Las verificaciones de tiempo de actividad de Google Cloud realizan una supervisión de las aplicaciones de caja negra desde el punto de vista del usuario y determinan la latencia y la disponibilidad de varias direcciones IP externas en el balanceador de cargas. En comparación, las verificaciones de estado de Google Cloud realizan una verificación interna de las IP del Pod, lo que determina la disponibilidad a nivel de la instancia. Las verificaciones son complementarias y proporcionan un panorama integral del estado de la aplicación.
Puedes crear una verificación de tiempo de actividad mediante la consola de Google Cloud, la API de Cloud Monitoring o las bibliotecas cliente de Cloud Monitoring. Para obtener información, consulta Administra verificaciones de tiempo de actividad. Si deseas crear una verificación de tiempo de actividad mediante la consola de Google Cloud, haz lo siguiente:
Ve a la página Ingress y servicios en la consola de Google Cloud.
Haz clic en el nombre del servicio para el que deseas crear una verificación de tiempo de actividad.
Haga clic en Crear una verificación de tiempo de actividad.
En el panel Crear verificación de tiempo de actividad, ingresa un título para la verificación de tiempo de actividad y haz clic en Siguiente a fin de avanzar a la configuración de Destino.
Los campos Destino de la verificación de tiempo de actividad se completan de forma automática con la información del balanceador de cargas de servicios.
Para obtener la documentación completa sobre todos los campos de una verificación de tiempo de actividad, consulta Crea una verificación de tiempo de actividad.
Haz clic en Siguiente para pasar a la configuración de Validación de respuesta.
Haz clic en Siguiente para pasar a la sección Alerta y notificación.
Para supervisar una verificación de tiempo de actividad, puedes crear una política de alertas o ver el panel de verificación de tiempo de actividad. Una política de alertas puede notificarte por correo electrónico o a través de un canal diferente si falla la verificación de tiempo de actividad. Para obtener información general sobre las políticas de alertas, consulta Introducción a las alertas.
Haz clic en Crear.
Comentarios
De forma predeterminada, Ingress realiza una verificación de estado periódica mediante una solicitud GET
en la ruta /
a fin de determinar el estado de la aplicación y espera una respuesta HTTP 200. Si deseas verificar una ruta diferente o esperar un código de respuesta diferente, puedes usar una ruta de verificación de estado personalizada.
Ingress admite casos prácticos más avanzados, como:
Hosting virtual basado en nombre: Puedes usar Ingress para volver a usar el balanceador de cargas en varios nombres de dominio, subdominios y exponer diversos servicios en una única dirección IP y balanceador de cargas. Accede a los ejemplos de fanout simple y hosting virtual basado en nombre para aprender a configurar Ingress en estas tareas.
Finalización de HTTPS: Puedes configurar Ingress para que finalice el tráfico HTTPS con el balanceador de cargas de Cloud.
Cuando se borra un Ingress de GKE, el controlador del Ingress limpia los recursos asociados (excepto las direcciones IP estáticas reservadas) automáticamente.
Limpia
Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos usados en este instructivo, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.
Borra las reglas de reenvío que se crearon de forma manual y los proxies de destino que hagan referencia al Ingress:
Un proxy de destino que hace referencia a un mapa de URL administrado por el controlador de GKE Ingress hará que la eliminación del Ingress falle en las versiones 1.15.4-gke.22+. Inspecciona el recurso de Ingress para buscar un evento con un mensaje de error similar al siguiente:
Error during GC: error running load balancer garbage collection routine: googleapi: Error 400: The url_map resource 'projects/project-id/global/urlMaps/k8s2-um-tlw9rhgp-default-my-ingress-9ifnni82' is already being used by 'projects/project-id/global/targetHttpsProxies/k8s2-um-tlw9rhgp-default-my82-target-proxy', resourceInUseByAnotherResource
En el mensaje de error anterior,
k8s2-um-tlw9rhgp-default-my82-target-proxy
es un proxy https de destino creado de forma manual que todavía hace referencia al mapa de URLk8s2-um-tlw9rhgp-default-my-ingress-9ifnni82
que creó y administró el controlador de Ingress.Estos recursos de frontend creados de forma manual (la regla de reenvío y el proxy de destino) deben borrarse antes de continuar con la eliminación del Ingress.
Borra el Ingress: Mediante este paso, se desasigna la dirección IP externa efímera y los recursos del balanceo de cargas asociados con tu aplicación:
kubectl delete ingress basic-ingress
Si realizaste el paso opcional para crear un Ingress que enrute solicitudes por ruta, borra el Ingress:
kubectl delete ingress fanout-ingress
Borra la dirección IP estática: Completa este paso solo si realizaste el paso opcional para crear una dirección IP estática.
Si seguiste la “Opción 1” para convertir una dirección IP efímera existente en una IP estática, visita la consola de Google Cloud a fin de borrar la dirección IP estática.
Si seguiste la "Opción 2" para crear una nueva dirección IP estática, ejecuta el siguiente comando a fin de borrar la dirección IP estática:
gcloud compute addresses delete web-static-ip --global
Borra el clúster: Este paso borra los nodos de procesamiento de tu clúster del contenedor y otros recursos, como los Deployment en el clúster:
gcloud container clusters delete loadbalancedcluster
¿Qué sigue?
- Consulta la guía de usuario Ingress para obtener detalles sobre las características de Ingress.
- Configura una IP estática y un nombre de dominio para tu aplicación Ingress mediante Ingress.
- Configura los certificados SSL para tu balanceador de cargas de Ingress.
- Obtén más información para usar certificados SSL administrados por Google con Ingress.
Si tienes una aplicación en ejecución en varios clústeres de Kubernetes Engine en diferentes regiones, configura Ingress de múltiples clústeres para enrutar el tráfico a un clúster en la región más cercana al usuario.
Explora otros instructivos de Kubernetes Engine.
Explora arquitecturas de referencia, diagramas y prácticas recomendadas sobre Google Cloud. Consulta nuestro Cloud Architecture Center.