Skip to main content
This guide demonstrates how common Istio traffic-management features behave in Ambient Mode. You’ll learn which control-plane primitives still work, which require Kubernetes-native APIs (for example, HTTPRoute), and how the waypoint proxy fits into request flows. Note: Ambient Mode is typically a small part of the ICA exam objectives. Practically, you should know how to install Ambient Mode and label namespaces. This article is a hands-on demo to illustrate Ambient Mode behavior and how to implement L7 features using a waypoint proxy.
Ambient Mode uses the ztunnel DaemonSet for L4 routing and an optional waypoint (Envoy) proxy for L7 behaviors. Some Istio features (for example, split traffic using VirtualService subsets or mirroring) require different Kubernetes-native APIs in Ambient Mode.

Table: Sidecar vs Ambient — API/Behavior mapping

References:

Verify Ambient components

Assuming Istio Ambient Mode has been installed, confirm the core control-plane components are running in the istio-system namespace:
Example (trimmed):
Check namespaces and labels. Ambient Mode commonly uses:
  • istio.io/dataplane-mode=ambient
  • istio.io/use-waypoint=waypoint (for namespaces that need L7 capabilities)
Inspect your namespaces:
Sample output:
If you plan to enable L7 features in a namespace, add the labels:

Deploy the HelloWorld app (example)

This demo uses a simple Hello World app with two versions (v1 and v2). The repository contains helloworld.yaml which creates two deployments and a catch-all service. Deploy into the hello namespace:
Verify deployments and services:
Example output:

Attempt: split traffic using DestinationRule + VirtualService (sidecar-style)

In sidecar-based deployments, you typically split traffic using a DestinationRule with subsets and a VirtualService with weighted routes. Example sidecar-style VirtualService:
And matching DestinationRule:
Apply:
However, in Ambient Mode this approach does not reliably split traffic. ztunnel handles L4 routing and does not support VirtualService subset routing in the same way sidecars do. Results may appear random or not follow the configured weights.

Correct approach for split traffic in Ambient Mode: HTTPRoute + waypoint

To implement weighted HTTP split routing in Ambient Mode, use the Kubernetes Gateway API HTTPRoute (gateway.networking.k8s.io/v1) and configure a waypoint proxy that performs L7 processing. High-level steps:
  1. Create a waypoint proxy for the namespace (generates the waypoint Envoy).
  2. Remove the sidecar-style VirtualService/DestinationRule.
  3. Create per-version Kubernetes Services and an HTTPRoute that references those services with weights.
  4. Test traffic distribution via the waypoint proxy.
Step-by-step:
  1. Create the waypoint for the hello namespace:
Verify the waypoint pod is running:
  1. Remove the sidecar-style rules that do not provide the expected split semantics in Ambient Mode:
  1. Create an HTTPRoute that attaches to the catch-all helloworld Service (port 5000) and splits traffic using backendRefs. Save as hello-httproute-split-traffic.yaml:
Apply:
Important: backendRefs must reference Kubernetes Services. Create two per-version services (one per deployment) in addition to the catch-all helloworld service. Example per-version Service YAML (can be added to helloworld.yaml or a separate file):
Apply the services (and any updated helloworld manifests):
Now confirm you have the catch-all and the per-version services:
Example output:
  1. Test the split behavior from a test pod:
You should observe routing according to the configured weights (95% → v1, 5% → v2). Small sample sizes can hide the distribution — issue many requests to validate the split.

Notes: features not fully supported (yet)

  • Mirroring is not supported in Ambient Mode (as of this writing).
  • Some features like certain timeouts and retries may not behave identically under Ambient Mode L7 processing. Always check release notes and the Istio roadmap for current support.
  • HTTPRoute + waypoint is the recommended Kubernetes-native pattern for L7 behavior (weights) in Ambient Mode.
Ambient Mode behavior is evolving. If a feature behaves differently than sidecar mode, consult the Istio Ambient Mode documentation and Istio release notes for current status and supported APIs.

Example: httpbin with delay and abort fault injection (waypoint + VirtualService)

For L7 fault injection (delay/abort) you can often use VirtualService APIs when a waypoint proxy is handling L7. This example deploys httpbin into a waypoint-enabled namespace and applies VirtualService fault rules.
  1. Label the namespace and create a waypoint for httpbin:
  1. Deploy httpbin:
Verify pods and services:
  1. Test the basic GET route from the test pod:
You should receive a normal httpbin JSON response.
  1. Inject a delay (VirtualService fault injection). Save as httpbin-vs-delay.yaml:
Apply:
Test and observe the delay (~3 seconds):
Sample curl timing should show the request takes ~3s.
  1. Inject an abort (500). Save as httpbin-vs-abort.yaml:
Apply and test with a HEAD request to inspect the HTTP status:
Expected response header (example):
You can change httpStatus (for example, to 404) and reapply to modify abort behavior.

Summary / Best practices

  • Ambient Mode uses ztunnel for L4 routing and a waypoint Envoy proxy for L7 features.
  • Sidecar-mode primitives (VirtualService subsets + DestinationRules) do not reliably provide the same split semantics in Ambient Mode.
  • For HTTP request splitting in Ambient Mode, prefer the Kubernetes Gateway API HTTPRoute attached to the catch-all service, with backendRef services (one service per deployment/version).
  • For L7 fault injection (delay/abort), the waypoint proxy combined with VirtualService often works — but confirm support per Istio release.
  • Ambient Mode is evolving; always consult the Istio docs and release notes for current API support and recommended patterns.
Further reading and references:

Watch Video

Practice Lab