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

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 características de Google Cloud, como Google Cloud Armor, Cloud CDN, Identity-Aware Proxy (IAP) y 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 siguientes distinciones:

  • 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 Servicio de Kubernetes y una Implementación de Kubernetes.
  • Ingress de Kubernetes 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 Ingress de Kubernetes en un clúster de GKE, GKE aprovisiona los recursos necesarios para el balanceo de cargas de HTTP(S).

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

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 que tenga Cloud Run habilitado.
  • Crea un servicio virtual de Istio para controlar las solicitudes de verificación de estado.
  • Modifica el objeto del Servicio de Kubernetes de la puerta de enlace de entrada de Istio para que un objeto Ingress de Kubernetes pueda exponerlo.
  • Configura el balanceo de cargas de HTTP(S) mediante la creación de un objeto Ingress de Kubernetes.
  • 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 GKE, Cloud Run, and Google Cloud las API necesarias.

    Habilita 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 tomar 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 mediante el complemento de Cloud Run:

    CLUSTER=cloudrun-gke-gclb-tutorial
        ZONE=us-central1-f
    
        gcloud beta container clusters create $CLUSTER \
            --addons HorizontalPodAutoscaling,HttpLoadBalancing,CloudRun \
            --enable-ip-alias \
            --enable-stackdriver-kubernetes \
            --machine-type n1-standard-2 \
            --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 Kubernetes Engine Monitoring. 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 de la siguiente manera:

    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
        

    Como se puede ver en el fragmento de código, el servicio virtual que acabas de crear está conectado al recurso gke-system-gateway de la puerta de enlace de Istio, que se instaló mediante el complemento de Cloud Run.

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

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

    cat <<EOF > istio-ingress-patch.json
        [
          {
            "op": "add",
            "path": "/metadata/annotations/cloud.google.com~1neg",
            "value": "{\"ingress\": true}"
          },
          {
            "op": "replace",
            "path": "/spec/type",
            "value": "NodePort"
          },
          {
            "op": "remove",
            "path": "/status"
          }
        ]
        EOF
        
  2. Aplica el siguiente archivo de parche:

    kubectl -n gke-system patch svc istio-ingress \
            --type=json -p="$(cat istio-ingress-patch.json)" \
            --dry-run=true -o yaml | kubectl apply -f -
        

    Este parche realiza los siguientes cambios 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 Servicio 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 en Google Cloud de la siguiente manera:

    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 siguientes documentos:

Realiza una limpieza

Si quieres evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos que usaste en este instructivo, puedes borrar el proyecto de Cloud que creaste para este instructivo o borrar los recursos asociados a él.

Borra el proyecto de Cloud

La manera más fácil de eliminar 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 la página Administrar recursos

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

Borrar 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