Configurar el balanceo de cargas de HTTP(S) interno para las VM de Compute Engine

En este documento, se proporcionan instrucciones para configurar el balanceo de cargas HTTP(S) interno para los servicios que se ejecutan en las VM de Compute Engine.

Antes de comenzar

Antes de seguir las instrucciones de esta guía, revisa los siguientes documentos:

Configura el balanceo de cargas HTTP(S) interno con un servicio basado en VM

En esta sección, se muestra la configuración que se requiere para los servicios que se ejecutan en las VM de Compute Engine. Las VM cliente se conectan a la dirección IP y al puerto que configuras en la regla de reenvío. Cuando las aplicaciones cliente envían tráfico a esta dirección IP y al puerto, sus solicitudes se reenvían a tus máquinas virtuales (VM) de backend según el mapa de URL del balanceador de cargas HTTP(S) interno.

El ejemplo en esta página configura de manera explícita una dirección IP interna reservada para la regla de reenvío del balanceador de cargas HTTP(S) interno, en lugar de permitir que se asigne una dirección IP interna efímera. Recomendamos reservar direcciones IP para las reglas de reenvío.

Para la dirección IP de la regla de reenvío, usa backend-subnet. Si intentas usar la subred de solo proxy, la creación de la regla de reenvío fallará.

Crea un grupo de instancias administrado

En esta sección, se muestra cómo crear una plantilla y un grupo de instancias administrado. El grupo de instancias administrado proporciona instancias de VM que ejecutan los servidores de backend de un balanceador de cargas HTTP(S) interno de ejemplo. Las cargas del tráfico de los clientes se balancean a estos servidores de backend. A modo de demostración, los backends entregan sus propios nombres de host.

Console

  1. En Cloud Console, ve a la página Grupos de instancias.

    Ir a la página Grupos de instancias

  2. Haz clic en Crear grupo de instancias.
  3. Selecciona Nuevo grupo de instancias administrado a la izquierda.
  4. En Nombre, ingresa l7-ilb-backend-example.
  5. En Ubicación, selecciona Zona única.
  6. En Región, selecciona us-west1.
  7. En Zona, selecciona us-west1-a.
  8. En Plantilla de instancias, selecciona Crear una nueva plantilla de instancias.

    1. En Nombre, ingresa l7-ilb-backend-template.
    2. Asegúrate de que el disco de arranque esté configurado en una imagen de Debian, como Debian GNU/Linux 9 (Stretch). En estas instrucciones, se usan comandos que solo están disponibles en Debian, como apt-get.
    3. En Administración, seguridad, discos, herramientas de redes, instancia única, en la pestaña Administración, inserta la siguiente secuencia de comandos en el campo Secuencia de comandos de inicio.

      #! /bin/bash
      apt-get update
      apt-get install apache2 -y
      a2ensite default-ssl
      a2enmod ssl
      vm_hostname="$(curl -H "Metadata-Flavor:Google" \
      http://169.254.169.254/computeMetadata/v1/instance/name)"
      echo "Page served from: $vm_hostname" | \
      tee /var/www/html/index.html
      systemctl restart apache2'
      
    4. En Herramientas de redes, selecciona lb-network como la Red y, para la Subred, selecciona backend-subnet.

    5. Agrega las siguientes etiquetas de red: allow-ssh y load-balanced-backend.

    6. Haz clic en Guardar y continuar.

  9. Especifica la cantidad de instancias que deseas crear en el grupo.

    Para este ejemplo, en Modo de ajuste de escala automático, puedes seleccionar las siguientes opciones:

    • No configurar el ajuste de escala automático
    • En Cantidad de instancias, ingresa 2.

    De manera opcional, en la sección de Ajuste de escala automático de la IU, puedes configurar el grupo de instancias para que agregue o quite instancias automáticamente en función del uso de CPU de la instancia.

  10. Haz clic en Crear para crear el grupo de instancias nuevo.

gcloud

En las instrucciones de gcloud que se incluyen en esta guía, se supone que usas Cloud Shell o algún otro entorno con bash instalado.

  1. Crea una plantilla de instancias de VM con el servidor HTTP con el comando gcloud compute instance-templates create.

    gcloud compute instance-templates create l7-ilb-backend-template \
    --region=us-west1 \
    --network=lb-network \
    --subnet=backend-subnet \
    --tags=allow-ssh,load-balanced-backend \
    --image-family=debian-9 \
    --image-project=debian-cloud \
    --metadata=startup-script='#! /bin/bash
    apt-get update
    apt-get install apache2 -y
    a2ensite default-ssl
    a2enmod ssl
    vm_hostname="$(curl -H "Metadata-Flavor:Google" \
    http://169.254.169.254/computeMetadata/v1/instance/name)"
    echo "Page served from: $vm_hostname" | \
    tee /var/www/html/index.html
    systemctl restart apache2'
    
  2. Crea un grupo de instancias administrado en la zona con el comando gcloud compute instance-groups managed create.

    gcloud compute instance-groups managed create l7-ilb-backend-example \
        --zone=us-west1-a \
        --size=2 \
        --template=l7-ilb-backend-template
    

api

Crea la plantilla de instancias con el método instanceTemplates.insert y reemplaza [project-id] por el ID de tu proyecto.

POST https://www.googleapis.com/compute/v1/projects/[project-id]/global/instanceTemplates
{
  "name":"l7-ilb-backend-template",
  "properties":{
     "machineType":"n1-standard-1",
     "tags":{
        "items":[
           "allow-ssh",
           "load-balanced-backend"
        ]
     },
     "metadata":{
        "kind":"compute#metadata",
        "items":[
          {
              "key":"startup-script",
              "value":"#! /bin/bash\napt-get update\napt-get install apache2 -y\na2ensite default-ssl\na2enmod ssl\nvm_hostname=\"$(curl -H \"Metadata-Flavor:Google\" \\\nhttp://169.254.169.254/computeMetadata/v1/instance/name)\"\necho \"Page served from: $vm_hostname\" | \\\ntee /var/www/html/index.html\nsystemctl restart apache2"
          }
        ]
     },
     "networkInterfaces":[
       {
           "network":"projects/[project-id]/global/networks/lb-network",
           "subnetwork":"regions/us-west1/subnetworks/backend-subnet",
           "accessConfigs":[
             {
                 "type":"ONE_TO_ONE_NAT"
             }
           ]
       }
     ],
     "disks":[
       {
           "index":0,
           "boot":true,
           "initializeParams":{
              "sourceImage":"projects/debian-cloud/global/images/family/debian-9"
           },
           "autoDelete":true
       }
     ]
  }
}

Crea un grupo de instancias administrado en cada zona con el método instanceGroupManagers.insert y reemplaza [project-id] por el ID del proyecto.

POST https://www.googleapis.com/compute/v1/projects/[project-id]/zones/{zone}/instanceGroupManagers
{
  "name": "l7-ilb-backend-example",
  "zone": "projects/[project-id]/zones/us-west1-a",
  "instanceTemplate": "projects/[project-id]/global/instanceTemplates/l7-ilb-backend-template",
  "baseInstanceName": "l7-ilb-backend-example",
  "targetSize": 2
}

Configura el balanceador de cargas

En este ejemplo, se muestra cómo crear los siguientes recursos del balanceador de cargas de HTTP(S) interno:

  • Verificación de estado de HTTP
  • Servicio de backend con un grupo de instancias administrado como backend
  • Un mapa de URL
    • Asegúrate de hacer referencia a un mapa de URL regional si se define una región para el proxy HTTP(S) de destino. Un mapa de URL regional enruta las solicitudes a un servicio de backend regional en función de las reglas que definas para el host y la ruta de acceso de una URL entrante. Solo se puede hacer referencia a un mapa de URL regional mediante una regla regional de proxy de destino en la misma región.
  • Certificado SSL (para HTTPS)
  • Proxy de destino
  • Regla de reenvío

Para la dirección IP de la regla de reenvío, usa backend-subnet. Si intentas usar la subred de solo proxy, la creación de la regla de reenvío fallará.

Console

Selecciona un tipo de balanceador de cargas

  1. Ve a la página Balanceo de cargas en Google Cloud Console.
    Ir a la página Balanceo de cargas
  2. En Balanceo de cargas de HTTP(S), haga clic en Iniciar configuración.
  3. Selecciona Solo entre mis VM. Esta configuración indica que el balanceador de cargas es interno.
  4. Haga clic en Continue.

Prepara el balanceador de cargas

  1. Para el Nombre del balanceador de cargas, ingresa l7-ilb-map.
  2. En Región, selecciona us-west1.
  3. En Red, selecciona lb-network.
  4. Mantén la ventana abierta para continuar.

Reserva una subred de solo proxy

Para el balanceo de cargas interno HTTP(S), reserva una subred de proxy:

  1. Haz clic en Reservar una subred.
  2. En Nombre, ingresa proxy-only-subnet.
  3. En el Rango de direcciones IP, ingresa 10.129.0.0/23.
  4. Haz clic en Agregar.

Configura el servicio de backend

  1. Haz clic en Configuración de backend.
  2. En el menú Crear o seleccionar servicios de backend, selecciona Crear un servicio de backend.
  3. Configura el Nombre del servicio de backend como l7-ilb-backend-service.
  4. Configura el Tipo de backend como grupos de instancias.
  5. En la sección Nuevo backend, sigue estos pasos:
    1. Establece el campo Grupo de instancias en l7-ilb-backend-example.
    2. Establece el campo Números de puerto en 80.
    3. Establece el campo Modo de balanceo en Uso.
    4. Haga clic en Listo.
  6. En la sección Verificación de estado, elige Crea una verificación de estado con los parámetros siguientes:
    1. Nombre: l7-ilb-basic-check
    2. Protocolo: HTTP
    3. Puerto: 80
    4. Haz clic en Guardar y continuar.
  7. Haz clic en Crear.

Configura el mapa de URL

Haz clic en Reglas de host y ruta de acceso. Asegúrate de que l7-ilb-backend-service sea el único servicio de backend para cualquier host y ruta de acceso no coincidentes.

Para obtener información sobre la administración del tráfico, consulta Configura la administración del tráfico.

Configura el frontend

Para HTTP:

  1. Haz clic en Configuración de frontend.
  2. Haz clic en Agregar IP y puerto de frontend.
  3. Configura el Nombre como l7-ilb-forwarding-rule.
  4. Establece el Protocolo en HTTP.
  5. Establece la Subred en backend-subnet.
  6. En IP interna, selecciona Reservar una dirección IP interna y estática.
  7. En el panel que aparece, proporciona los siguientes detalles:
    1. Nombre: l7-ilb-ip
    2. En la sección Dirección IP estática, selecciona Permitirme elegir.
    3. En la sección Dirección IP personalizada, ingresa 10.1.2.99.
    4. Haz clic en Reservar.
  8. Establece el Puerto en 80.
  9. Haz clic en Listo.

Para HTTPS:

Si usas HTTPS entre el cliente y el balanceador de cargas, necesitas uno o más recursos de certificado SSL para configurar el proxy. Consulta la página sobre los certificados SSL para obtener información sobre cómo crear recursos de certificados SSL. Por el momento, los certificados administrados por Google no son compatibles con los balanceadores de cargas de HTTP(S) internos.

  1. Haga clic en Configuración de frontend.
  2. Haz clic en Agregar IP y puerto de frontend.
  3. En el campo Nombre, ingresa l7-ilb-forwarding-rule.
  4. En el campo Protocolo, selecciona HTTPS (includes HTTP/2).
  5. Establece la Subred en backend-subnet.
  6. En IP interna, selecciona Reservar una dirección IP interna y estática.
  7. En el panel que aparece, proporciona los siguientes detalles:
    1. Nombre: l7-ilb-ip
    2. En la sección Dirección IP estática, selecciona Permitirme elegir.
    3. En la sección Dirección IP personalizada, ingresa 10.1.2.99.
    4. Haz clic en Reservar.
  8. Asegúrate de que el Puerto esté establecido en 443 para permitir el tráfico HTTPS.
  9. Haz clic en la lista desplegable Certificado.
  10. Si ya tienes un recurso de certificado SSL autoadministrado que deseas usar como certificado SSL principal, selecciónalo en el menú desplegable.
  11. De lo contrario, selecciona Crear un nuevo certificado.
  12. Completa un Nombre de l7-ilb-cert.
  13. En los campos correspondientes, sube los archivos con formato PEM:
    • Certificado de clave pública
    • Cadena de certificado
    • Clave privada
  14. Haga clic en Crear.
  • Para agregar otros recursos de certificado además del recurso de certificado SSL principal, haz lo siguiente:
    1. Haz clic en Agregar certificado.
    2. Selecciona un certificado de la lista Certificados o haz clic en Crear un certificado nuevo y sigue las instrucciones anteriores.
  • Haga clic en Listo.
  • Completa la configuración

    Haz clic en Crear.

    gcloud

    1. Define la verificación de estado de HTTP con el comando gcloud compute health-check create http.

      gcloud compute health-checks create http l7-ilb-basic-check \
         --region=us-west1 \
         --use-serving-port
      
    2. Define el servicio de backend con el comando gcloud compute backend-services create.

      gcloud compute backend-services create l7-ilb-backend-service \
        --load-balancing-scheme=INTERNAL_MANAGED \
        --protocol=HTTP \
        --health-checks=l7-ilb-basic-check \
        --health-checks-region=us-west1 \
        --region=us-west1
      
    3. Agrega backends al servicio de backend con el comando gcloud compute backend-services add-backend.

      gcloud compute backend-services add-backend l7-ilb-backend-service \
        --balancing-mode=UTILIZATION \
        --instance-group=l7-ilb-backend-example \
        --instance-group-zone=us-west1-a \
        --region=us-west1
      
    4. Crea el mapa de URL con el comando gcloud compute url-maps create.

      gcloud compute url-maps create l7-ilb-map \
        --default-service=l7-ilb-backend-service \
        --region=us-west1
      
    5. Crea el proxy de destino.

      Para HTTP:

      Para un balanceador de cargas de HTTP interno, crea el proxy de destino mediante el comando gcloud compute target-http-proxies create.

      gcloud compute target-http-proxies create l7-ilb-proxy \
        --url-map=l7-ilb-map \
        --url-map-region=us-west1 \
        --region=us-west1
      

      Para HTTPS:

      Consulta la página sobre los certificados SSL para obtener información sobre cómo crear recursos de certificados SSL. Por el momento, los certificados administrados por Google no son compatibles con los balanceadores de cargas de HTTP(S) internos.

      Asigna tus rutas de archivos a nombres de variables.

      export LB_CERT=path to PEM-formatted file
      
      export LB_PRIVATE_KEY=path to PEM-formatted file
      

      Crea un certificado SSL regional mediante el comando gcloud compute ssl-certificates create.

      gcloud compute ssl-certificates create l7-ilb-cert \
        --certificate=$LB_CERT \
        --private-key=$LB_PRIVATE_KEY \
        --region=us-west1
      

      Usa el certificado SSL regional para crear un proxy de destino mediante el comando gcloud compute target-https-proxies create.

      gcloud compute target-https-proxies create

      gcloud compute target-https-proxies create l7-ilb-proxy \
        --url-map=l7-ilb-map \
        --region=us-west1 \
        --ssl-certificates=l7-ilb-cert
      
    6. Crea la regla de reenvío.

      Para redes personalizadas, debes hacer referencia a la subred en la regla de reenvío. Ten en cuenta que esta es la subred de VM, no la subred de proxy.

      Para HTTP:

      Usa el comando gcloud compute forwarding-rules create con las marcas correctas.

      gcloud compute forwarding-rules create l7-ilb-forwarding-rule \
        --load-balancing-scheme=INTERNAL_MANAGED \
        --network=lb-network \
        --subnet=backend-subnet \
        --address=10.1.2.99 \
        --ports=80 \
        --region=us-west1 \
        --target-http-proxy=l7-ilb-proxy \
        --target-http-proxy-region=us-west1
      

      Para HTTPS:

      Crea la regla de reenvío mediante el comando gcloud compute forwarding-rules create con las marcas correctas.

      gcloud compute forwarding-rules create l7-ilb-forwarding-rule \
        --load-balancing-scheme=INTERNAL_MANAGED \
        --network=lb-network \
        --subnet=backend-subnet \
        --address=10.1.2.99 \
        --ports=443 \
        --region=us-west1 \
        --target-https-proxy=l7-ilb-proxy \
        --target-https-proxy-region=us-west1
      

    api

    Para crear la verificación de estado, realiza una solicitud POST al método regionHealthChecks.insert y reemplaza [project-id] por el ID del proyecto.

    POST https://compute.googleapis.com/compute/v1/projects/[project-id]/regions/{region}/healthChecks
    {
      "name": "l7-ilb-basic-check",
      "type": "HTTP",
      "httpHealthCheck": {
        "portSpecification": "USE_SERVING_PORT"
      }
    }
    

    Para crear el servicio de backend regional, realiza una solicitud POST al método regionBackendServices.insert y reemplaza [project-id] por el ID del proyecto.

    POST https://www.googleapis.com/compute/v1/projects/[project-id]/regions/us-west1/backendServices
    {
      "name": "l7-ilb-backend-service",
      "backends": [
        {
          "group": "projects/[project-id]/zones/us-west1-a/instanceGroups/l7-ilb-backend-example",
          "balancingMode": "UTILIZATION"
        }
      ],
      "healthChecks": [
        "projects/[project-id]/regions/us-west1/healthChecks/l7-ilb-basic-check"
      ],
      "loadBalancingScheme": "INTERNAL_MANAGED"
    }
    

    Para crear el mapa de URL, realiza una solicitud POST al método regionUrlMaps.insert y reemplaza [project-id] por el ID del proyecto.

    POST https://compute.googleapis.com/compute/v1/projects/[project-id]/regions/us-west1/urlMaps
    {
      "name": "l7-ilb-map",
      "defaultService": "projects/[project-id]/regions/us-west1/backendServices/l7-ilb-backend-service"
    }
    

    Para crear el proxy HTTP de destino, realiza una solicitud POST al método regionTargetHttpProxies.insert y reemplaza [project-id] por el ID del proyecto.

    POST https://www.googleapis.com/compute/v1/projects/[project-id]/regions/us-west1/targetHttpProxy
    {
      "name": "l7-ilb-proxy",
      "urlMap": "projects/[project-id]/global/urlMaps/l7-ilb-map",
      "region": "us-west1"
    }
    

    Para crear la regla de reenvío, realiza una solicitud POST al método forwardingRules.insert y reemplaza [project-id] por el ID del proyecto.

    POST https://www.googleapis.com/compute/v1/projects/[project-id]/regions/us-west1/forwardingRules
    {
      "name": "l7-ilb-forwarding-rule",
      "IPAddress": "10.1.2.99",
      "IPProtocol": "TCP",
      "portRange": "80-80",
      "target": "projects/[project-id]/regions/us-west1/targetHttpProxies/l7-ilb-proxy",
      "loadBalancingScheme": "INTERNAL_MANAGED",
      "subnetwork": "projects/[project-id]/regions/us-west1/subnetworks/backend-subnet",
      "network": "projects/[project-id]/global/networks/lb-network",
      "networkTier": "PREMIUM",
    }
    

    Prueba

    Crea una instancia de VM para probar la conectividad

    gcloud compute instances create l7-ilb-client-us-west1-a \
        --image-family=debian-9 \
        --image-project=debian-cloud \
        --network=lb-network \
        --subnet=backend-subnet \
        --zone=us-west1-a \
        --tags=allow-ssh
    

    Prueba el balanceador de cargas

    Accede a la instancia que acabas de crear y prueba que los servicios HTTP(S) en los backends sean accesibles a través de la dirección IP de la regla de reenvío del balanceador de cargas HTTP(S) interno y que las cargas del tráfico se balanceen en las instancias de backend.

    Conecta mediante SSH a cada instancia de cliente

    gcloud compute ssh l7-ilb-client-us-west1-a \
        --zone=us-west1-a
    

    Verifica que la IP entregue su nombre de host

    curl 10.1.2.99
    

    Para la prueba de HTTPS, reemplaza curl por lo siguiente:

    curl -k -s 'https://test.example.com:443' --connect-to test.example.com:443:10.1.2.99:443
    

    La marca -k hace que curl omita la validación del certificado.

    Ejecuta 100 solicitudes y confirma que sus cargas estén balanceadas

    Para HTTP:

    {
      RESULTS=
      for i in {1..100}
      do
          RESULTS="$RESULTS:$(curl --silent 10.1.2.99)"
      done
      echo "***"
      echo "*** Results of load-balancing to 10.1.2.99: "
      echo "***"
      echo "$RESULTS" | tr ':' '\n' | grep -Ev "^$" | sort | uniq -c
      echo
    }
    

    Para HTTPS:

    {
      RESULTS=
      for i in {1..100}
      do
          RESULTS="$RESULTS:$(curl -k -s 'https://test.example.com:443' --connect-to test.example.com:443:10.1.2.99:443)"
      done
      echo "***"
      echo "*** Results of load-balancing to 10.1.2.99: "
      echo "***"
      echo "$RESULTS" | tr ':' '\n' | grep -Ev "^$" | sort | uniq -c
      echo
    }
    

    Opciones de configuración adicionales

    En esta sección, se expande el ejemplo de configuración para proporcionar opciones de configuración alternativas y adicionales. Todas las tareas son opcionales. Puedes realizarlas en cualquier orden.

    Habilita la afinidad de sesión

    Estos procedimientos muestran cómo actualizar un servicio de backend para el balanceador de cargas HTTP(S) interno de ejemplo a fin de que el servicio de backend use afinidad de cookie generada, afinidad de campo de encabezado o afinidad de cookie HTTP.

    Cuando se habilita la afinidad de cookie generada, el balanceador de cargas emite una cookie en la primera solicitud. Para cada solicitud posterior con la misma cookie, el balanceador de cargas dirige la solicitud a la misma VM o extremo de backend. Para los balanceadores de cargas HTTP(S) internos, la cookie se llama GCILB.

    Cuando se habilita la afinidad de campo de encabezado, el balanceador de cargas enruta solicitudes a VM o extremos de backend en un NEG según el valor del encabezado HTTP que se indica en la marca --custom-request-header. La afinidad de campo de encabezado solo es válida si la política de localidad de balanceo de cargas es RING_HASH o MAGLEV y el hash coherente del servicio de backend especifica el nombre del encabezado HTTP.

    Cuando la afinidad de cookie HTTP está habilitada, el balanceador de cargas enruta solicitudes a extremos o VM de backend en un NEG, según una cookie HTTP en la marca HTTP_COOKIE con la marca opcional --affinity-cookie-ttl. Si el cliente no proporciona la cookie en su solicitud HTTP, el proxy genera la cookie y la muestra al cliente en un encabezado Set-Cookie. La afinidad de cookie HTTP solo es válida si la política de localidad de balanceo de cargas es RING_HASH o MAGLEV y el hash coherente del servicio de backend especifica la cookie HTTP.

    Console

    Para habilitar o cambiar la afinidad de sesión de un servicio de backend:

    1. Ve a la página Balanceo de cargas en Google Cloud Console.
      Ir a la página Balanceo de cargas
    2. Haz clic en Backends.
    3. Haz clic en l7-ilb-backend-service (el nombre del servicio de backend que creaste para este ejemplo) y haz clic en Editar.
    4. En la página Detalles del servicio de backend, haz clic en Configuración avanzada.
    5. En Afinidad de sesión, selecciona el tipo de afinidad de sesión que desees en el menú.
    6. Haz clic en Actualizar.

    gcloud

    Usa los siguientes comandos de gcloud para actualizar el servicio de backend de l7-ilb-backend-service a diferentes tipos de afinidad de sesión:

    gcloud compute backend-services update l7-ilb-backend-service \
        --session-affinity=[GENERATED_COOKIE | HEADER_FIELD | HTTP_COOKIE | CLIENT_IP]
        --region=us-west1
    

    API

    Para configurar la afinidad de sesión, realiza una solicitud PATCH al método regionBackendServices/patch.

    PATCH https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-west1/regionBackendServices/l7-ilb-backend-service
    {
      "sessionAffinity": ["GENERATED_COOKIE" | "HEADER_FIELD" | "HTTP_COOKIE" | "CLIENT_IP" ]
    }
    

    Qué sigue