Azure AKS Infrastructure Setup Guide
CLI Setup
Prerequisites
- Azure CLI v2.50+
kubectl
v1.25+
Resource Group Setup
- Create Resource Group:
bash
az group create \
--name prime-edm-rg \
--location eastus
Network Setup
- 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
- 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
- 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)
- Get credentials:
bash
az aks get-credentials \
--resource-group prime-edm-rg \
--name prime-edm-cluster
Node Pool Management
- 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
- 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
}