Kubernetes hat die Container-Orchestrierung grundlegend verändert, und Google Kubernetes Engine (GKE) bietet eine leistungsstarke Managed-Plattform, um containerisierte Anwendungen auszurollen und zu skalieren. GKE liefert zwar starke Funktionen für Service Discovery und Load Balancing, doch beim Anwenden eigener Verarbeitungslogik auf den Traffic, bevor dieser die workloads erreicht, stößt man weiterhin an Grenzen.
Genau hier kommen Service Extensions ins Spiel: Sie sind eine überzeugende Lösung, um Cloud Load Balancing in Verbindung mit der GKE Gateway API gezielt zu erweitern und anzupassen (Hinweis: Es handelt sich um ein Kubernetes-Feature, das nichts mit dem Google Cloud API Gateway-Service zu tun hat).
Was sind Service Extensions in GCP?
Mit Service Extensions lässt sich eigene Logik direkt in den Datenpfad einklinken und der Traffic, der durch den Load Balancer fließt, gezielt manipulieren. Stellen Sie sich das wie eine Pipeline vor, in die Sie an verschiedenen Stellen eigenen Code einsetzen, um Requests und Responses zu verändern – ohne die Backends zu beeinträchtigen.
Es gibt zwei Haupttypen von Service Extensions:
Plugins: Sie ermöglichen das Einfügen von Inline-Code direkt in den Netzwerk-Datenpfad. Plugins werden mit WebAssembly (Wasm) und der Proxy-Wasm ABI gebaut und laufen als Wasm-Module auf einer von Google verwalteten Sandbox-Infrastruktur. Ausgelegt sind sie auf Operationen mit niedriger Latenz – ideal für leichtgewichtige Logik, die sehr nah an der Data Plane ausgeführt werden soll.
Callouts: Damit kann Cloud Load Balancing gRPC-Aufrufe an externe Dienste absetzen – entweder an von Google verwaltete oder an selbst betriebene Dienste (einschließlich solcher, die auf GKE Pods laufen). Callouts bieten mehr Flexibilität, da sich bestehende Software wiederverwenden lässt und weniger Laufzeit-Restriktionen gelten. Sie eignen sich daher für komplexere Logik, die externe Daten oder Zustände benötigt.
Das GKE-Team hat kürzlich Preview-Support für Service Extensions in der Gateway API angekündigt. Damit lassen sich HTTP-Header und Payloads von Requests und Responses verändern und sogar das Traffic-Routing steuern – ohne bestehende Backend-Service-Auswahl oder Sicherheitsrichtlinien zu beeinflussen.
Typen von GKE Gateway API Service Extensions
Der GKE Gateway Controller unterstützt aktuell zwei Typen von Callouts Service Extensions, die jeweils auf bestimmte Aufgaben zugeschnitten sind:
GCPRoutingExtension: Dieser Typ konzentriert sich auf die Steuerung des Traffic-Routings. Ideal für Szenarien, in denen Sie Traffic auf unterschiedliche Backend-Services verteilen oder eigene Routing-Logik anwenden möchten.
So funktioniert GCPRoutingExtension mit Gateways
GCPTrafficExtension: Mit diesem Typ können Sie Header und Payloads von Requests und Responses verändern. Backend-Service-Auswahl und Sicherheitsrichtlinien bleiben dabei unberührt – perfekt für die Transformation und Anreicherung von Daten.
So funktioniert GCPTrafficExtension mit Gateways
Service Extensions in der GKE Gateway API konfigurieren
Um das Service-Extensions-Feature in GKE auszuprobieren, brauchen Sie einen GKE-Cluster ab Version 1.33 mit aktivierter Gateway API. Werfen Sie vor dem Test außerdem einen Blick auf die aktuellen Einschränkungen und Limitierungen der Gateway Service Extensions in GKE.
Ein Gateway bereitstellen
Bevor Sie eine Service Extension konfigurieren, müssen Sie zunächst eine Gateway-Ressource bereitstellen oder sicherstellen, dass die vorhandene Gateway-Ressource eine unterstützte GatewayClass nutzt. Details zu den unterstützten Load Balancern finden Sie unter Google Cloud Service Extension compatibility with GatewayClasses.
- Wenden Sie das folgende Manifest an, um ein einfaches regionales Application Load Balancer Gateway bereitzustellen.
---
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
Eine Beispiel-Backend-Anwendung (Store) bereitstellen
- Wenden Sie das folgende Manifest an, um die Beispiel-Backend-Anwendung und die HTTPRoute-Ressourcen bereitzustellen. Die HTTPRoute legt fest, wie HTTP-Requests vom Gateway-Listener an die Backend-Anwendung geroutet werden.
---
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
- Schicken Sie einen Beispiel-Request an die IP-Adresse der Gateway API, um die Backend-Antwort zu prüfen.
curl http://store.example.com --resolve store.example.com:80:GATEWAY_IP_ADDRESS -v
Die Ausgabe sieht in etwa so aus:
{
"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"
}
Einen Backend-Callout-Service bereitstellen
Ein Callout-Service implementiert die individuelle Logik für die Gateway Service Extensions in GKE. Der Load Balancer ruft die Backend-Anwendungen anhand der Konfigurationen von GCPTrafficExtension oder GCPRoutingExtension auf, um Traffic zu verändern oder zu routen.
Wenn Sie einen Callout-Service im GKE-Cluster betreiben, müssen Sie alle in den Limitierungen genannten Voraussetzungen erfüllen.
- Erstellen Sie ein selbstsigniertes Zertifikat für das Backend des Callout-Service – mit mkcert oder einem anderen Tool. Das ist nötig, weil als
appProtocolHTTP2 verwendet werden muss, was wiederum Ende-zu-Ende-TLS voraussetzt.
mkcert internal
- Legen Sie ein K8S Secret mit dem selbstsignierten Zertifikat an.
kubectl create secret tls extension-service-app-secret \
--cert=internal.pem \
--key=internal-key.pem
- Wenden Sie das folgende Manifest an, um die Beispiel-Callout-Anwendung bereitzustellen. Weitere Codebeispiele finden Sie im GitHub-Repository 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
- Die Beispielanwendung führt eine einfache Header-Modifikation für Request und Response durch. Details dazu finden Sie in service_callout_example.py – darauf aufbauend können Sie eigene Anwendungen passend zu Ihren Anforderungen entwickeln.
Die Service Extensions konfigurieren
Zur Anpassung Ihres Traffic-Flusses können Sie wahlweise eine GCPRoutingExtension oder eine GCPTrafficExtension konfigurieren.
- Wenden Sie das folgende Manifest an, um eine
GCPRoutingExtension-Ressource zu erstellen. Der Load Balancer ruft daraufhin die Extension-Service-App für Requests an den Pfadrouteextensionauf und leitet sie anschließend an die Backend-Store-Anwendung weiter.
---
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
- Ergänzen Sie die
HTTPRoute-Ressource um den Hostservice-extensions.com, da der Callout-Service den Host-Header anpasst, bevor die Requests an die Store-App weitergehen.
---
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
- Der Gateway-API-Controller braucht unter Umständen ein paar Minuten, um die Änderungen zu synchronisieren. Mit
kubectl describe gateway GATEWAY_NAMEprüfen Sie, ob dieGCPRoutingExtensionan das Gateway gebunden ist.
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
...
- Die Ausgabe zeigt die Annotations, über die GKE die Verknüpfungen zwischen dem Gateway und den zugrunde liegenden Google-Cloud-Ressourcen speichert. Die Annotation
networking.gke.io/lb-route-extensionsbestätigt, dass das Gateway an dieGCPRoutingExtensiongebunden ist. - Testen Sie nun den Traffic auf dem Pfad
routeextension, indem SieGATEWAY_IP_ADDRESSersetzen.
curl -v http://store.example.com/routeextension --resolve store.example.com:GATEWAY_IP_ADDRESS
- Die Ausgabe sieht in etwa so aus – beachten Sie die Änderungen am
host_headerin der Response.
{
"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"
}
Mit GCPTrafficExtension setzen Sie individuelle Request- und Response-Logik, anspruchsvolles Routing, Transformationen sowie Sicherheitsrichtlinien um.
- Wenden Sie das folgende Manifest an, um eine
GCPTrafficExtension-Ressource zu erstellen. Der Load Balancer ruft daraufhin die Extension-Service-App für Requests an den Pfadtrafficetensionauf. Über das FeldsupportedEventssteuern Sie, in welchen Fällen der Load Balancer die Callout-Anwendung aufruft.
---
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
- Testen Sie jetzt den Traffic auf dem Pfad
trafficextension, indem SieGATEWAT_IP_ADDRESSersetzen.
curl -v http://store.example.com/trafficeextension --resolve store.example.com:GATEWAY_IP_ADDRESS
- Die Ausgabe sieht in etwa so aus. Sie erkennen die Änderungen am benutzerdefinierten Response-Header
hello; der Response-Body wurde entfernt.
* 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
<
Beispielhafte Pod-Logs:
GCP Service Extensions für die GKE Gateway API sind ein echter Sprung nach vorn für Plattform-Teams, die Traffic auf Ingress-Ebene steuern, formen und absichern wollen. Ob eigene Authentifizierung, Header-Manipulation, Traffic Shaping oder die Anbindung externer Systeme – mit Service Extensions setzen Sie all das deklarativ und skalierbar um.
Auch wenn das Feature noch in der Preview ist: Jetzt ist der ideale Moment, Service Extensions auszuprobieren, sie in Nicht-Produktivumgebungen zu testen und wiederverwendbare Extension-Services genau auf Ihre Plattformanforderungen zuzuschneiden.
Wenn Sie über einen PoC nachdenken, sind Sie damit nicht allein. DoiT begleitet Sie bei Bewertung, Planung und Migration – stets mit klarem Fokus auf Ihre Geschäftsergebnisse. Mit über 100 Senior Cloud Experts, die maßgeschneiderte Cloud-Lösungen entwickeln, führt Sie unser Team reibungslos durch den Prozess und optimiert Ihre Infrastruktur so, dass sie compliant bleibt und künftigen Anforderungen effizient gewachsen ist.
Unsere Expertinnen und Experten unterstützen Sie in jeder Phase mit strategischer Beratung und technischem Know-how. Lassen Sie uns gemeinsam ausloten, was in dieser Phase der Policy-Durchsetzung für Ihr Unternehmen am sinnvollsten ist – damit Ihre Cloud-Infrastruktur robust, compliant und auf Erfolg ausgelegt ist. Sprechen Sie uns an.