Expose the gateway on a generic cluster
On a cluster that is not AKS, EKS, or GKE, no cloud load balancer integration exists and tare install-gateway has no provider to drive. The gateway is exposed instead through whatever already terminates traffic at the edge of the cluster, typically an Ingress controller. The mechanics are ordinary Kubernetes, except for three details that are not obvious from the chart: where the generated Service lives, how its name is pinned, and the NetworkPolicy rule the Ingress controller needs.
This page applies to self-managed clusters: k3s, kubeadm, OpenShift, or any distribution where inbound traffic arrives through an Ingress controller, a tunnel, or a bare NodePort rather than a provisioned cloud load balancer. The data plane itself is installed first, through the Helm or GitOps path.
Where the Service is created
Two facts about the egress topology prevent the most common wrong turn:
- Envoy Gateway creates the data plane's Service in the Gateway's namespace, not the controller's. An Ingress or ExternalName Service pointed at the controller namespace finds nothing to route to. Confirm the namespace before wiring anything:
kubectl get svc -A -l gateway.envoyproxy.io/owning-gateway-namelists the generated Services with the namespace each landed in. - The generated Service name is hashed and changes. Without pinning, Envoy Gateway derives the Service name from the Gateway, and there is nothing stable for an Ingress backend to target across reinstalls. Pin the name through the egress
EnvoyProxyresource before pointing anything at it:
apiVersion: gateway.envoyproxy.io/v1alpha1
kind: EnvoyProxy
metadata:
name: tars-egress
spec:
provider:
type: Kubernetes
kubernetes:
envoyService:
name: tars-egress-svc
The same EnvoyProxy patch mechanism is what the AWS path uses to request a Network Load Balancer, so a rendered manifest set already contains the resource to edit.