Ambient Mode uses a different data plane (ztunnel + namespace waypoint proxies). Some features available in sidecar mode require a waypoint or different APIs, and a few are not yet supported in Ambient Mode.
Assuming Istio Ambient Mode is installed, first confirm the control-plane and data-plane components:
kubectl get pods -n istio-system
Example (trimmed):
NAME READY STATUS RESTARTS AGEistio-cni-node-vdt82 1/1 Running 0 2m49sistiod-6b854648cc-nnfk4 1/1 Running 0 2m57sztunnel-qgtj5 1/1 Running 0 2m45s
Check namespaces and labels to see which namespaces are configured for Ambient Mode:
kubectl get ns --show-labels
Example output (shows test labeled for Ambient Mode):
NAME STATUS AGE LABELSdefault Active 8m31s kubernetes.io/metadata.name=defaulthello Active 4m4s kubernetes.io/metadata.name=hellohttpbin Active 4m1s kubernetes.io/metadata.name=httpbinistio-system Active 3m12s kubernetes.io/metadata.name=istio-systemtest Active 4m7s istio.io/dataplane-mode=ambient,istio.io/use-waypoint=waypoint,kubernetes.io/metadata.name=test
Use a simple curl pod in the test namespace to exercise services:
kubectl get pods -n test# NAME READY STATUS RESTARTS AGE# curl 1/1 Running 0 5m5s
Important: In sidecar mode the VirtualService host must match the DestinationRule host (short name or FQDN) so subset resolution works.However, in Ambient Mode a plain VirtualService + DestinationRule subset split will not reliably perform L7 routing. ztunnel routes L4 traffic (cluster-wide) and cannot enforce VirtualService subset routing without a waypoint. You will likely observe incorrect or seemingly random distribution.Therefore, for split traffic in Ambient Mode we must use a waypoint proxy plus the Gateway API (HTTPRoute) instead of relying on VirtualService subsets.
Confirm no VirtualService/DestinationRule resources remain:
kubectl get vs -Akubectl get destinationrules.networking.istio.io -A
Use the Gateway API HTTPRoute to perform split routing. HTTPRoute backendRefs must reference actual Service names (not DestinationRule subsets). The HTTPRoute attaches to the ClusterIP helloworld service and routes to backend services (one per version):HTTPRoute (gateway.networking.k8s.io/v1):
kubectl apply -f hello-httproute-split-traffic.yaml# httproute.gateway.networking.k8s.io/hello-http-split-traffic created
Important: HTTPRoute backendRefs reference the per-version Service names (for example, helloworld-v1), not VirtualService subsets. That means you must create individual Services for each deployment.
Ambient Mode uses ztunnel (L4 proxy) for cluster-wide routing and waypoint proxies (per-namespace) for L7 routing.
VirtualService + DestinationRule subset-based split routing does not reliably work in Ambient Mode because ztunnel is L4. Instead:
Add a waypoint proxy for the namespace and
Use HTTPRoute (Gateway API) with backendRefs that point to per-version Services.
Fault injection (delay/abort) via VirtualService works when a waypoint is present.
Some L7 features (mirroring, certain retries/timeouts, etc.) may not be fully supported yet in Ambient Mode — consult the Istio roadmap for updates.
For the Prep Course - Istio Certified Associate (ICA) Certification, you only need to know that Ambient Mode exists and that namespaces may require labeling; deep HTTPRoute or waypoint configuration is not required for exam objectives. Practice the steps above in a lab to gain hands-on experience.
Now you’re ready to try these steps in a live lab to experience Ambient Mode L7 traffic management and fault injection. For further reading: