Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

GKE Gateway API e Service Extensions: o novo kit para resolver desafios complexos de tráfego em…

By Chimbu ChinnaduraiAug 12, 20258 min read

Esta página também está disponível em English, Deutsch, Español, Français, Italiano e 日本語.

O Kubernetes transformou a orquestração de containers e o Google Kubernetes Engine (GKE) entrega uma plataforma gerenciada robusta para implantar e escalar aplicações conteinerizadas. Mesmo com recursos sólidos para descoberta de serviços e balanceamento de carga, o GKE ainda tem limitações na hora de aplicar lógica de processamento customizada ao tráfego antes que ele chegue aos workloads.

É aí que entram as Service Extensions, com uma solução interessante para customizar e turbinar o Cloud Load Balancing junto com a GKE Gateway API (observação: é um recurso do Kubernetes, sem qualquer relação com o serviço API Gateway do Google Cloud).

O que são Service Extensions no GCP?

As Service Extensions permitem injetar lógica customizada direto no data path, abrindo espaço para modificações avançadas no tráfego que passa pelo load balancer. Funciona como um pipeline em que você insere seu próprio código em diferentes estágios para manipular requisições e respostas, sem mexer nos backends.

Existem dois tipos principais de Service Extensions:

  • Plugins: permitem inserir código customizado inline no próprio data path da rede. Construídos com WebAssembly (Wasm) e a ABI Proxy-Wasm, os plugins rodam como módulos Wasm em uma infraestrutura sandbox gerenciada pelo Google. Foram projetados para operações de baixa latência e são ideais para lógicas leves que precisam ser executadas bem perto do data plane.

  • Callouts: permitem que o Cloud Load Balancing faça chamadas gRPC para serviços externos — gerenciados pelo Google ou pelo próprio usuário (inclusive aqueles que rodam em Pods do GKE). Os Callouts oferecem mais flexibilidade, já que podem reaproveitar software existente e têm menos restrições de runtime, o que os torna adequados para lógicas mais complexas que dependem de dados ou estado externos.

O time do GKE anunciou recentemente o suporte em preview para Service Extensions na Gateway API. Com isso, dá para manipular cabeçalhos e payloads HTTP de requisições e respostas e até controlar o roteamento do tráfego, sem afetar as seleções de serviço de backend nem as políticas de segurança existentes.

Tipos de Service Extensions na GKE Gateway API

Hoje, o controlador do GKE Gateway suporta dois tipos de Callouts Service Extensions, cada um pensado para funcionalidades específicas:

  • GCPRoutingExtension: esse tipo de extensão é focado em controlar o roteamento do tráfego. É ideal para cenários em que você precisa direcionar o tráfego para diferentes serviços de backend ou aplicar uma lógica de roteamento customizada.

Como o GCPRoutingExtension funciona com Gateways

  • GCPTrafficExtension: esse tipo de extensão permite alterar cabeçalhos e payloads de requisições e respostas. Funciona sem afetar a seleção de serviço de backend nem as políticas de segurança, sendo perfeito para transformação e enriquecimento de dados.

Como o GCPTrafficExtension funciona com Gateways

Configurando Service Extensions na GKE Gateway API

Para explorar o recurso de service extension no GKE, você precisa de um cluster GKE na versão 1.33 ou superior, com a Gateway API habilitada. Antes de testar, vale também conferir as Restrições e limitações atuais das Gateway Service Extensions no GKE.

Implantar um Gateway

Para configurar uma Service extension, primeiro é preciso implantar um recurso Gateway ou verificar se o recurso Gateway existente usa uma GatewayClass suportada. Para detalhes sobre os load balancers suportados, consulte Compatibilidade do Google Cloud Service Extension com GatewayClasses.

  • Aplique o manifesto abaixo para implantar um gateway simples com application load balancer 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

Implantar uma aplicação de backend de loja como exemplo

  • Aplique o manifesto abaixo para implantar a aplicação de backend de exemplo e os recursos HTTPRoute. O HTTPRoute define o comportamento de roteamento das requisições HTTP, partindo de um listener do Gateway até a aplicação de 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
  • Envie uma requisição de teste para o endereço IP da gateway API para conferir a resposta do backend.
curl http://store.example.com --resolve store.example.com:80:GATEWAY_IP_ADDRESS -v

O retorno é parecido com este:

{
  "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"
}

Implantar um serviço de callout de backend

Um serviço de callout implementa a lógica customizada das Gateway Service Extensions no GKE. O Load Balancer invoca as aplicações de backend conforme as configurações de GCPTrafficExtension ou GCPRoutingExtension, para modificar ou rotear o tráfego.

Se for implantar um serviço de callout no cluster GKE, você precisa atender a todos os requisitos descritos nas limitações.

  • Gere um certificado autoassinado para o backend do serviço de callout usando o mkcert ou outro método de sua preferência. Isso é necessário porque o appProtocol precisa ser HTTP2, o que exige TLS de ponta a ponta.
mkcert internal
  • Crie um Secret do K8S com o certificado autoassinado.
kubectl create secret tls extension-service-app-secret \
  --cert=internal.pem \
  --key=internal-key.pem
  • Aplique o manifesto abaixo para implantar a aplicação de callout de exemplo. Para mais exemplos de código, consulte o repositório service-extensions no GitHub.
---
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
  • A aplicação de exemplo faz uma modificação básica de cabeçalho tanto na requisição quanto na resposta. Veja o service_callout_example.py para mais detalhes — a partir dele, você pode desenvolver sua própria aplicação conforme as necessidades do seu negócio.

Configurar as Service Extensions

Você pode configurar uma GCPRoutingExtension ou uma GCPTrafficExtension para customizar o fluxo do seu tráfego.

  • Aplique o manifesto abaixo para criar um recurso GCPRoutingExtension. O load balancer chamará o app do serviço de extensão para as requisições enviadas ao caminho routeextension e, em seguida, encaminhará tudo para a aplicação de backend da loja.
---
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
  • Atualize o recurso HTTPRoute com o host service-extensions.com, já que o serviço de callout altera o cabeçalho host antes de encaminhar as requisições para o app da loja.
---
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
  • O controlador da Gateway API pode levar alguns minutos para sincronizar as mudanças. Use o comando kubectl describe gateway GATEWAY_NAME para confirmar que a GCPRoutingExtension está vinculada ao 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
...
  • O retorno mostra as anotações que o GKE usa para guardar os vínculos entre o Gateway e os recursos subjacentes do Google Cloud. A anotação networking.gke.io/lb-route-extensions confirma a vinculação do gateway à GCPRoutingExtension.
  • Agora teste o tráfego para o caminho routeextension, substituindo GATEWAY_IP_ADDRESS.
curl -v http://store.example.com/routeextension --resolve store.example.com:GATEWAY_IP_ADDRESS
  • O retorno se parece com o seguinte, e dá para notar as alterações no host_header dentro da resposta.
{
  "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"
}

Você pode usar o GCPTrafficExtension para implementar lógica customizada de requisição e resposta, roteamento sofisticado, transformações e políticas de segurança.

  • Aplique o manifesto abaixo para criar um recurso GCPTrafficExtension. O load balancer chamará o app do serviço de extensão para as requisições enviadas ao caminho trafficetension. Você pode customizar e controlar a invocação do load balancer para a aplicação de callout ajustando o 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
  • Agora teste o tráfego para o caminho trafficextension, substituindo GATEWAT_IP_ADDRESS.
curl -v http://store.example.com/trafficeextension --resolve store.example.com:GATEWAY_IP_ADDRESS
  • O retorno se parece com o seguinte: dá para perceber as alterações no cabeçalho de resposta personalizado em hello, além da remoção do corpo da resposta.
* 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 exemplo do Pod:

As GCP Service Extensions para a GKE Gateway API são um avanço importante na forma como times de plataforma gerenciam, modelam e protegem o tráfego na camada de ingress. Seja para aplicar autenticação customizada, manipular cabeçalhos, fazer traffic shaping ou integrar com sistemas externos, as Service Extensions deixam você fazer tudo isso de forma declarativa e escalável.

Mesmo ainda em preview, esse é um ótimo momento para conhecer as Service Extensions, testá-las em ambientes que não sejam de produção e desenvolver serviços de extensão reutilizáveis, sob medida para os requisitos da sua plataforma.

Se você está pensando em fazer um PoC, saiba que não está sozinho. A DoiT está aqui para ajudar a avaliar, planejar e migrar com foco total nos resultados do seu negócio. Com mais de 100 especialistas sêniores em cloud dedicados a criar soluções customizadas, nosso time está pronto para guiar você por esse processo com tranquilidade e otimizar sua infraestrutura para garantir conformidade e atender com eficiência às demandas futuras.

Nossos especialistas estão prontos para oferecer orientação estratégica e expertise técnica em cada etapa. Vamos conversar sobre o que faz mais sentido para a sua empresa nesta fase de aplicação de políticas, garantindo uma infraestrutura na nuvem robusta, em conformidade e otimizada para o sucesso. Fale com a gente hoje mesmo.