main.tf (102 lines of code) (raw):
resource "random_string" "acr_suffix" {
length = 8
numeric = true
special = false
upper = false
}
resource "azurerm_container_registry" "this" {
location = var.location
name = coalesce(var.container_registry_name, "cr${random_string.acr_suffix.result}")
resource_group_name = var.resource_group_name
sku = "Premium"
tags = var.tags
}
resource "azurerm_role_assignment" "acr" {
principal_id = azurerm_kubernetes_cluster.this.kubelet_identity[0].object_id
scope = azurerm_container_registry.this.id
role_definition_name = "AcrPull"
skip_service_principal_aad_check = true
}
resource "azurerm_user_assigned_identity" "aks" {
count = length(var.user_assigned_managed_identity_resource_ids) > 0 ? 0 : 1
location = var.location
name = coalesce(var.user_assigned_identity_name, "uami-aks")
resource_group_name = var.resource_group_name
tags = var.tags
}
resource "azurerm_kubernetes_cluster" "this" {
location = var.location
name = "aks-${var.name}"
resource_group_name = var.resource_group_name
automatic_upgrade_channel = "patch"
dns_prefix = var.name
kubernetes_version = var.kubernetes_version
node_os_upgrade_channel = "NodeImage"
oidc_issuer_enabled = true
role_based_access_control_enabled = true
sku_tier = "Free"
tags = var.tags
workload_identity_enabled = true
default_node_pool {
name = "agentpool"
vm_size = "Standard_DS2_v2"
auto_scaling_enabled = true
host_encryption_enabled = true
max_count = 5
max_pods = 110
min_count = 2
orchestrator_version = var.orchestrator_version
os_sku = "Ubuntu"
tags = merge(var.tags, var.agents_tags)
upgrade_settings {
max_surge = "10%"
}
}
dynamic "azure_active_directory_role_based_access_control" {
for_each = var.rbac_aad_azure_rbac_enabled == true ? [1] : []
content {
admin_group_object_ids = var.rbac_aad_admin_group_object_ids
azure_rbac_enabled = var.rbac_aad_azure_rbac_enabled
tenant_id = var.rbac_aad_tenant_id
}
}
identity {
type = "UserAssigned"
identity_ids = length(var.user_assigned_managed_identity_resource_ids) > 0 ? var.user_assigned_managed_identity_resource_ids : azurerm_user_assigned_identity.aks[*].id
}
network_profile {
network_plugin = "kubenet"
load_balancer_sku = "basic"
network_policy = "calico"
}
lifecycle {
ignore_changes = [
kubernetes_version
]
}
}
# The following terraform_data is used to trigger the update of the AKS cluster when the kubernetes_version changes
# This is necessary because the azurerm_kubernetes_cluster resource ignores changes to the kubernetes_version attribute
# because AKS patch versions are upgraded automatically by Azure
# The kubernetes_version_keeper and aks_cluster_post_create resources implement a mechanism to force the update
# when the minor kubernetes version changes in var.kubernetes_version
resource "terraform_data" "kubernetes_version_keeper" {
triggers_replace = {
version = var.kubernetes_version
}
}
resource "azapi_update_resource" "aks_cluster_post_create" {
type = "Microsoft.ContainerService/managedClusters@2024-02-01"
body = {
properties = {
kubernetesVersion = var.kubernetes_version
}
}
resource_id = azurerm_kubernetes_cluster.this.id
lifecycle {
ignore_changes = all
replace_triggered_by = [terraform_data.kubernetes_version_keeper.id]
}
}
# required AVM resources interfaces
resource "azurerm_management_lock" "this" {
count = var.lock != null ? 1 : 0
lock_level = var.lock.kind
name = coalesce(var.lock.name, "lock-${var.lock.kind}")
scope = azurerm_kubernetes_cluster.this.id
notes = var.lock.kind == "CanNotDelete" ? "Cannot delete the resource or its child resources." : "Cannot delete or modify the resource or its child resources."
}