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
appProtocolprecisa 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 caminhorouteextensione, 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
HTTPRoutecom o hostservice-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_NAMEpara confirmar que aGCPRoutingExtensionestá 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-extensionsconfirma a vinculação do gateway àGCPRoutingExtension. - Agora teste o tráfego para o caminho
routeextension, substituindoGATEWAY_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_headerdentro 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 caminhotrafficetension. Você pode customizar e controlar a invocação do load balancer para a aplicação de callout ajustando osupportedEvents.
---
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, substituindoGATEWAT_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.