apiVersion: v1
kind: Namespace
metadata:
name: shop
labels:
istio.io/dataplane-mode: ambient
istio.io/use-waypoint: waypoint
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: web
namespace: shop
---
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: waypoint
namespace: shop
labels:
istio.io/waypoint-for: service
spec:
gatewayClassName: istio-waypoint
listeners:
- name: mesh
port: 15008
protocol: HBONE
---
apiVersion: security.istio.io/v1
kind: PeerAuthentication
metadata:
name: default
namespace: shop
spec:
mtls:
mode: STRICT
---
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
name: api-read-only
namespace: shop
spec:
targetRefs:
- kind: Service
group: ""
name: api
action: ALLOW
rules:
- from:
- source:
principals: ["cluster.local/ns/shop/sa/web"]
to:
- operation:
methods: ["GET"]
paths: ["/orders/*"]
---
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
name: api-from-waypoint-only
namespace: shop
spec:
selector:
matchLabels:
app: api
action: ALLOW
rules:
- from:
- source:
principals: ["cluster.local/ns/shop/sa/waypoint"]
---
apiVersion: v1
kind: Service
metadata:
name: api
namespace: shop
spec:
selector:
app: api
ports:
- name: http
port: 8080Istio graph
Istio ambient mode: ztunnel, waypoint proxies and authorization without sidecars
How Istio ambient mode secures traffic with no sidecar: a namespace label enrolls Pods, ztunnel carries mTLS between nodes, a waypoint Gateway adds HTTP rules, and PeerAuthentication and AuthorizationPolicy decide who may call what.
Ambient mode splits what a sidecar did in two. A per-node proxy, ztunnel, gives every enrolled Pod an identity and mutual TLS at layer 4. HTTP features such as routing by path or authorizing by method run in a waypoint proxy, which you deploy only for the namespaces or services that need it.
Pods join by a label on their namespace, with no restart and no extra container. This graph shows one call from web to api through both layers.
Interactive graph
Click a resource to see what it does, or follow the setup step by step.
How it works
All 11 resources and what they do
- Namespace shopv1
istio.io/dataplane-mode: ambientenrolls every Pod in the namespace.istio.io/use-waypointsends traffic for its Services through the named waypoint.- DaemonSet ztunnelapps/v1
- One per node. It takes over the traffic of enrolled Pods on its node, wraps it in mutual TLS over port 15008 (HBONE), and presents each Pod's own SPIFFE identity, taken from its ServiceAccount.
- Pod web-5b7c9-…v1
- The caller. It has one container and shows 1/1. Its plain HTTP request to
apiis picked up by the ztunnel on its node. - ServiceAccount webv1
- The caller's identity in the mesh:
cluster.local/ns/shop/sa/web. Authorization rules name this principal, so each workload needs its own ServiceAccount. - Gateway waypointgateway.networking.k8s.io/v1
- A Gateway of class
istio-waypoint. Istio turns it into an Envoy Deployment that handles layer 7 for the namespace's Services.istioctl waypoint apply -n shop --enroll-namespacecreates it and labels the namespace. - Deployment waypointapps/v1
- The Envoy Pods istiod creates for the Gateway. They scale like any Deployment, apart from the applications they serve.
- PeerAuthentication defaultsecurity.istio.io/v1
STRICTmakes ztunnel refuse plain text to the namespace's Pods. A caller outside the mesh gets a reset connection.- AuthorizationPolicy api-read-onlysecurity.istio.io/v1
- An HTTP rule, so it attaches to the Service with
targetRefsand is enforced by the waypoint:webmayGET /orders/*onapiand nothing else. - AuthorizationPolicy api-from-waypoint-onlysecurity.istio.io/v1
- A layer 4 rule with a workload
selector, enforced by ztunnel at the destination: only the waypoint's identity may connect to theapiPods. Without it a caller could skip the waypoint by using a Pod IP. - Service apiv1
- What
webcalls. Because the namespace uses a waypoint, ztunnel sends traffic for this Service to the waypoint first. - Pod api-7f6d4-…v1
- The destination. The ztunnel on its node ends the mutual TLS, checks the layer 4 policy and hands plain HTTP to the container.
Common mistakes
- ztunnel only understands layer 4. An AuthorizationPolicy with a
selectorand HTTP fields such asmethodsorpathsis not enforced as written: attach HTTP rules to the Service or the waypoint withtargetRefs. - Deploying a waypoint does nothing until something uses it. The namespace or the Service needs the
istio.io/use-waypointlabel. - Identity comes from the ServiceAccount. Workloads that share
defaultshare one principal, and no policy can tell them apart. - A waypoint policy alone can be bypassed by calling a Pod IP. Add the layer 4 policy that admits only the waypoint's principal.
- Pods that use
hostNetworkare not captured, and a namespace with both sidecars and the ambient label should pick one mode per Pod.
The manifests you write
Everything above that is marked "You write it", in one file. The rest comes from add-ons and controllers.
Keep going
More graphs
- Deployment, Service and Ingress: how a request reaches your Pods
- Gateway API: GatewayClass, Gateway and HTTPRoute with a canary split
- PVC, StorageClass and CSI: how a cloud disk ends up in your Pod
- RBAC: how a ServiceAccount gets its permissions
- cert-manager with Let's Encrypt: Certificate, CertificateRequest, Order and Challenge
- A private CA with cert-manager and trust-manager
- Istio traffic management: Gateway, VirtualService, DestinationRule and policies
- Flux dependencies: Git and OCI sources, Kustomizations and HelmReleases
- Argo CD: ApplicationSet, AppProject and the Applications it generates
- Inside an OCI image: tag, index, manifests, config and layers
- OCI artifacts: Helm charts, Flux artifacts and image volumes
- A Helm release: chart, values, revisions and the objects Helm owns
- Kustomize: a base, two overlays, a component and generated ConfigMaps
- A StatefulSet database: headless Service, per-Pod volumes, snapshots and restore
- Autoscaling end to end: KEDA, the HPA it creates and Karpenter adding nodes
- Prometheus Operator: ServiceMonitor, PrometheusRule and the path to an alert
- External Secrets Operator: from a cloud secret manager to a Pod, with rotation
- Kyverno CEL policies: ValidatingPolicy, MutatingPolicy, GeneratingPolicy and exceptions
- Cilium egress to a domain: CiliumNetworkPolicy, the DNS proxy and toFQDNs
- Argo Rollouts canary: traffic weights on an HTTPRoute and analysis from Prometheus