How it works
You bring a domain you own (for examplesandbox.acme.com), and Porter provisions a load balancer and a wildcard HTTPS certificate for it on your sandbox cluster. A cluster supports two kinds of networking, each with its own domain:
| Networking | Load balancer | Who can reach sandboxes |
|---|---|---|
| Public | Internet-facing | Anyone on the internet |
| Private | Internal | Clients inside your VPC |
my-app.sandbox.acme.com, with TLS handled by the wildcard certificate.
What sandboxes can reach
Sandboxes run untrusted code, so their outbound traffic is isolated by default, whether or not networking is configured. A sandbox can resolve DNS and reach the public internet, and nothing else:| Destination | Reachable |
|---|---|
| Public internet | Yes |
| Cluster DNS | Yes |
| In-cluster services and other pods (including other sandboxes) | No |
| Kubernetes API server and the sandbox control plane | No |
Cloud metadata endpoint (169.254.169.254) | No |
Private address space (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 169.254.0.0/16, 100.64.0.0/10) | No |
Configure networking on the cluster
Open the sandbox networking settings
In the Porter Dashboard, go to the Sandbox tab for your sandbox-enabled cluster, then open Settings. The Public and Private networking sections each have their own toggle.
Set the domain
Enable the kind of networking you want and enter the domain sandbox hostnames should be minted under, for example
sandbox.acme.com for public networking or internal.sandbox.acme.com for private. Each needs its own domain.Connect your DNS provider
Porter issues the wildcard certificate through a Let’s Encrypt DNS-01 challenge, which needs access to the DNS zone that contains your domain.Cloudflare: create an API token and paste it into the networking settings.
- In the Cloudflare dashboard, go to your profile icon > My Profile > API Tokens (or directly at dash.cloudflare.com/profile/api-tokens) and click Create Token.
- Use the Edit zone DNS template. It grants the one permission Porter needs: Zone / DNS / Edit.
- Under Zone Resources, scope the token to Include / Specific zone and select the zone that contains your sandbox domain (the zone
acme.comfor a domain likesandbox.acme.com). - Continue to the summary, create the token, and copy it. Cloudflare shows the token value only once.
- Paste it into the section’s API token field in Porter and save.
Create the wildcard DNS record
Save the settings, then wait for the load balancer to provision. The settings page shows the record target and type once it’s ready: create a DNS record for
*.<your domain> (for example *.sandbox.acme.com) pointing at that address.For private networking, the load balancer address only resolves to something reachable from inside your VPC. Point your own private DNS at it if your clients resolve through one; certificates are still issued automatically either way.Expose a port from a sandbox
Passnetworking when creating a sandbox. A sandbox with no networking entry exposes nothing. Currently one entry is supported, and its port is required (1024-65535; privileged ports are not allowed):
<name>.<your domain> (falling back to <id>.<your domain> when the sandbox has no name), publicly when public networking is configured on the cluster, otherwise privately.
Choose the hostname and visibility
Add adomains entry to control where the port is served. Currently one entry is supported:
| Field | Description |
|---|---|
domain | Fully qualified hostname for the sandbox, one label under the domain configured for the chosen visibility (my-app.sandbox.acme.com under sandbox.acme.com). Unlike sandbox names, domains don’t have to be unique: successive sandboxes can reuse a hostname, though only one may be live on it at a time. |
visibility | public or private: whether the sandbox is served publicly or inside your VPC when the cluster has both configured. Omit to default to whichever is configured, public winning. Creating a sandbox that requests a visibility the cluster doesn’t have configured is rejected. |
Find the sandbox URL
The sandbox’s status includeshost, the hostname it’s reachable at. It’s empty when the sandbox exposes no port or the cluster has no networking configured:

