Skip to content

AKS workshop: Azure CNI Overlay + Cilium + Azure Kubernetes Application Network

Educational preview lab, not a production reference architecture

Azure Kubernetes Application Network is in public preview (no SLA, best-effort support). Running it on Azure CNI Overlay with the Cilium dataplane is not documented by Microsoft. The lab runs that combination only after you explicitly accept it as an experiment (approval gate G4). A working lab is runtime evidence, not proof of Microsoft support. Read Support & sources before you start.

What you will build

Two Linux AKS Standard clusters in two peered VNets (same region by default). You'll see:

  • Azure CNI Overlay powered by Cilium, with Kubernetes NetworkPolicy (L3/L4) enforced by Cilium.
  • Application Network (managed Istio ambient, no sidecars) with both clusters in one Application Network. It provides:
    • cross-cluster service discovery
    • mTLS with a shared managed root CA
    • L4 identity authorization (ztunnel) and L7 authorization (waypoints)
  • A Gateway API ingress gateway restricted to your IP, with HTTP and HTTPS and routing to local and remote backends.
  • JWT validation and claim routing, weighted cross-cluster routing, fault injection, metrics/logs, lifecycle operations, a safe failure drill, and a full, audited cleanup.
flowchart LR
  you["You (ALLOWED_CLIENT_CIDR)"] -->|HTTP/HTTPS| ig
  subgraph v1["VNet 1 10.10.0.0/16"]
    subgraph c1["AKS cluster 1"]
      ig["ingress gateway"] --> pp["productpage"]
      pp --> wp1["waypoint"]
      ew1["east-west gw (internal)"]
    end
  end
  subgraph v2["VNet 2 10.20.0.0/16"]
    subgraph c2["AKS cluster 2"]
      ew2["east-west gw (internal)"] --> rv["reviews v2/v3, ratings"]
    end
  end
  v1 <-->|VNet peering| v2
  wp1 -->|"mTLS (HBONE)"| ew2
  an["Application Network<br/>(Azure-managed control plane + CA)"] -.-> c1
  an -.-> c2

Peering provides underlay reachability. Application Network provides service discovery, workload identity and encrypted mesh traffic. Overlay pod IPs are not routable across peering.

Get the lab

git clone https://github.com/ohadse-work/aks-appnet-cilium-workshop.git
cd aks-appnet-cilium-workshop
cp config/lab.env.example config/lab.env     # edit SUBSCRIPTION_ID, TENANT_ID, LAB_OWNER
scripts/00-check-local-tools.sh              # local tools only
scripts/01-preflight-azure.sh                # READ-ONLY Azure preflight

Then follow the Lab guide module by module. Nothing billable, preview-related or cluster-changing runs without an approval gate, where you type approve <GATE>.

Workshop at a glance

Audience Engineers new to AKS networking and service mesh. Comfortable with a terminal.
Duration About 8 hours of hands-on work. See the agenda for one-day and two-day formats.
Cost Roughly USD 0.80–1.00/hour while both clusters run, plus optional monitoring. Application Network preview pricing isn't published. Not free.
You need An Azure subscription where you can create resource groups and role assignments; macOS or Linux (WSL2 is fine); Azure CLI ≥ 2.86.0, kubectl, kubelogin, jq, curl, openssl
Not installed AKS Istio add-on, self-managed Istio, a second Cilium, ACNS, Cilium mTLS/L7/Cluster Mesh, the AKS app-routing add-on

Modules

# Module Key evidence you'll collect
1 Planning, prerequisites, cost Read-only preflight report
2 Networks and AKS clusters Overlay + Cilium proven from Azure and in-cluster; no kube-proxy
3 Baseline L3/L4 NetworkPolicy Timeouts proven to be policy, not DNS or a missing backend
4 Onboard Application Network Members, ztunnel, east-west reachability, no sidecars
5 Cross-cluster discovery Remote-only service answered by named cluster-2 pods
6 mTLS and identity Shared root CA; plaintext rejected under STRICT
7 Ingress gateway IP-restricted NSG rule; HTTPS with verified cert
8 L4 identity authorization CONN_RESET for the wrong identity with the network open
9 L7 authorization via waypoints 403 RBAC, bypass blocked, ingress gap closed
10 Layered NetworkPolicy + mesh Impostor pod: label passes, identity fails
11 Advanced traffic management 401 vs 403 vs 404; 20/80 split; injected delay/abort
12 Observability and lifecycle Waypoint metrics, access logs, PromQL/KQL
13 Safe failure exercise Endpoint-set behaviour, no failover claims
14 Cleanup Leftover scan: nothing billable left

How to read results

Every exercise classifies each request, so you can tell the enforcing layer apart:

Result Meaning
TIMEOUT / UPSTREAM_CONNECT_TIMEOUT Dropped by NetworkPolicy (Cilium)
CONN_RESET / UPSTREAM_RESET Rejected by ztunnel (mTLS STRICT or L4 identity policy)
RBAC_DENIED (403) L7 AuthorizationPolicy in a waypoint or gateway
JWT_REJECTED (401) Token failed validation
NOT_FOUND (404) Route miss or app 404, never proof of authentication

More in Troubleshooting.