Configurar el balanceo de cargas HTTP con Ingress

Este instructivo muestra cómo ejecutar una aplicación web detrás de un balanceador de cargas HTTP mediante la configuración del recurso Ingress.

Contexto

GKE ofrece asistencia integrada a dos tipos de Cloud Load Balancing para una aplicación de acceso público:

  1. Puedes crear un balanceador de cargas TCP/UDP especificando type: LoadBalancer en un manifiesto de recurso de Servicio. Aunque un balanceador de cargas TCP funciona en un servidor web HTTP, no están diseñados para resolver el tráfico HTTP(S), ya que no conocen las solicitudes HTTP(S) individuales. GKE no configura ninguna verificación de estado para balanceadores de cargas TCP/UDP. Consulta el Instructivo de libro de visitas para ver un ejemplo de este tipo de balanceador de cargas.

  2. Puedes crear balanceadores de cargas HTTP(S) usando un recurso Ingress. Los balanceadores de cargas HTTP(S) están diseñados para terminar las solicitudes HTTP(S) y pueden tomar mejores decisiones de balanceo de cargas de adaptación al contexto. Ofrecen características como personalizar mapas de URL y rescisión de TLS. GKE configura automáticamente las verificaciones de estado para balanceadores de cargas HTTP(S).

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).

Antes de comenzar

Sigue los siguientes pasos para habilitar la API de Kubernetes Engine:
  1. Visita la página Kubernetes Engine en Google Cloud Platform Console.
  2. Crea o selecciona un proyecto.
  3. Espera a que la API y los servicios relacionados se habiliten. Esto puede tardar varios minutos.
  4. Comprueba que la facturación esté habilitada en tu proyecto.

    Descubre cómo puedes habilitar la facturación

Instala las siguientes herramientas de línea de comandos que se usan en este instructivo:

  • gcloud se usa para crear y borrar clústeres de Kubernetes Engine. gcloud está incluido en SDK de Google Cloud.
  • kubectl se usa para administrar Kubernetes, el sistema de organización de clústeres usado por Kubernetes Engine. Puedes instalar kubectl con gcloud:
    gcloud components install kubectl

Establece valores predeterminados para la herramienta de línea de comandos de gcloud

Para ahorrar tiempo escribiendo tu ID del proyecto y las opciones de la zona de Compute Engine en la herramienta de línea de comandos de gcloud, puedes establecer los siguientes valores:
gcloud config set project [PROJECT_ID]
gcloud config set compute/zone us-central1-b

Crea un clúster de contenedores

Crea un clúster de contenedores llamado loadbalancedcluster. Para ello, ejecuta el siguiente comando:

gcloud container clusters create loadbalancedcluster

Paso 1: Implementa una aplicación web

Crea una Implementación usando de muestra la imagen del contenedor de la aplicación web que se escucha en un servidor HTTP en el puerto 8080:

kubectl run web --image=gcr.io/google-samples/hello-app:1.0 --port=8080

Paso 2: Expón tu implementación como un servicio interno

Crea un recuso de Servicio para hacer la implementación web accesible dentro de tu Clúster del contenedor.

kubectl expose deployment web --target-port=8080 --type=NodePort

Cuando creas un servicio de tipo NodePort con este comando, GKE hace que tu servicio 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 servicio y que se haya asignado un puerto de nodo:

kubectl get service web
Salida:
NAME      TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
web       NodePort   10.35.245.219   <none>        8080:32640/TCP   5m

En la salida de muestra anterior, el puerto de nodo para el servicio web es 32640. 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 Ingress.

Paso 3: Crea un recurso 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 HTTP(S) y lo configura para enrutar el tráfico a tu aplicación.

Si bien el Ingress de Kubernetes es un recurso Beta, lo que significa que la forma en que describes el objeto de Ingress está sujeta a cambios, los balanceadores de cargas en la nube que el GKE dispone a fin de implementar Ingress están listos para la producción.

El siguiente archivo de configuración define un recurso Ingress que dirige el tráfico a tu servicio web:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: basic-ingress
spec:
  backend:
    serviceName: web
    servicePort: 8080

Para implementar este recurso Ingress, descarga basic-ingress.yaml y ejecuta:

kubectl apply -f basic-ingress.yaml

Una vez que implementas este manifiesto, Kubernetes crea un recurso de Ingress en tu clúster. El controlador Ingress que se ejecuta en tu clúster es responsable de crear un balanceador de cargas HTTP(S) para enrutar todo el tráfico HTTP externo (en el puerto 80) al servicio web NodePort que expones.

Paso 4: 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
Salida:
NAME            HOSTS     ADDRESS         PORTS     AGE
basic-ingress   *         203.0.113.12    80        2m

Dirige tu navegador a la dirección IP externa de tu aplicación y ve una respuesta HTTP de texto sin formato como el siguiente ejemplo:

Hello, world!
Version: 1.0.0
Hostname: web-6498765b79-fq5q5

Puedes visitar balanceo de cargas en GCP Console para inspeccionar los recursos de red creados por el controlador Ingress.

Paso 5: (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. Para una aplicación web que estés planeando durante mucho tiempo, necesitas usar una dirección IP externa estática.

Ten en cuenta que una vez que configures una IP estática para el recurso Ingress, borrar Ingress no eliminará 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.

** Opción 1: Convertir la dirección IP efímera existente en una dirección IP estática **

Si ya tienes un Ingress implementado, puedes convertir la dirección IP efímera existente de tu aplicación en una dirección IP estática reservada sin cambiar la dirección IP externa visitando la sección Direcciones IP externas en GCP Console.

Opción 2: Reserva una nueva dirección IP estática

Reserva una dirección IP externa estática llamada web-static-ip ejecutando lo siguiente:

gcloud compute addresses create web-static-ip --global

Ahora necesitas configurar el recurso Ingress existente para usar la dirección IP reservada. Reemplaza los contenidos del manifiesto basic-ingress.yaml con el siguiente manifiesto:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: basic-ingress
  annotations:
    kubernetes.io/ingress.global-static-ip-name: "web-static-ip"
spec:
  backend:
    serviceName: web
    servicePort: 8080

Este cambio agrega una anotación a Ingress para usar el recurso de IP estático llamado web-static-ip. Para aplicar esta modificación a la entrada existente, ejecuta el siguiente comando:

kubectl apply -f basic-ingress.yaml

Ejecuta kubectl get ingress basic-ingress y 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 tomar un par de minutos actualizar el recurso Ingress existente, volver a configurar el balanceo de cargas y propagar las reglas de balanceador de cargas en todo el mundo. Una vez que se complete esta operación, el GKE libera la dirección IP efímera previamente asignada a tu aplicación.

Paso 6: (Opcional) Entrega múltiples aplicaciones en un balanceador de cargas

Puedes ejecutar múltiples servicios en una IP pública y un único balanceador de cargas configurando las reglas de enrutamiento en Ingress. Alojando varios servicios en el mismo Ingress, puedes evitar la creación de balanceadores de cargas adicionales (que son recursos facturables) para cada servicio que expones a Internet.

Crea otra implementación de servidor web con la versión 2.0 de la misma aplicación web:

kubectl run web2 --image=gcr.io/google-samples/hello-app:2.0 --port=8080

Luego, expón la implementación web2 internamente al clúster en un servicio NodePort llamado web:

kubectl expose deployment web2 --target-port=8080 --type=NodePort

El siguiente manifiesto describe un recurso Ingress que:

  • Enruta las solicitudes con una ruta que comienza con /v2/ al servicio web2.
  • Enruta todas las demás solicitudes al servicio web.
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: fanout-ingress
spec:
  rules:
  - http:
      paths:
      - path: /*
        backend:
          serviceName: web
          servicePort: 8080
      - path: /v2/*
        backend:
          serviceName: web2
          servicePort: 8080

Para implementar este manifiesto, guárdalo en un fanout-ingress.yaml y ejecútalo:

kubectl create -f fanout-ingress.yaml

Una vez que ingress se haya implementado, ejecuta kubectl get ingress fanout-ingress para averiguar la dirección IP pública del clúster.

Luego visita la dirección IP para ver que se puede acceder a ambas aplicaciones en el mismo balanceador de cargas:

  • Visita http://<IP_ADDRESS>/ y ten en cuenta que la respuesta contiene Version: 1.0.0 (ya que la solicitud se envía al servicio web)
  • Visita http://<IP_ADDRESS>/v2/ y ten en cuenta que la respuesta contiene Version: 2.0.0 (ya que la solicitud se envía al servicio web2)

El único patrón de comodín compatible que coincide con el campo de path en GKE Ingress es a través del carácter *. Por ejemplo, puedes tener reglas con campos de path como /* o /foo/bar/*. Consulta la documentación de mapas de URL para las limitaciones de path.

Comentarios

Los servicios expuestos a través de Ingress deben entregar una respuesta con estado HTTP 200 a las solicitudes GET en /. Esto se usa para la verificación de estado. Si tu aplicación no entrega HTTP 200 en /, el backend se marcará como en mal estado y no obtendrá tráfico.

Ingress admite casos prácticos más avanzados, como:

  • Alojamiento virtual basado en nombre: Puedes usar Ingress para volver a usar el balanceador de cargas en múltiples nombres de dominio, subdominios y exponer múltiples servicios en una única dirección IP y un balanceador de cargas. Accede a los ejemplos de simple fanout y alojamiento virtual basado en nombre para aprender cómo configurar Ingress en estas tareas.

  • Terminación de HTTPS: Puedes configurar el Ingress para que termine el tráfico de HTTPS con Cloud Load Balancer.

Cuando se borra un Ingress, el controlador del Ingress limpia los recursos asociados (excepto las direcciones IP estáticas reservadas) automáticamente.

Limpieza

Sigue estos pasos para evitar que se apliquen cargos a tu cuenta de Google Cloud Platform por los recursos que usaste en este instructivo:

  1. Borra el Ingress: Esto desasigna la dirección IP externa efímera y los recursos de balanceo de cargas asociados a tu aplicación:

    kubectl delete ingress basic-ingress

    Si has seguido el "Paso 6", borra el Ingress ejecutando:

    kubectl delete ingress fanout-ingress

  2. Borra la dirección IP estática: Ejecuta esto solo si seguiste el Paso 5.

    • Si seguiste la "Opción 1" en el Paso 5 con el fin de convertir una dirección IP efímera existente en una IP estática, visita GCP Console para borrar la IP estática.

    • Si seguiste la "Opción 2" en el Paso 5, ejecuta el siguiente comando para borrar la dirección IP estática:

      gcloud compute addresses delete web-static-ip --global
  3. Borra el clúster: Esto borra los nodos de procesamiento de tu clúster del contenedor y otros recursos, como las implementaciones en el clúster:

    gcloud container clusters delete loadbalancedcluster

¿Qué sigue?

¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...

Instructivos de Kubernetes Engine