Skip to main content
Version: 2.31

Enable the QUIC tunnel transport

By default, Telepresence tunnels traffic between your workstation and the cluster over port-forwarded connections through the Kubernetes API server: one to the traffic-manager, and one to the traffic-agent of each workload you attach to. That works everywhere kubectl works, but each tunnel multiplexes all its connections over a single TCP stream — one lost packet stalls every connection sharing that tunnel — and the API server was never designed to be a data plane.

The traffic-manager can additionally expose a QUIC endpoint. When it is reachable, clients upgrade to it automatically: each tunneled connection gets its own independently retransmitted QUIC stream, and the API server is taken out of the data path. The port-forwarded transport remains the default and the fallback, so enabling QUIC never breaks a client that cannot reach the endpoint. See the QUIC Tunnel Transport reference for how the upgrade, discovery, and its security model work.

Prerequisites

  • A traffic-manager and clients of version 2.31 or later.
  • A way to route UDP from your workstations to the cluster: a LoadBalancer Service that supports UDP, or node ports reachable from the developer network.

Enable the endpoint

Enable the listener and its Service when installing or upgrading the traffic-manager:

Terminal
$ telepresence helm upgrade --set quicTunnel.enabled=true

This makes the traffic-manager listen on UDP port 7778 and creates a traffic-manager-quic Service of type LoadBalancer in front of it. Once the Service has an external address, the traffic-manager discovers it itself and starts advertising it to clients — no further configuration.

Using a NodePort instead

On clusters where a UDP LoadBalancer isn't available but the nodes are reachable from the developer network, switch the Service to NodePort:

Terminal
$ telepresence helm upgrade \
--set quicTunnel.enabled=true \
--set quicTunnel.service.type=NodePort

The traffic-manager discovers the assigned node port and the cluster's node addresses (preferring a node's external IP, falling back to its internal IP) and advertises them the same way. This needs the traffic-manager's ServiceAccount to have read access to Nodes, which a cluster-scoped install has by default; a namespace-scoped install does not, and needs the explicit override below instead.

When discovery cannot see your topology

Set quicTunnel.externalHost (and, if the Service remaps the port, quicTunnel.externalPort) to bypass discovery entirely and advertise an address you choose. This is the right tool when:

  • A NAT or proxy sits in front of the LoadBalancer, so the address the traffic-manager observes isn't the address clients must dial.
  • The Service's external port isn't the port clients should use.
  • The reachable address is a DNS name that only resolves on the developer VPN, which the traffic-manager has no way to discover.
  • The install is namespace-scoped and the Service is NodePort (see above).
Terminal
$ telepresence helm upgrade \
--set quicTunnel.enabled=true \
--set quicTunnel.service.type=NodePort \
--set quicTunnel.service.nodePort=30777 \
--set quicTunnel.externalPort=30777 \
--set quicTunnel.externalHost=<address of a node>

An explicit externalHost always wins over discovery, and discovery never even starts once it's set.

Verify

Reconnect, then check which transport serves the tunnel:

Terminal
$ telepresence quit
$ telepresence connect
$ telepresence status
...
Root Daemon : Running
...
Tunnel transport: quic (203.0.113.7:7778)

quic (host:port) means the upgrade succeeded. grpc means the client stayed on the port-forwarded transport — expected when the endpoint isn't advertised (discovery hasn't found a candidate address yet, or has nothing to discover from) or the client cannot reach any advertised address over UDP. grpc (fallback) means the QUIC connection was lost mid-session and the client downgraded; the next telepresence connect will try QUIC again.

Troubleshooting

The upgrade is deliberately silent: a client that cannot reach the endpoint connects normally over the port-forwarded transport. If telepresence status keeps reporting grpc:

  • Confirm the endpoint is advertised: either quicTunnel.externalHost is set, or discovery has found a candidate (kubectl get svc traffic-manager-quic shows an external IP/hostname for a LoadBalancer, or a nodePort for a NodePort Service the traffic-manager can list Nodes for). Otherwise the traffic-manager tells clients the endpoint is disabled.
  • Confirm UDP actually reaches one of the advertised addresses from your network; corporate networks and some cloud load balancers drop or don't support UDP.
  • The root daemon's log (daemon.log) contains the reason for a failed upgrade attempt at connect time.