- Limit an AI agent to the model API it calls, such as
api.anthropic.com. - Let a service running in a customer’s cloud reach only the vendor APIs it depends on.
- Run generated or untrusted code in an isolated namespace, where it can’t reach workload identity or the Kubernetes API.
Network policy is in preview and isn’t enabled by default. Contact Ryvn support to enable it.
How it works
A policy selects pods by label and lists the destinations they can reach:- Domain names (FQDNs), such as
api.anthropic.com - IP ranges (CIDRs) outside the cluster, such as
198.51.100.0/24 - Other workloads in the cluster, selected by pod or namespace labels
Writing a policy
Network policies are Kubernetes resources, so you add them to your Helm chart next to the workloads they apply to, not to your Ryvn configuration. They useapiVersion: networking.ryvn.app/v1alpha1, which is different from the built-in
Kubernetes networking.k8s.io NetworkPolicy.
name and a to list. Each entry in to sets one of these fields:
protocols limits a rule to TCP or UDP destination ports. Leave it out to allow every port. For pods and
namespaces, use the port the pod listens on, not the Service port: a Service on port 80 that forwards to 8080 needs
8080.
Namespace posture
A posture sets the default for every pod in a namespace, whether or not a policy selects it. Run agents and other code you don’t trust in anisolated namespace: nothing there can reach workload identity or the Kubernetes API, and no
policy can open the Kubernetes API. Workloads that need those, like operators you deploy, can run in a restricted
namespace, where they keep cluster DNS, workload identity, and the Kubernetes API. Don’t give isolated workloads a cloud
identity, since a domain rule can still reach AWS STS and Microsoft Entra ID.
Set the posture with the networking.ryvn.app/default-egress-policy label in the environment’s
namespaces list:
On Azure,
restricted and isolated namespaces always block instance metadata (169.254.169.254) to prevent pods
from using the node’s credentials. Use workload identity instead.
In both postures, pods can’t reach other pods, including ones in the same namespace, until a policy allows it. Postures
only restrict outbound traffic, so other workloads can still call an isolated agent. Namespaces without the label have
no default restriction.
Known limitations
- A domain rule allows the IP addresses the domain resolves to, so other hostnames served from the same addresses are reachable too.
- On GCP, domains that rotate through many IP addresses, such as large object storage and CDN endpoints, can see
occasional timeouts. Reuse connections, or also allow the provider’s published IP ranges with
networks. - On GCP, a pod with a domain rule can look up any name in DNS, even though it can only connect to allowed destinations, so data can still leave inside DNS queries.
- On GCP, a
networksrange that includes the cluster’s nodes, such as0.0.0.0/0, also opens every node on the rule’s ports. List only the ports you need. - On Azure, a new pod with a domain rule may fail DNS lookups for its first few seconds, until Azure’s DNS proxy learns about the pod. This can happen on every rollout, scale-up, or Job run.
- The
isolatedposture can’t block domain-based identity endpoints, such as AWS STS for IRSA and Microsoft Entra ID for Azure workload identity. Enforce this through identity, not network policy: don’t link the service accounts of isolated workloads to an IAM role or an Azure managed identity. - Policies don’t restrict host-networked pods, and
podsandnamespacesrules don’t select them as destinations.