An Azure platform for running a service on AKS with Terraform, Argo CD, CI, observability and incident handling.
View the Project on GitHub Franklindot04/production-platform-Azure
The session layer holds the virtual network and the AKS cluster. ADR 0005 chose Azure CNI Overlay: nodes take addresses from the virtual network, and pods take addresses from a separate private range. This record fixes the address ranges, the subnets, how the authorized API range is set, and whether network security groups are used.
With Azure CNI Overlay, each node gets a fixed /24 from the pod range. The size of that block cannot be changed. The pod range must not overlap the cluster subnet or any network connected to the virtual network. The service range must not overlap the pod range, the cluster subnet or connected networks.
The ranges are inputs of the dev session root. Azure accepted them in the first create (ADR 0012): the network and the cluster were created with these ranges. The session layer was then destroyed, so no resource described here exists now.
Virtual network, one per environment:
| Environment | Virtual network | Name |
|---|---|---|
dev |
10.10.0.0/16 |
pp-dev-vnet |
staging |
10.20.0.0/16 (not created) |
pp-staging-vnet |
prod |
10.30.0.0/16 (not created) |
pp-prod-vnet |
The ranges differ per environment, so the networks can be connected later without a renumbering.
Subnets in the dev network:
| Subnet | Range | Status |
|---|---|---|
pp-dev-aks-nodes-snet |
10.10.0.0/24 |
in the Terraform |
| (private endpoints) | 10.10.1.0/24 |
reserved, not in the Terraform |
The node subnet holds the AKS nodes. A /24 gives 251 usable addresses. The cluster is limited to 4 vCPU by the subscription quota (ADR 0003), so it needs a handful of them, including one for an upgrade surge.
Cluster ranges:
| Range | Value |
|---|---|
| Pod range (overlay) | 10.244.0.0/16 |
| Service range | 10.96.0.0/16 |
| DNS service address | 10.96.0.10 |
The pod and service ranges are not routed outside the cluster, so every environment uses the same values. None of the ranges overlap: the three virtual networks, the pod range and the service range are disjoint, and both subnets are inside 10.10.0.0/16.
Authorized API range:
api_authorized_ip_ranges takes a list of CIDR ranges. It has no default. Terraform rejects an empty list, 0.0.0.0/0 and anything that is not a CIDR range.TF_VAR_api_authorized_ip_ranges. It is not committed, because it changes with the maintainer’s address.203.0.113.10/32, an address reserved for documentation.Network security groups:
Outbound traffic uses the default standard load balancer, which gets one public IP address.
kubectl and any Terraform step that calls the cluster.