Shared ingress trunk — common to all three paths
top-down · three conditions branch into A · B · C · D1 · D2
Kubernetes · Istio Ambient Mesh — Network Datapath — Architecture & Sequence Flows: node-level datapaths, then the message order between components. · interactive original ↗
Conditions
- CONDITION 1 — HTTPRoute backendRef — single or weighted canary? single backendRef → Service (Pod-A) leads to CONDITION 2; weighted backendRefs · canary (RKE2 guest ingress) leads to CONDITION 3.
- CONDITION 2 — Pod-A namespace mesh enrollment? no mesh installed → A · label ENABLED → B · label ABSENT → C.
- CONDITION 3 — weighted split — 90% / 10%? weight 90% · production → D1 · weight 10% · canary → D2 (ServiceEntry).
The message order of each path is on 04 · Sequence flows.
Why is Pod-A drawn first?
These diagrams follow the packet's lifecycle across space boundaries. At the OS level, a Pod isn't really a "thing" — it's a small private room the Linux kernel walls off for it: a Network Namespace (NetNS), giving each Pod its own IP and ports. That's why Pod-A sits before veth-A and kube-proxy.
1 · veth is the room's doorway
The app code runs in the room's user space, so packets are born inside the Pod. A veth pair is a virtual cable: the end inside the room (eth0) is the socket on the wall, and veth-A is the other end, poking out into the host kernel.
2 · kube-proxy is the signage on the public road
Its iptables / IPVS (or eBPF) rules live in the host's shared kernel space. You pack a parcel at home (Pod NetNS) and drop it in the box at your front door (veth-A) — only out on the main road does the courier see the road signs (kube-proxy): "traffic for this Service IP → over to that Pod IP."
In one sentence: Pod-A comes first because it is the traffic's source — a packet must be born inside the Pod's isolated room and step out through veth-A into the host kernel before it can meet istio-cni, kube-proxy, and Calico waiting on the kernel's main road.