Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

GKE Gateway API y Service Extensions: tu nuevo kit para resolver desafíos complejos de tráfico en…

By Chimbu ChinnaduraiAug 12, 20258 min read

Esta página también está disponible en English, Deutsch, Français, Italiano, 日本語 y Português.

Kubernetes transformó la orquestación de contenedores y Google Kubernetes Engine (GKE) ofrece una plataforma gestionada y potente para desplegar y escalar aplicaciones en contenedores. Si bien GKE cuenta con sólidas capacidades de descubrimiento de servicios y balanceo de carga, todavía existen limitaciones a la hora de aplicar lógica de procesamiento personalizada al tráfico antes de que llegue a los workloads.

Aquí es donde entran en juego las Service Extensions, que ofrecen una solución muy interesante para personalizar y enriquecer Cloud Load Balancing junto con la GKE Gateway API (Nota: se trata de una funcionalidad de Kubernetes y no tiene relación con el servicio API Gateway de Google Cloud).

¿Qué son las Service Extensions en GCP?

Las Service Extensions permiten inyectar lógica personalizada directamente en la ruta de datos, habilitando modificaciones avanzadas al tráfico que pasa por el balanceador de carga. Funciona como un pipeline en el que puedes insertar tu propio código en distintas etapas para manipular las solicitudes y respuestas sin afectar a los backends.

Existen dos tipos principales de Service Extensions:

  • Plugins: permiten insertar código personalizado en línea, directamente dentro de la ruta de datos de red. Construidos con WebAssembly (Wasm) y la ABI Proxy-Wasm, los plugins se ejecutan como módulos Wasm sobre una infraestructura sandbox gestionada por Google. Están diseñados para operaciones de baja latencia y son ideales para lógica liviana que necesita ejecutarse muy cerca del data plane.

  • Callouts: permiten que Cloud Load Balancing realice llamadas gRPC a servicios externos, ya sean gestionados por Google o por el usuario (incluidos los que se ejecutan en Pods de GKE). Los callouts ofrecen mayor flexibilidad porque pueden reutilizar software existente y tienen menos restricciones en tiempo de ejecución, lo que los hace adecuados para lógica más compleja que requiera datos o estado externos.

El equipo de GKE anunció recientemente el soporte en preview para las Service Extensions en la Gateway API. Esto permite manipular encabezados HTTP y payloads tanto de solicitudes como de respuestas, e incluso controlar el enrutamiento del tráfico, todo sin afectar la selección de servicios backend ni las políticas de seguridad existentes.

Tipos de Service Extensions en GKE Gateway API

Actualmente, el controlador de GKE Gateway admite dos tipos de Service Extensions de tipo Callout, cada una diseñada para funcionalidades específicas:

  • GCPRoutingExtension: este tipo de extensión se enfoca en controlar el enrutamiento del tráfico. Es ideal para escenarios en los que necesitas dirigir el tráfico a distintos servicios backend o aplicar lógica de enrutamiento personalizada.

Cómo funciona GCPRoutingExtension con los Gateways

  • GCPTrafficExtension: este tipo de extensión te permite modificar los encabezados y payloads de solicitudes y respuestas. Funciona sin afectar la selección de servicios backend ni las políticas de seguridad, lo que la hace perfecta para la transformación y el enriquecimiento de datos.

Cómo funciona GCPTrafficExtension con los Gateways

Configurar Service Extensions en la GKE Gateway API

Para explorar la funcionalidad de Service Extensions en GKE necesitas un cluster de GKE con versión 1.33 o posterior y la Gateway API habilitada. Antes de probar esta funcionalidad, revisa también las restricciones y limitaciones actuales de las Gateway Service Extensions en GKE.

Desplegar un Gateway

Para configurar una Service Extension primero debes desplegar un recurso Gateway o verificar que el recurso Gateway existente use una GatewayClass compatible. Para más detalles sobre los balanceadores de carga compatibles, consulta Google Cloud Service Extension compatibility with GatewayClasses.

  • Aplica el siguiente manifiesto para desplegar un gateway sencillo de balanceador de carga de aplicación regional.
---
kind: Gateway
apiVersion: gateway.networking.k8s.io/v1beta1
metadata:
  name: gke-l7-regional-external-managed
spec:
  gatewayClassName: gke-l7-regional-external-managed
  listeners:
  - name: http
    protocol: HTTP
    port: 80

Desplegar una aplicación backend de tienda de ejemplo

  • Aplica el siguiente manifiesto para desplegar la aplicación backend de ejemplo y los recursos HTTPRoute. El HTTPRoute define el comportamiento de enrutamiento de las solicitudes HTTP desde un listener del Gateway hacia la aplicación backend.
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: store-v1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: store
      version: v1
  template:
    metadata:
      labels:
        app: store
        version: v1
    spec:
      containers:
      - name: whereami
        image: us-docker.pkg.dev/google-samples/containers/gke/whereami:v1.2.20
        ports:
          - containerPort: 8080
        env:
        - name: METADATA
          value: "store-v1"
---
apiVersion: v1
kind: Service
metadata:
  name: store-v1
spec:
  selector:
    app: store
    version: v1
  ports:
  - port: 8080
    targetPort: 8080
------
kind: HTTPRoute
apiVersion: gateway.networking.k8s.io/v1beta1
metadata:
  name: store
spec:
  parentRefs:
  - kind: Gateway
    name: gke-l7-regional-external-managed
  hostnames:
  - "store.example.com"
  rules:
  - backendRefs:
    - name: store-v1
      port: 8080
  • Envía una solicitud de ejemplo a la dirección IP de la Gateway API para probar la respuesta del backend.
curl http://store.example.com --resolve store.example.com:80:GATEWAY_IP_ADDRESS -v

La salida es similar a la siguiente:

{
  "cluster_name": "gateway-api-service-extensio-demo",
  "gce_instance_id": "2936941014208025864",
  "gce_service_account": "chimbuc-playground.svc.id.goog",
  "host_header": "store.example.com",
  "metadata": "store-v1",
  "pod_name": "store-v1-796c8ff75-mnssb",
  "pod_name_emoji": "🧑🏿‍⚖",
  "project_id": "chimbuc-playground",
  "timestamp": "2025-07-30T12:21:44",
  "zone": "us-central1-a"
}

Desplegar un servicio de callout backend

Un servicio de callout implementa la lógica personalizada para las Gateway Service Extensions en GKE. El balanceador de carga invoca a las aplicaciones backend según las configuraciones de GCPTrafficExtension o GCPRoutingExtension para modificar o enrutar el tráfico.

Si vas a desplegar un servicio de callout en el cluster de GKE, debes cumplir todos los requisitos descritos en las limitaciones.

  • Genera un certificado autofirmado para el backend del servicio de callout con mkcert u otro método. Esto es necesario porque debes usar HTTP2 como appProtocol, lo cual requiere TLS de extremo a extremo.
mkcert internal
  • Crea un Secret de K8S con el certificado autofirmado.
kubectl create secret tls extension-service-app-secret \
  --cert=internal.pem \
  --key=internal-key.pem
  • Aplica el siguiente manifiesto para desplegar la aplicación de callout de ejemplo. Para más ejemplos de código, consulta el repositorio de GitHub service-extensions.
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: extension-service-app
spec:
  selector:
    matchLabels:
      app: store
  replicas: 1
  template:
    metadata:
      labels:
        app: store
    spec:
      containers:
      - name: serviceextensions
        image: us-docker.pkg.dev/service-extensions-samples/callouts/python-example-basic:main
        ports:
        - containerPort: 8080
        - containerPort: 443
        volumeMounts:
        - name: certs
          mountPath: "/etc/certs/"
          readOnly: true
        env:
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: TLS_SERVER_CERT
          value: "/etc/certs/tls.crt"
        - name: TLS_SERVER_PRIVKEY
          value: "/etc/certs/tls.key"
        resources:
          requests:
            cpu: 10m
      volumes:
      - name: certs
        secret:
          secretName: "extension-service-app-secret"
          optional: false
---
apiVersion: v1
kind: Service
metadata:
  name: extension-service
spec:
  ports:
  - port: 443
    targetPort: 443
    appProtocol: HTTP2
  selector:
    app: store
  • La aplicación de ejemplo realiza una modificación básica de encabezados tanto en la solicitud como en la respuesta. Consulta service_callout_example.py para más detalles; a partir de ahí puedes desarrollar tu propia aplicación según los requisitos del negocio.

Configurar las Service Extensions

Puedes configurar un GCPRoutingExtension o un GCPTrafficExtension para personalizar tu flujo de tráfico.

  • Aplica el siguiente manifiesto para crear un recurso GCPRoutingExtension; el balanceador de carga llamará a la aplicación de extensión para las solicitudes enviadas a la ruta routeextension y luego las reenviará a la aplicación de tienda backend.
---
kind: GCPRoutingExtension
apiVersion: networking.gke.io/v1
metadata:
  name: my-gateway-extension
  namespace: default
spec:
  targetRefs:
  - group: "gateway.networking.k8s.io"
    kind: Gateway
    name: gke-l7-regional-external-managed
  extensionChains:
  - name: chain1
    matchCondition:
      celExpressions:
      - celMatcher: request.path.contains("routeextension")
    extensions:
    - name: routeextension
      authority: "store.example.com"
      timeout: 1s
      backendRef:
        group: ""
        kind: Service
        name: extension-service
        port: 443
  • Actualiza el recurso HTTPRoute con el host service-extensions.com, ya que el servicio de callout modifica el encabezado host antes de reenviar las solicitudes a la aplicación de tienda.
---
kind: HTTPRoute
apiVersion: gateway.networking.k8s.io/v1beta1
metadata:
  name: store
spec:
  parentRefs:
  - kind: Gateway
    name: gke-l7-regional-external-managed
  hostnames:
  - "store.example.com"
  - "service-extensions.com"
  rules:
  - backendRefs:
    - name: store-v1
      port: 8080
  • El controlador de Gateway API puede tardar unos minutos en sincronizar los cambios. Usa el comando kubectl describe gateway GATEWAY_NAME para confirmar que el GCPRoutingExtension esté vinculado al Gateway.
Name:         gke-l7-regional-external-managed
Namespace:    default
Labels:       <none>
Annotations:  networking.gke.io/addresses:
                /projects/269684357132/regions/us-central1/addresses/gkegw1-jorz-default-gke-l7-regional-external-manag-8wyhl317c00c
              networking.gke.io/backend-services:
                /projects/269684357132/regions/us-central1/backendServices/gkegw1-jorz-default-extension-service-443-e1aovl10z449, /projects/269684357132/...
              networking.gke.io/firewalls: /projects/269684357132/global/firewalls/gkegw1-jorz-l7-default-us-central1
              networking.gke.io/forwarding-rules:
                /projects/269684357132/regions/us-central1/forwardingRules/gkegw1-jorz-default-gke-l7-regional-external-manag-5s86aj5tzcoj
              networking.gke.io/health-checks:
                /projects/269684357132/regions/us-central1/healthChecks/gkegw1-jorz-default-extension-service-443-e1aovl10z449, /projects/269684357132/reg...
              networking.gke.io/last-reconcile-time: 2025-07-30T12:46:15Z
              networking.gke.io/lb-route-extensions:
                projects/269684357132/locations/us-central1/lbRouteExtensions/gkegw1-jorz-default-gke-l7-regional-external-manag-xivagz6clt0t
              networking.gke.io/lb-traffic-extensions:
                projects/269684357132/locations/us-central1/lbTrafficExtensions/gkegw1-jorz-default-gke-l7-regional-external-manag-lu8d7n5p4kbs
              networking.gke.io/ssl-certificates:
              networking.gke.io/target-http-proxies:
                /projects/269684357132/regions/us-central1/targetHttpProxies/gkegw1-jorz-default-gke-l7-regional-external-manag-kaecv0bs2nyx
              networking.gke.io/target-https-proxies:
              networking.gke.io/url-maps:
                /projects/269684357132/regions/us-central1/urlMaps/gkegw1-jorz-default-gke-l7-regional-external-manag-kaecv0bs2nyx
API Version:  gateway.networking.k8s.io/v1
Kind:         Gateway
Metadata:
  Creation Timestamp:  2025-07-30T07:45:42Z
  Finalizers:
    gateway.finalizer.networking.gke.io
  Generation:        1
  Resource Version:  1753879575407087021
...
  • La salida muestra las anotaciones que GKE utiliza para almacenar los vínculos entre el Gateway y los recursos subyacentes de Google Cloud. La anotación networking.gke.io/lb-route-extensions confirma la vinculación del gateway con el GCPRoutingExtension.
  • Ahora prueba el tráfico hacia la ruta routeextension reemplazando GATEWAY_IP_ADDRESS.
curl -v http://store.example.com/routeextension --resolve store.example.com:GATEWAY_IP_ADDRESS
  • La salida es similar a la siguiente; podrás notar los cambios en el host_header dentro de la respuesta.
{
  "cluster_name": "gateway-api-service-extensio-demo",
  "gce_instance_id": "2936941014208025864",
  "gce_service_account": "chimbuc-playground.svc.id.goog",
  "host_header": "service-extensions.com",
  "metadata": "store-v1",
  "pod_name": "store-v1-796c8ff75-mnssb",
  "pod_name_emoji": "🧑🏿‍⚖",
  "project_id": "chimbuc-playground",
  "timestamp": "2025-07-30T12:51:06",
  "zone": "us-central1-a"
}

Puedes usar GCPTrafficExtension para implementar lógica personalizada de solicitudes y respuestas, enrutamientos sofisticados, transformaciones y políticas de seguridad.

  • Aplica el siguiente manifiesto para crear un recurso GCPTrafficExtension; el balanceador de carga llamará a la aplicación de extensión para las solicitudes enviadas a la ruta trafficetension. Puedes personalizar y controlar la invocación del balanceador de carga hacia la aplicación de callout actualizando supportedEvents.
---
kind: GCPTrafficExtension
apiVersion: networking.gke.io/v1
metadata:
  name: my-traffic-extension
  namespace: default
spec:
  targetRefs:
  - group: "gateway.networking.k8s.io"
    kind: Gateway
    name: gke-l7-regional-external-managed
  extensionChains:
  - name: chain1
    matchCondition:
      celExpressions:
      - celMatcher: request.path.contains("trafficeextension")
    extensions:
    - name: trafficeextension
      authority: "store.example.com"
      timeout: 1s
      supportedEvents: ["RequestHeaders", "RequestBody", "ResponseHeaders", "ResponseBody", "RequestTrailers", "ResponseTrailers"]
      backendRef:
        group: ""
        kind: Service
        name: extension-service
        port: 443
  • Ahora prueba el tráfico hacia la ruta trafficextension reemplazando GATEWAT_IP_ADDRESS.
curl -v http://store.example.com/trafficeextension --resolve store.example.com:GATEWAY_IP_ADDRESS
  • La salida es similar a la siguiente; podrás notar los cambios en el encabezado de respuesta del cliente en hello y que el cuerpo de la respuesta se eliminó.
* Request completely sent off
< HTTP/1.1 200 OK
< server: Werkzeug/2.3.7 Python/3.11.3
< date: Wed, 30 Jul 2025 12:58:00 GMT
< content-type: application/json
< access-control-allow-origin: *
< hello: service-extensions
< via: 1.1 google
< transfer-encoding: chunked
<

Logs de Pod de ejemplo:

Las Service Extensions de GCP para la GKE Gateway API representan un avance significativo en la forma en que los equipos de plataforma pueden gestionar, moldear y proteger el tráfico en la capa de ingress. Ya sea que necesites aplicar autenticación personalizada, manipular encabezados, hacer traffic shaping o integrarte con sistemas externos, las Service Extensions te permiten hacerlo de forma declarativa y escalable.

Aunque todavía está en preview, esta es una excelente oportunidad para explorar las Service Extensions, probarlas en entornos no productivos y desarrollar servicios de extensión reutilizables, adaptados a los requisitos de tu plataforma.

Si estás pensando en hacer una PoC, no estás solo. DoiT está aquí para ayudarte a evaluar, planificar y migrar con un enfoque claro en los resultados de tu negocio. Con más de 100 expertos senior en cloud especializados en diseñar soluciones a medida, nuestro equipo está listo para acompañarte en este proceso sin contratiempos y para optimizar tu infraestructura, garantizando el cumplimiento y respondiendo con eficiencia a las demandas futuras.

Nuestros expertos están listos para brindarte orientación estratégica y experiencia técnica en cada paso del camino. Conversemos sobre lo que más le conviene a tu empresa durante esta fase de aplicación de políticas, asegurando que tu infraestructura cloud sea robusta, cumpla con la normativa y esté optimizada para el éxito. Contáctanos hoy.