Skip to content

Pressure Testing

Date: 2026-05-18 UTC

This report summarizes a live GKE validation of Service LoadBalancer Multiplexer with one mux Service, 100 channel Services, and 100 distinct backend pods. Identifiers are partially redacted so the report is useful without exposing full project details.

Validate that a single GKE-backed mux can:

  • bind a reserved static external IPv4 address;
  • stay inside the GKE-native 100 Service port limit;
  • rely on GKE-managed forwarding and firewall resources;
  • expose 100 channel Services through one cloud load balancer;
  • route each external port to the correct backend pod, not merely accept TCP connections;
  • reject additional channels after the mux reaches the configured GKE port limit.
ItemValue
Kubernetes providerGoogle Kubernetes Engine
Regionus-west1
Projectredacted
Clusterredacted
Controller imageghcr.io/nowakeai/svc-lb-mux:v0.2.4-alpha.5
Helm releasesvc-mux-eip
Controller namespacesvc-mux-eip
Test namespacesvc-mux-eip-test
Mux Servicemux-eip
API prefixsvc-mux.nowake.ai
Static IP resourceredacted, status IN_USE
External IPredacted, same reserved IPv4 used throughout the test
defaultLoadBalancer:
name: mux-eip
annotations:
cloud.google.com/l4-rbs: "enabled"
networking.gke.io/load-balancer-ip-addresses: <redacted-address-resource>
loadBalancerClass: networking.gke.io/l4-regional-external
allocateLoadBalancerNodePorts: true
portRange: "20000-20099"
maxPorts: 100
allocationConfigMapName: mux-eip-port-allocations

The channel Services used:

spec:
type: LoadBalancer
loadBalancerClass: svc-mux.nowake.ai/mux-eip.svc-mux-eip
allocateLoadBalancerNodePorts: false
ports:
- name: http
port: 8080
targetPort: http
metadata:
annotations:
svc-mux.nowake.ai/external-ports: http:auto

GKE created a backend service-based external passthrough Network Load Balancer.

reserved static IPv4
-> regional forwarding rule, TCP, portRange 20000-20099
-> regional backend service, protocol TCP
-> zonal GCE_VM_IP network endpoint group
-> GKE nodes
-> Kubernetes Service routing
-> controller-managed mux Endpoints
-> channel backend pods

Observed resource properties, with names redacted where appropriate:

ResourceObserved configuration
Forwarding ruleregional, EXTERNAL, TCP, PREMIUM network tier, portRange: 20000-20099
Backend serviceregional, EXTERNAL, TCP, balancing mode CONNECTION, locality policy MAGLEV, timeout 30s
Health checkregional shared GKE L4 health check, HTTP :10256/healthz
NEGzonal GCE_VM_IP, size 9 during the test
Firewall ruleGKE-managed ingress rule, destination is the reserved mux IP, source 0.0.0.0/0, allowed TCP ports 20000-20099
Static IPregional external IPv4, status IN_USE, attached to the forwarding rule

No user-managed firewall rule was required after switching to the GKE-native model.

The pressure workload was generated with test-local/gke-pressure.py.

It created:

  • 100 Deployments;
  • 100 backend pods;
  • 100 channel Services;
  • one unique response body per backend, using the pattern svc-lb-mux-channel-<index>.

The mux allocation ConfigMap contained 100 persisted assignments. The mux Service exposed 100 TCP ports in the configured range.

Representative commands:

Terminal window
kubectl rollout status deployment/svc-mux-eip -n svc-mux-eip --timeout=180s
kubectl wait --for=condition=Available deployment \
-l app.kubernetes.io/name=svc-lb-mux-pressure \
-n svc-mux-eip-test \
--timeout=300s
kubectl get svc mux-eip -n svc-mux-eip \
-o jsonpath='{.metadata.annotations.svc-mux\.nowake\.ai/summary}'
kubectl get configmap mux-eip-port-allocations \
-n svc-mux-eip \
-o jsonpath='{.data.allocations\.json}' > /tmp/mux-eip-allocations.json
test-local/gke-pressure.py probe \
--host <redacted-static-ip> \
--allocations-json /tmp/mux-eip-allocations.json \
--namespace svc-mux-eip-test \
--timeout 5
CheckResult
Controller rolloutPassed
100 backend Deployments availablePassed
Allocation ConfigMap entries100
Mux Service ports100
GKE forwarding rule port range20000-20099
GKE-managed firewall coverageTCP 20000-20099
Public HTTP content probeok=100 missing=0 failed=0
Additional channel above limitrejected with MuxPortLimitExceeded
Missing max-ports on detected GKE muxWarning event GkePortLimitApplied observed

The content probe validates that every allocated external port routed to the expected backend response body. This is stronger than a TCP-only probe because it verifies the channel-to-port-to-backend mapping.

  • The GKE-native target for one mux is 100 one-port channel mappings because GKE LoadBalancer Services support up to 100 unique Service ports.
  • Larger deployments should shard channels across multiple mux Services with non-overlapping port ranges.
  • The current controller still writes a legacy Endpoints object for the mux. EndpointSlice support is on the roadmap for better scale and readability.
  • The test namespace was intentionally left in place after validation for follow-up inspection.

The tested GKE configuration successfully reused one GKE-managed external passthrough Network Load Balancer for 100 channel Services and 100 distinct backend pods. Static IP binding, GKE-managed firewall reconciliation, stable per-mux port allocation, public routing, and GKE port-limit enforcement all behaved as expected.