Skip to main content

bh-gateway (platform edge)

Deploy the BigHammer platform edge on Gateway API: shared Gateway, EnvoyProxy, ClientTrafficPolicy, and ReferenceGrant resources that application HTTPRoute objects attach to.

Prerequisites: Complete Gateway API Deployment Steps 1–2 (CRDs + Envoy Gateway controller) before running the commands below.

kubectl get pods -n envoy-gateway-system -l app.kubernetes.io/name=envoy-gateway

Install from OCI (Helm)

1. Set chart location and version

BigHammer publishes the chart to AWS ECR (OCI). Mirror to your GAR via the reader role.

# BigHammer ECR (reference)
export BH_GATEWAY_CHART=oci://<bh-aws-account-id>.dkr.ecr.<bh-catalog-aws-region>.amazonaws.com/gcp/bh-helm-release/bh-gateway
export CHART_VERSION=1.0.0

# Customer GAR (after promotion) — example
# export BH_GATEWAY_CHART=oci://us-east1-docker.pkg.dev/<project>/bh-helm-release/bh-gateway

Pin CHART_VERSION to the tag approved for your environment.

2. Authenticate to the registry

ECR:

aws ecr get-login-password --region <bh-catalog-aws-region> | \
helm registry login --username AWS --password-stdin <bh-aws-account-id>.dkr.ecr.<bh-catalog-aws-region>.amazonaws.com

GAR:

gcloud auth print-access-token | \
helm registry login --username oauth2accesstoken --password-stdin https://<region>-docker.pkg.dev

3. Prepare a values overlay

Create a file on your workstation (for example values-gcp.yaml). Minimum fields for GKE:

# values-gcp.yaml — customer / environment overlay

labels:
env: prod

gateway:
listeners:
https:
tlsSecretName: <env>-gcp-bighammer-tls
tlsSecretNamespace: bh-control-plane # App namespace where TLS secret lives

envoyProxy:
envoyService:
annotations:
cloud.google.com/l4-rbs: "enabled"
cloud.google.com/network-tier: "Standard"
externalTrafficPolicy: Cluster

referenceGrants:
routeNamespaces:
- bh-control-plane

See Configure values for field descriptions. Edge SSL/TLS: TLS Options (Gateway listener paths and shared GSM keys).

4. Install or upgrade

helm upgrade --install bh-gateway "${BH_GATEWAY_CHART}" \
--version "${CHART_VERSION}" \
-f values-gcp.yaml \
-n envoy-gateway-system \
--force-conflicts
FlagPurpose
Release name bh-gatewayMust match the Gateway resource name apps reference in parentRef
Namespace envoy-gateway-systemSame namespace as Envoy controller and platform Gateway
--force-conflictsSafe server-side apply when Gateway API fields are managed by multiple controllers on GKE

Use --create-namespace only if envoy-gateway-system does not exist (normally created in Gateway API Step 2).

5. Verify before continuing

kubectl get gateway bh-gateway -n envoy-gateway-system
kubectl describe gateway bh-gateway -n envoy-gateway-system
kubectl get svc -n envoy-gateway-system -o wide
kubectl get referencegrant -n envoy-gateway-system

Ready to proceed when:

  1. Gateway status is Programmed
  2. Data-plane LoadBalancer Service has an EXTERNAL-IP (name like envoy-envoy-gateway-system-bh-gateway-*)
  3. GCP load balancer backend health is healthy (TCP 10256 — see GKE load balancer)
  4. TLS secret exists: kubectl get secret <tlsSecretName> -n <tlsSecretNamespace>

6. Upgrade after value changes

Edit values-gcp.yaml, then re-run the same helm upgrade --install command. No CRD or controller reinstall is required for TLS, LB, or namespace grant changes.


What to do next

  1. DNS — Point hostnames (ui.*, catalog.*, kc.*, …) to the data-plane EXTERNAL-IP from Step 5.
  2. Deploy BigHammer with Gateway mode enabled:
global:
ingress:
enabled: false
gateway:
enabled: true
parentRef:
name: bh-gateway
namespace: envoy-gateway-system
sectionName: https
  1. Follow Platform Deployment and Deployment Checklist.
  2. Confirm routes: kubectl get httproute -n bh-control-plane
  3. Smoke test: curl -kI https://<your-ui-hostname>

Overview

What this chart installs

ResourcePurpose
GatewayClassBinds listeners to the Envoy Gateway controller
Gateway (bh-gateway)Public HTTP/HTTPS listeners; TLS termination on Envoy
EnvoyProxy (bh-envoy-proxy)Data-plane Envoy Deployment + external LoadBalancer
ClientTrafficPolicyEdge timeouts and connection limits
ReferenceGrantPermits HTTPRoute in listed namespaces to attach to bh-gateway

What this chart does not install

Where this fits in the full stack

StepDocRelease
1Gateway API — CRDsUpstream gateway-crds-helm (OCI)
2Gateway API — ControllerUpstream gateway-helm (OCI)
3This pagebh-gateway (OCI) in envoy-gateway-system
4Platform Deploymentbighammer (apps + HTTPRoutes)

Helm release contract

ItemValue
OCI chartoci://…/gcp/bh-helm-release/bh-gateway
Release namebh-gateway
Namespaceenvoy-gateway-system
Gateway resourcebh-gateway
GatewayClasseg
HTTPS listenersectionName: https

TLS certificates usually live in the application namespace (for example bh-control-plane) and are referenced cross-namespace by the Gateway listener.


Configure values

Core gateway and TLS

gateway:
enabled: true
provider: envoy
createNamespace: false # Envoy controller install (Step 2) owns the namespace
name: bh-gateway
namespace: envoy-gateway-system
gatewayClassName: eg # Must match Envoy Gateway GatewayClass
listeners:
http:
enabled: true # Optional HTTP listener (port 80)
port: 80
https:
enabled: true
port: 443
mode: Terminate # TLS on Envoy; GCP LB is L4 passthrough
tlsSecretName: <env>-gcp-bighammer-tls
tlsSecretNamespace: bh-control-plane

GKE load balancer and network tier

The Envoy data-plane Service is type LoadBalancer. On GKE, use these settings in your values overlay:

envoyProxy:
name: bh-envoy-proxy
envoyService:
type: LoadBalancer
annotations:
cloud.google.com/l4-rbs: "enabled"
cloud.google.com/network-tier: "Standard"
externalTrafficPolicy: Cluster
allocateLoadBalancerNodePorts: false
envoyDeployment:
replicas: 2
SettingWhy it matters
cloud.google.com/l4-rbs: "enabled"GKE L4 regional passthrough NLB. TLS terminates on Envoy, not on the GCP load balancer.
cloud.google.com/network-tier: StandardStandard tier external IP (reference dev pattern). Use Premium if your org requires it.
externalTrafficPolicy: ClusterHealth checks on kube-proxy port 10256 — same as ingress-nginx and existing Shared VPC firewall rules.
allocateLoadBalancerNodePorts: falseAvoids extra NodePorts with Cluster policy + L4 RBS.
GKE health checks

Do not set the GCP health-check port to 80 or 443. With externalTrafficPolicy: Cluster, checks must use TCP 10256.

On Shared VPC, allow 10256 from Google ranges (130.211.0.0/22, 35.191.0.0/16, …) on the host project. Allow 80 and 443 for client traffic — see Prerequisites.

Controller vs data-plane — do not mix them up:

ServiceTypeUse for DNS?
envoy-gatewayClusterIPNo — internal controller only
envoy-envoy-gateway-system-bh-gateway-*LoadBalancerYesEXTERNAL-IP for A records

HTTPRoute namespaces (ReferenceGrant)

Only namespaces in referenceGrants.routeNamespaces may attach HTTPRoute resources to bh-gateway:

referenceGrants:
routeNamespaces:
- bh-control-plane
- spark-operator
crossNamespace:
# HTTPRoute in bh-control-plane → RabbitMQ Service in another namespace
- routeNamespace: bh-control-plane
backendNamespace: messaging

RabbitMQ in a separate namespace: add crossNamespace as above, redeploy bh-gateway, deploy the broker, then enable global.gateway.routes.bhrabbitmq with backendRef.namespace: messaging. See RabbitMQ broker — Cross-namespace.

Add a namespace before deploying HTTPRoutes from that namespace, then run helm upgrade again.


Ongoing changes

You need to…EditRe-run
TLS secret or listener portsgateway.listeners.httpshelm upgrade bh-gateway (OCI + values file)
LB tier or traffic policyenvoyProxy.envoyServiceSame
Allow HTTPRoutes from new namespacereferenceGrants.routeNamespacesSame
Cross-namespace HTTPRoute → ServicereferenceGrants.crossNamespaceSame — RabbitMQ example
App hostnames or pathsglobal.gateway.routes in bighammerhelm upgrade bighammer only
Envoy Gateway versionUpstream CRDs + controllerGateway API Steps 1–2

Troubleshooting

SymptomLikely causeAction
Gateway not ProgrammedController or CRDs missingComplete Gateway API Steps 1–2
LB 0% healthyFirewall or wrong health portTCP 10256 on Shared VPC host project
HTTPS certificate errorTLS secret missing or wrong NSMatch tlsSecretName / tlsSecretNamespace
HTTPRoute not attachedNamespace not grantedAdd to routeNamespaces; upgrade chart
helm upgrade auth failureRegistry login expiredRe-run ECR or GAR helm registry login
No EXTERNAL-IPLB provisioning / quotaWait; check GCP quotas and subnet

See also Troubleshooting and Gateway API load balancer notes.