Ingress para balanceadores de carga de aplicación externos

En esta página se explica cómo funciona Ingress para balanceadores de carga de aplicaciones externos en Google Kubernetes Engine (GKE). También puedes consultar cómo configurar y usar Ingress para el balanceo de carga externo.

Para obtener información general sobre el uso del balanceo de carga en GKE, consulta Ingress para balanceadores de carga de aplicación externos.

La red de Google Kubernetes Engine (GKE) se basa en Cloud Load Balancing. Con Cloud Load Balancing, una sola dirección IP anycast permite que el enrutamiento determine la ruta de menor coste al balanceador de carga más cercano. Trusted Cloud

Compatibilidad con las funciones de Trusted Cloud

Puedes usar un BackendConfig para configurar un balanceador de carga de aplicación externo de forma que use funciones como las siguientes:

BackendConfig es un recurso personalizado que contiene información de configuración de lasTrusted Cloud funciones. Para obtener más información sobre las funciones admitidas, consulta Configuración de Ingress.

Compatibilidad con WebSocket

Con los balanceadores de carga de aplicaciones externos, el protocolo WebSocket funciona sin necesidad de configuración.

Si tienes intención de usar el protocolo WebSocket, te recomendamos que uses un valor de tiempo de espera superior a los 30 segundos predeterminados. En el caso del tráfico de WebSocket enviado a través de un balanceador de carga de aplicaciones externoTrusted Cloud , el tiempo de espera del servicio de backend se interpreta como el tiempo máximo que puede permanecer abierta una conexión WebSocket, tanto si está inactiva como si no.

Para definir el valor de tiempo de espera de un servicio de backend configurado mediante Ingress, crea un objeto BackendConfig y usa la anotación beta.cloud.google.com/backend-config en el manifiesto de tu servicio.

Para obtener información sobre la configuración, consulta Tiempo de espera de la respuesta del backend.

Direcciones IP estáticas para balanceadores de carga HTTPS

Cuando creas un objeto Ingress, obtienes una dirección IP externa estable que los clientes pueden usar para acceder a tus servicios y, a su vez, a tus contenedores en ejecución. La dirección IP es estable, ya que dura todo el ciclo de vida del objeto Ingress. Si eliminas tu Ingress y creas uno nuevo a partir del mismo archivo de manifiesto, no se te garantiza que obtengas la misma dirección IP externa.

Si quieres una dirección IP permanente que no cambie al eliminar tu Ingress y crear uno nuevo, debes reservar una dirección IP externa estática global. A continuación, en el manifiesto de Ingress, incluye una anotación que indique el nombre de tu dirección IP estática reservada. Si modificas un Ingress para que use una dirección IP estática en lugar de una efímera, es posible que GKE cambie la dirección IP del balanceador de carga cuando vuelva a crear la regla de reenvío del balanceador de carga.

Por ejemplo, supongamos que has reservado una dirección IP externa estática global llamada my-static-address. En el archivo de manifiesto de Ingress, incluye una anotación kubernetes.io/ingress.global-static-ip-name como se muestra a continuación:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    kubernetes.io/ingress.global-static-ip-name: my-static-address

Configurar HTTPS (TLS) entre el cliente y el balanceador de carga

Un balanceador de carga HTTP(S) actúa como proxy entre tus clientes y tu aplicación. Si quieres aceptar solicitudes HTTPS de tus clientes, el balanceador de carga debe tener un certificado para poder demostrar su identidad a tus clientes. El balanceador de carga también debe tener una clave privada para completar el handshake de HTTPS.

Cuando el balanceador de carga acepta una solicitud HTTPS de un cliente, el tráfico entre el cliente y el balanceador de carga se cifra mediante TLS. Sin embargo, el balanceador de carga finaliza el cifrado TLS y reenvía la solicitud sin cifrar a la aplicación. Para obtener información sobre cómo cifrar el tráfico entre el balanceador de carga y tu aplicación, consulta HTTPS entre el balanceador de carga y tu aplicación.

Puedes usar certificados SSL gestionados por Google o certificados que gestiones tú mismo. Para obtener más información sobre cómo crear un objeto Ingress que use certificados gestionados por Google, consulta Usar certificados SSL gestionados por Google.

Para proporcionar a un balanceador de carga HTTP(S) un certificado y una clave que hayas creado, crea un objeto Secret de Kubernetes. El secreto contiene el certificado y la clave. Añade el secreto al campo tls del archivo de manifiesto Ingress, como en el ejemplo siguiente:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress-2
spec:
  tls:
  - secretName: SECRET_NAME
  rules:
  - http:
      paths:
      - path: /*
        pathType: ImplementationSpecific
        backend:
          service:
            name: SERVICE_NAME
            port:
              number: 60000

Este archivo de manifiesto incluye los siguientes valores:

  • SECRET_NAME: el nombre del secreto que has creado.
  • SERVICE_NAME: el nombre de tu servicio de backend.

Los cambios en los secretos se recogen periódicamente, por lo que, si modificas los datos de un secreto, esos cambios tardarán un máximo de 10 minutos en aplicarse al balanceador de carga.

Para obtener más información, consulta Usar varios certificados SSL en el balanceo de carga HTTPS con Ingress.

Para proteger el tráfico de entrada cifrado con HTTPS de tus clústeres de GKE, consulta el ejemplo de entrada segura.

Inhabilitar HTTP

Si quieres que todo el tráfico entre el cliente y el balanceador de carga HTTP(S) use HTTPS, puedes inhabilitar HTTP incluyendo la anotación kubernetes.io/ingress.allow-http en tu manifiesto de Ingress. Asigna el valor "false" a la anotación.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress-2
  annotations:
    kubernetes.io/ingress.allow-http: "false"
spec:
  tls:
  - secretName: SECRET_NAME
  ...

Este manifiesto incluye el SECRET_NAME, que es el nombre del secreto que has creado.

Certificados precompartidos para balanceadores de carga

Como alternativa a los secretos de Kubernetes para proporcionar certificados al balanceador de carga para la terminación de HTTP(S), puedes usar certificados que hayas subido previamente a tu Trusted Cloud proyecto. Para obtener más información, consulta Usar certificados precompartidos y Usar varios certificados SSL en el balanceo de carga HTTPS con Ingress.

HTTPS (TLS) entre el balanceador de carga y tu aplicación

Un balanceador de carga HTTP(S) actúa como proxy entre tus clientes y tu aplicación. Los clientes pueden usar HTTP o HTTPS para comunicarse con el proxy del balanceador de carga. La conexión del proxy del balanceador de carga a tu aplicación usa HTTP de forma predeterminada. Sin embargo, si tu aplicación, que se ejecuta en un pod de GKE, puede recibir solicitudes HTTPS, puedes configurar el balanceador de carga para que use HTTPS cuando reenvíe solicitudes a tu aplicación.

Para configurar el protocolo que se usa entre el balanceador de carga y tu aplicación, usa la anotación cloud.google.com/app-protocols en el manifiesto de tu servicio. Este manifiesto de servicio debe incluir type: NodePort, a menos que uses el balanceo de carga nativo de contenedores. Si usas el balanceo de carga nativo de contenedores, usa type: ClusterIP.

El siguiente manifiesto de Service especifica dos puertos. La anotación indica que, cuando un balanceador de carga HTTP(S) tiene como destino el puerto 80 del servicio, debe usar HTTP. Además, cuando el balanceador de carga se dirija al puerto 443 del servicio, deberá usar HTTPS.

El manifiesto de servicio debe incluir un valor name en la anotación de puerto. Solo puedes editar el puerto de servicio haciendo referencia a su name asignado, no a su valor targetPort.

apiVersion: v1
kind: Service
metadata:
  name: my-service-3
  annotations:
    cloud.google.com/app-protocols: '{"my-https-port":"HTTPS","my-http-port":"HTTP"}'
spec:
  type: NodePort
  selector:
    app: metrics
    department: sales
  ports:
  - name: my-https-port
    port: 443
    targetPort: 8443
  - name: my-http-port
    port: 80
    targetPort: 50001

Siguientes pasos