Scenarios/AKS-Secure-Baseline-PrivateCluster/Terraform/06-AKS-Cluster/main.tf (214 lines of code) (raw):
locals {
domain_name = {
akv = "privatelink.vaultcore.azure.net",
acr = "privatelink.azurecr.io",
aks = "azmk8s.io"
contoso = "private.contoso.com"
}
vnetLzId = var.deployingAllInOne == true ? var.vnetLzId : data.azurerm_virtual_network.vnet-lz.0.id
snetAksId = var.deployingAllInOne == true ? var.snetAksId : data.azurerm_subnet.snet-aks.0.id
dnszoneAksId = var.deployingAllInOne == true ? var.dnszoneAksId : data.azurerm_private_dns_zone.dnszone-aks.0.id
dnszoneContosoId = var.deployingAllInOne == true ? var.dnszoneContosoId : data.azurerm_private_dns_zone.dnszone-contoso.0.id
acrId = var.deployingAllInOne == true ? var.acrId : data.azurerm_container_registry.acr.0.id
akvId = var.deployingAllInOne == true ? var.akvId : data.azurerm_key_vault.akv.0.id
}
data "azurerm_client_config" "tenant" {}
# data "azurerm_resource_group" "rg" {
# name = var.rgLzName
# }
data "azurerm_virtual_network" "vnet-lz" {
count = var.deployingAllInOne == true ? 0 : 1
name = var.vnetLzName
resource_group_name = var.rgLzName
}
data "azurerm_subnet" "snet-aks" {
count = var.deployingAllInOne == true ? 0 : 1
name = "snet-aks"
virtual_network_name = var.vnetLzName
resource_group_name = var.rgLzName
}
data "azurerm_private_dns_zone" "dnszone-aks" {
count = var.deployingAllInOne == true ? 0 : 1
name = "privatelink.${var.location}.${local.domain_name.aks}"
resource_group_name = var.rgLzName
}
data "azurerm_private_dns_zone" "dnszone-contoso" {
count = var.deployingAllInOne == true ? 0 : 1
name = local.domain_name.contoso
resource_group_name = var.rgLzName
}
data "azurerm_container_registry" "acr" {
count = var.deployingAllInOne == true ? 0 : 1
name = var.acrName
resource_group_name = var.rgLzName
}
data "azurerm_key_vault" "akv" {
count = var.deployingAllInOne == true ? 0 : 1
name = var.akvName
resource_group_name = var.rgLzName
}
module "naming" {
source = "Azure/naming/azurerm"
version = "~> 0.3"
suffix = ["lz"]
}
module "avm-res-managedidentity-userassignedidentity" {
source = "Azure/avm-res-managedidentity-userassignedidentity/azurerm"
version = "0.3.3"
name = module.naming.user_assigned_identity.name_unique
location = var.location # data.azurerm_resource_group.rg.location
resource_group_name = var.rgLzName # data.azurerm_resource_group.rg.name
}
resource "azurerm_role_assignment" "role-assignment-dnszone" {
scope = local.dnszoneAksId # data.azurerm_private_dns_zone.dnszone-aks.id
role_definition_name = "Private DNS Zone Contributor"
principal_id = module.avm-res-managedidentity-userassignedidentity.principal_id
}
resource "azurerm_role_assignment" "role-assignment-vnetcontrib" {
scope = local.vnetLzId # data.azurerm_virtual_network.vnet-lz.id
role_definition_name = "Network Contributor"
principal_id = module.avm-res-managedidentity-userassignedidentity.principal_id
}
module "avm-res-operationalinsights-workspace" {
source = "Azure/avm-res-operationalinsights-workspace/azurerm"
version = "0.4.1"
name = module.naming.log_analytics_workspace.name_unique
resource_group_name = var.rgLzName # data.azurerm_resource_group.rg.name
location = var.location # data.azurerm_resource_group.rg.location
log_analytics_workspace_retention_in_days = 30
log_analytics_workspace_sku = "PerGB2018"
log_analytics_workspace_identity = {
type = "SystemAssigned"
}
}
resource "azurerm_kubernetes_cluster" "aks-cluster" {
name = module.naming.kubernetes_cluster.name_unique
resource_group_name = var.rgLzName # data.azurerm_resource_group.rg.name
location = var.location # data.azurerm_resource_group.rg.location
dns_prefix_private_cluster = module.naming.kubernetes_cluster.name_unique
private_cluster_enabled = true
private_dns_zone_id = local.dnszoneAksId # data.azurerm_private_dns_zone.dnszone-aks.id
azure_policy_enabled = true
kubernetes_version = "1.30"
local_account_disabled = true
oidc_issuer_enabled = true
sku_tier = "Standard"
workload_identity_enabled = true
automatic_channel_upgrade = "patch"
role_based_access_control_enabled = true
http_application_routing_enabled = true
web_app_routing {
dns_zone_ids = [local.dnszoneContosoId] # data.azurerm_private_dns_zone.dnszone-contoso.id]
}
azure_active_directory_role_based_access_control {
managed = true
azure_rbac_enabled = true
admin_group_object_ids = [var.adminGroupObjectIds]
}
default_node_pool {
name = "default"
vm_size = "Standard_DS2_v2"
os_disk_size_gb = 30
os_sku = "Ubuntu"
min_count = 1
max_count = 3
enable_auto_scaling = true
max_pods = 110
only_critical_addons_enabled = true
vnet_subnet_id = local.snetAksId
zones = ["1", "2", "3"]
}
auto_scaler_profile {
balance_similar_node_groups = true
}
key_vault_secrets_provider {
secret_rotation_enabled = true
}
identity {
type = "UserAssigned"
identity_ids = [
module.avm-res-managedidentity-userassignedidentity.resource.id,
]
}
network_profile {
network_plugin = "azure"
network_plugin_mode = "overlay"
load_balancer_sku = "standard"
}
oms_agent {
log_analytics_workspace_id = module.avm-res-operationalinsights-workspace.resource.id
}
depends_on = [
azurerm_role_assignment.role-assignment-dnszone,
]
lifecycle {
ignore_changes = [ default_node_pool.0.upgrade_settings ]
}
}
resource "azurerm_kubernetes_cluster_node_pool" "nodepool" {
name = "user"
kubernetes_cluster_id = azurerm_kubernetes_cluster.aks-cluster.id
vm_size = "Standard_DS2_v2"
os_disk_size_gb = 30
os_sku = "Ubuntu"
min_count = 1
max_count = 3
enable_auto_scaling = true
max_pods = 250
mode = "User"
vnet_subnet_id = local.snetAksId
zones = ["1", "2", "3"]
}
resource "azurerm_role_assignment" "role-assignment-acr" {
principal_id = azurerm_kubernetes_cluster.aks-cluster.kubelet_identity[0].object_id
role_definition_name = "AcrPull"
scope = local.acrId
skip_service_principal_aad_check = true
}
resource "azurerm_role_assignment" "role-assignment-akv" {
principal_id = azurerm_kubernetes_cluster.aks-cluster.key_vault_secrets_provider[0].secret_identity[0].object_id
role_definition_name = "Key Vault Secrets User"
scope = local.akvId
skip_service_principal_aad_check = true
}
resource "azurerm_role_assignment" "role-assignment-private-dns" {
principal_id = azurerm_kubernetes_cluster.aks-cluster.web_app_routing[0].web_app_routing_identity[0].object_id
role_definition_name = "Private DNS Zone Contributor"
scope = local.dnszoneContosoId
skip_service_principal_aad_check = true
}
resource "azurerm_monitor_diagnostic_setting" "diagnostic-aks" {
name = module.naming.monitor_diagnostic_setting.name_unique
target_resource_id = azurerm_kubernetes_cluster.aks-cluster.id
log_analytics_workspace_id = module.avm-res-operationalinsights-workspace.resource.id
enabled_log {
category = "kube-apiserver"
}
enabled_log {
category = "kube-controller-manager"
}
enabled_log {
category = "kube-scheduler"
}
enabled_log {
category = "kube-audit"
}
enabled_log {
category = "kube-audit-admin"
}
enabled_log {
category = "cluster-autoscaler"
}
enabled_log {
category = "guard"
}
enabled_log {
category = "csi-azuredisk-controller"
}
enabled_log {
category = "csi-azurefile-controller"
}
enabled_log {
category = "csi-snapshot-controller"
}
metric {
category = "AllMetrics"
}
}