What happened?
WebSocket connections are blocked with 403 upgrade_failed when using Pomerium Gateway API mode. Terminals and kernels in JupyterLab are completely non-functional.
What did you expect to happen?
WebSocket connections should be allowed just like they were with the Ingress controller using ingress.pomerium.io/allow_websockets: "true" annotation.
How’d it happen?
- Migrated from Pomerium Ingress to Gateway API using
PolicyFilter - Accessed JupyterLab via
https://gxxxx.staging.kenya.co/lab - Terminal and kernel connections fail with
403 upgrade_failedin Pomerium logs
What’s your environment like?
-
- Pomerium version:
v0.32.8installed viakubectl apply -k "github.com/pomerium/ingress-controller/config/gateway-api?ref=v0.32.8" - Server: Azure Kubernetes Service (AKS), Ubuntu, southafricanorth region
- Gateway API CRDs:
v1.5.1 - Envoy Gateway:
v1.8.0
- Pomerium version:
What’s your config.yaml?
apiVersion: ingress.pomerium.io/v1
kind: Pomerium
metadata:
name: global
namespace: pomerium
spec:
secrets: pomerium/bootstrap
authenticate:
url: "https://xxx.pomerium.staging.kenya.co"
identityProvider:
provider: azure
secret: pomerium/idp-azure
certificates:
- pomerium/production-kenya-coapiVersion:
gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: xxx-httproute
namespace: staging
spec:
parentRefs:
- name: pomerium
namespace: pomerium
hostnames:
- xxxxx.staging.kenya.co
rules:
- backendRefs:
- name: applications-0-service
port: 8888
filters:
- type: ExtensionRef
extensionRef:
group: gateway.pomerium.io
kind: PolicyFilter
name: xxx-policy
apiVersion: gateway.pomerium.io/v1alpha1
kind: PolicyFilter
metadata:
name: xxx-policy
namespace: staging
spec:
ppl: |
allow:
or:
- email:
is: user@example.com
What did you see in the logs?
{"level":"info","service":"envoy","method":"GET",
"path":"/terminals/websocket/4",
"response-code":403,
"response-code-details":"upgrade_failed",
"time":"2026-06-05T08:53:22Z","message":"http-request"}
Additional context
What I tried:
- Adding
allow_websockets: truetoPolicyFilterspec:
Error: unknown field "spec.allowWebsockets"
- Adding
allow_websockets: trueas PPL action:
couldn't parse policy: invalid rules in policy:
invalid action in rule: unsupported action: "allow_websockets"
- Adding
spec.policyto Pomerium global config:
Error: unknown field "spec.policy"
Additional context
With Ingress controller, WebSocket worked perfectly using:
yaml
annotations:
ingress.pomerium.io/allow_websockets: "true"
There appears to be no equivalent for this in Gateway API mode. Is allow_websockets supported in Gateway API PolicyFilter? If not, is it on the roadmap?
This is a blocker for migrating WebSocket-heavy applications like JupyterLab from Ingress to Gateway API.