production-platform-Azure

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

Context

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.

Decision

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:

Network security groups:

Outbound traffic uses the default standard load balancer, which gets one public IP address.

Consequences

Open questions

Alternatives considered