Skip to content

Azure AKS Infrastructure Setup Guide

CLI Setup

Prerequisites

  • Azure CLI v2.50+
  • kubectl v1.25+

Resource Group Setup

  1. Create Resource Group:
bash
az group create \
  --name prime-edm-rg \
  --location eastus

Network Setup

  1. Create Virtual Network:
bash
az network vnet create \
  --resource-group prime-edm-rg \
  --name prime-edm-vnet \
  --address-prefixes 10.0.0.0/16 \
  --subnet-name prime-edm-subnet \
  --subnet-prefix 10.0.0.0/24
  1. Create Network Security Group:
bash
az network nsg create \
  --resource-group prime-edm-rg \
  --name prime-edm-nsg

az network nsg rule create \
  --resource-group prime-edm-rg \
  --nsg-name prime-edm-nsg \
  --name allow-https \
  --priority 100 \
  --destination-port-ranges 443

AKS Cluster Setup

  1. Create AKS cluster:
bash
az aks create \
  --resource-group prime-edm-rg \
  --name prime-edm-cluster \
  --node-count 3 \
  --enable-addons monitoring \
  --generate-ssh-keys \
  --node-vm-size Standard_DS2_v2 \
  --network-plugin azure \
  --vnet-subnet-id $(az network vnet subnet show -g prime-edm-rg --vnet-name prime-edm-vnet --name prime-edm-subnet --query id -o tsv)
  1. Get credentials:
bash
az aks get-credentials \
  --resource-group prime-edm-rg \
  --name prime-edm-cluster

Node Pool Management

  1. Add node pool:
bash
az aks nodepool add \
  --resource-group prime-edm-rg \
  --cluster-name prime-edm-cluster \
  --name prodpool \
  --node-count 3 \
  --node-vm-size Standard_DS3_v2
  1. Enable cluster autoscaler:
bash
az aks update \
  --resource-group prime-edm-rg \
  --name prime-edm-cluster \
  --enable-cluster-autoscaler \
  --min-count 3 \
  --max-count 6

Terraform Setup

Prerequisites

  • Terraform v1.0+
  • Azure CLI configured

Directory Structure

terraform/
├── main.tf
├── variables.tf
├── outputs.tf
├── providers.tf
└── modules/
    ├── network/
    ├── aks/
    └── node_pools/

Provider Configuration (providers.tf)

hcl
terraform {
  required_version = ">= 1.0"
  
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "~> 3.0"
    }
  }
}

provider "azurerm" {
  features {}
}

Variables (variables.tf)

hcl
variable "location" {
  description = "Azure region"
  type        = string
  default     = "eastus"
}

variable "resource_group_name" {
  description = "Resource group name"
  type        = string
  default     = "prime-edm-rg"
}

variable "cluster_name" {
  description = "AKS cluster name"
  type        = string
  default     = "prime-edm-cluster"
}

variable "vnet_address_space" {
  description = "VNet address space"
  type        = list(string)
  default     = ["10.0.0.0/16"]
}

variable "node_pools" {
  description = "AKS node pools configuration"
  type = map(object({
    vm_size    = string
    node_count = number
    min_count  = number
    max_count  = number
  }))
  default = {
    default = {
      vm_size    = "Standard_DS2_v2"
      node_count = 3
      min_count  = 1
      max_count  = 5
    }
  }
}

Main Configuration (main.tf)

hcl
resource "azurerm_resource_group" "main" {
  name     = var.resource_group_name
  location = var.location
}

module "network" {
  source = "./modules/network"

  resource_group_name = azurerm_resource_group.main.name
  location           = var.location
  vnet_name          = "${var.cluster_name}-vnet"
  address_space      = var.vnet_address_space
}

module "aks" {
  source = "./modules/aks"

  resource_group_name = azurerm_resource_group.main.name
  location           = var.location
  cluster_name       = var.cluster_name
  subnet_id          = module.network.subnet_id
  node_pools         = var.node_pools
}

Network Module (modules/network/main.tf)

hcl
resource "azurerm_virtual_network" "main" {
  name                = var.vnet_name
  address_space       = var.address_space
  location           = var.location
  resource_group_name = var.resource_group_name
}

resource "azurerm_subnet" "main" {
  name                 = "${var.vnet_name}-subnet"
  resource_group_name  = var.resource_group_name
  virtual_network_name = azurerm_virtual_network.main.name
  address_prefixes     = [cidrsubnet(var.address_space[0], 8, 1)]
}

resource "azurerm_network_security_group" "main" {
  name                = "${var.vnet_name}-nsg"
  location           = var.location
  resource_group_name = var.resource_group_name

  security_rule {
    name                       = "allow-https"
    priority                   = 100
    direction                  = "Inbound"
    access                     = "Allow"
    protocol                   = "Tcp"
    source_port_range         = "*"
    destination_port_range    = "443"
    source_address_prefix     = "*"
    destination_address_prefix = "*"
  }
}

AKS Module (modules/aks/main.tf)

hcl
resource "azurerm_kubernetes_cluster" "main" {
  name                = var.cluster_name
  location           = var.location
  resource_group_name = var.resource_group_name
  dns_prefix         = var.cluster_name

  default_node_pool {
    name                = "default"
    vm_size            = var.node_pools["default"].vm_size
    node_count         = var.node_pools["default"].node_count
    enable_auto_scaling = true
    min_count          = var.node_pools["default"].min_count
    max_count          = var.node_pools["default"].max_count
    vnet_subnet_id     = var.subnet_id
  }

  identity {
    type = "SystemAssigned"
  }

  network_profile {
    network_plugin = "azure"
    network_policy = "azure"
  }
}

resource "azurerm_kubernetes_cluster_node_pool" "additional" {
  for_each = {
    for name, pool in var.node_pools :
    name => pool if name != "default"
  }

  name                  = each.key
  kubernetes_cluster_id = azurerm_kubernetes_cluster.main.id
  vm_size              = each.value.vm_size
  node_count           = each.value.node_count
  enable_auto_scaling  = true
  min_count           = each.value.min_count
  max_count           = each.value.max_count
  vnet_subnet_id      = var.subnet_id
}

Released under the MIT License.