Integra el balanceo de cargas HTTP(S) en Cloud Run for Anthos

En este instructivo, se muestra cómo usar el balanceo de cargas de HTTP(S) mediante los servicios de Cloud Run for Anthos en Google Cloud, en lugar del balanceo de cargas de red, para exponer los servicios en Internet.

El balanceo de cargas de HTTP(S) proporciona un balanceo de cargas global y se integra a una serie de productos y funciones de Google Cloud, como Google Cloud Armor, Cloud CDN, Identity-Aware Proxy (IAP) y los certificados TLS administrados para el tráfico HTTPS.

Kubernetes Ingress y puerta de enlace de entrada de Istio

En este instructivo, se usan dos conceptos similares y relacionados. Para completar este instructivo, es importante comprender las diferencias siguientes:

  • La puerta de enlace de entrada de Istio define reglas para enrutar el tráfico HTTP/TCP externo a los servicios en un clúster de Kubernetes. La puerta de enlace de entrada de Istio se implementa como un Service de Kubernetes y un Deployment de Kubernetes.
  • Kubernetes Ingress define reglas para enrutar el tráfico HTTP(S) externo a uno o más servicios de Kubernetes en un clúster. Cuando creas un objeto de Kubernetes Ingress en un clúster de GKE, GKE aprovisiona los recursos necesarios para el balanceo de cargas de HTTP(S).

En este instructivo, usas un recurso de Kubernetes Ingress para enrutar el tráfico externo a la puerta de enlace de entrada de Istio. A continuación, la puerta de enlace de entrada de Istio enruta el tráfico a los servicios del clúster, como se muestra en el diagrama siguiente.

Diagrama que muestra cómo se enruta el tráfico HTTP/TCP externo

Puedes usar la puerta de enlace de entrada de Istio para realizar el enrutamiento a varios servicios dentro del mismo clúster de GKE.

Objetivos

  • Crea un clúster de GKE con Cloud Run habilitado.
  • Crea un servicio virtual de Istio para controlar las solicitudes de verificación de estado.
  • Modifica el objeto de Kubernetes Service de la puerta de enlace de entrada de Istio para que un objeto de Kubernetes Ingress pueda exponerlo.
  • Configura el balanceo de cargas de HTTP(S) mediante la creación de un objeto de Kubernetes Ingress.
  • Implementa un servicio de muestra para verificar la solución.

Costos

En este instructivo, se usan 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. Es posible que los usuarios nuevos de Google Cloud sean aptos para obtener una prueba gratuita.

Cuando finalices este instructivo, podrás borrar los recursos creados para evitar que se te siga facturando. Para obtener más información, consulta cómo hacer una limpieza.

Antes de comenzar

  1. Selecciona o crea un proyecto de Cloud.

    Ir a la página Selector de proyectos

  2. Habilita la facturación para el proyecto de Cloud.

  3. Habilita las API de GKE, Cloud Run, and Google Cloud necesarias .

    Habilitar las API

  4. En Cloud Console, abre Cloud Shell.

    Abrir Cloud Shell

    En la parte inferior de Cloud Console, se abre una sesión de Cloud Shell que muestra una ventana emergente con una línea de comandos. Cloud Shell es un entorno de shell con el SDK de Cloud ya instalado, en el que se incluye la herramienta de línea de comandos de gcloud, y con valores ya establecidos para el proyecto actual. La sesión puede llevar unos segundos en inicializarse.

    Usa Cloud Shell para ejecutar todos los comandos de este instructivo.

Crea un clúster de GKE mediante Cloud Run

  • Crea un clúster de GKE con el complemento de Cloud Run:

    CLUSTER=cloudrun-gke-gclb-tutorial
    ZONE=us-central1-f
    
    gcloud container clusters create $CLUSTER \
        --addons HorizontalPodAutoscaling,HttpLoadBalancing,CloudRun \
        --enable-ip-alias \
        --enable-stackdriver-kubernetes \
        --release-channel regular \
        --zone $ZONE
    

    En este instructivo, se usa cloudrun-gke-gclb-tutorial como el nombre del clúster y como la zona us-central1-f. Puedes cambiar estos valores. Para obtener más información, consulta Geografía y regiones.

    Para comprender las opciones en el comando, revisa los siguientes puntos:

    • El complemento HttpLoadBalancing permite que los objetos Ingress de Kubernetes configuren el balanceo de cargas de HTTP(S) para el clúster.

    • La opción --enable-ip-alias permite que el clúster sea nativo de la VPC. Esta opción es obligatoria si deseas usar el balanceo de cargas nativo del contenedor, que se emplea en este instructivo.

    • Con la opción --enable-stackdriver-kubernetes, se agregan registros, eventos y métricas del clúster mediante las operaciones en la nube para GKE. El complemento de Cloud Run requiere esta opción.

Controla las solicitudes de verificación de estado

  • Crea un servicio virtual de Istio que permita que el clúster responda a las solicitudes de verificación de estado del balanceo de cargas mediante el reenvío de las solicitudes al extremo de estado en la puerta de enlace de entrada de Istio.

    Ten en cuenta que el servicio virtual que estás creando está vinculado al recurso gke-system-gateway de la puerta de enlace de Istio, que se instala mediante el complemento de Cloud Run.

    kubectl apply -f - <<EOF
    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: health
      namespace: knative-serving
    spec:
      gateways:
      - gke-system-gateway
      hosts:
      - "*"
      http:
      - match:
        - headers:
            user-agent:
              prefix: GoogleHC
          method:
            exact: GET
          uri:
            exact: /
        rewrite:
          authority: istio-ingress.gke-system.svc.cluster.local:15020
          uri: /healthz/ready
        route:
        - destination:
            host: istio-ingress.gke-system.svc.cluster.local
            port:
              number: 15020
    EOF
    

Modifica la puerta de enlace de entrada de Istio para usarla con Kubernetes Ingress

  1. Crea un archivo de parche JSON para realizar cambios en la puerta de enlace de entrada de Istio de la siguiente manera:

    cat <<EOF > istio-ingress-patch.json
    [
      {
        "op": "replace",
        "path": "/spec/type",
        "value": "NodePort"
      },
      {
        "op": "remove",
        "path": "/status"
      }
    ]
    EOF
    
  2. Aplica el archivo de parche y agrega la puerta de enlace de entrada de Istio como un backend:

    kubectl -n gke-system patch svc istio-ingress \
        --type=json -p="$(cat istio-ingress-patch.json)" \
        --dry-run=true -o yaml | kubectl apply -f -
    kubectl annotate svc istio-ingress -n gke-system cloud.google.com/neg='{"exposed_ports": {"80":{}}}'
    

    Este parche realiza los cambios siguientes en el objeto del servicio de Kubernetes de la puerta de enlace de entrada de Istio:

Crea un objeto Ingress de Kubernetes

  1. Crea un objeto Ingress de Kubernetes llamado my-ingress:

    kubectl apply -f - <<EOF
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: my-ingress
      namespace: gke-system
    spec:
      backend:
        serviceName: istio-ingress
        servicePort: 80
    EOF
    

    Este objeto Ingress envía todo el tráfico entrante al Service de Kubernetes istio-ingress en el espacio de nombres gke-system.

    Cuando creas un objeto Ingress de Kubernetes en un clúster de GKE, GKE crea los recursos necesarios para el balanceo de cargas de HTTP(S).

  2. Observa el progreso del comando anterior y espera hasta que my-ingress ADDRESS cambie a una dirección IP:

    kubectl get ingress my-ingress -n gke-system --watch
    

    Para dejar de esperar, presiona Control+C.

  3. Crea una variable de entorno para almacenar la dirección IP del objeto Ingress de Kubernetes de la siguiente manera:

    INGRESS_IP=$(kubectl get ingress my-ingress -n gke-system \
        --output jsonpath='{.status.loadBalancer.ingress[0].ip}')
    

Implementa un servicio y verifica la solución

  1. Implementa un servicio de muestra llamado my-service en Cloud Run for Anthos:

    gcloud run deploy my-service \
        --namespace default \
        --image gcr.io/knative-samples/simple-api \
        --platform gke \
        --cluster $CLUSTER \
        --cluster-location $ZONE
    

    Es posible que el balanceo de cargas de HTTP(S) tarde unos minutos en estar listo para enrutar el tráfico después de la creación del objeto Ingress de Kubernetes. Mientras tanto, puede que recibas errores, como HTTP/1.1 404 Not Found o HTTP/1.1 502 Bad Gateway, cuando envíes solicitudes a servicios en el clúster.

  2. Envía una solicitud GET HTTP al servicio de muestra cada dos segundos de la siguiente manera:

    while sleep 2; do
      curl -siH "Host: my-service.default.example.com" $INGRESS_IP | head -n1
    done
    

    Supervisa la salida hasta que veas el siguiente resultado:

    HTTP/1.1 200 OK
    

    Para dejar de enviar solicitudes, presiona Control+C.

  3. Envía una solicitud GET HTTP al servicio de muestra de la siguiente manera:

    curl -s -w"\n" -H "Host: my-service.default.example.com" $INGRESS_IP
    

    Este es el resultado:

    OK
    

Soluciona problemas

Si tienes problemas con este instructivo, revisa los documentos siguientes:

Realiza una limpieza

Para evitar que se apliquen cargos a tu Cuenta de Google Cloud por los recursos que se usaron en este instructivo, puedes borrar el proyecto de Cloud que creaste para este instructivo o borrar los recursos asociados con este instructivo.

Borra el proyecto de Cloud

La manera más fácil de quitar la facturación es borrar el proyecto de Cloud que creaste para el instructivo.

  1. En Cloud Console, ve a la página Administrar recursos.

    Ir a Administrar recursos

  2. En la lista de proyectos, elige el proyecto que quieres borrar y haz clic en Borrar.
  3. En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrar el proyecto.

Borra los recursos

Si deseas conservar el proyecto de Cloud que usaste en este instructivo, borra el clúster de GKE de la siguiente manera:

```
gcloud container clusters delete $CLUSTER --zone $ZONE --async --quiet
```

Próximos pasos