You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Terraform部署AKS至VNET遇user_assigned_identity_id参数不支持错误

问题:在VNET中创建AKS集群时遇到参数不支持错误

错误信息

│ Error: Unsupported argument
│
│   on main.tf line 130, in resource "azurerm_kubernetes_cluster" "aks":
│  130:     user_assigned_identity_id = azurerm_user_assigned_identity.identity.id
│
│ An argument named "user_assigned_identity_id" is not expected here.

现有Terraform代码

data "azurerm_resource_group" "aks-rg" {
  name     = var.resource_group_name
}

resource "azurerm_role_assignment" "role_acrpull" {
  scope                            = azurerm_container_registry.acr.id
  role_definition_name             = "AcrPull"
  principal_id                     = azurerm_kubernetes_cluster.aks.kubelet_identity.0.object_id
  #skip_service_principal_aad_check = true
}

resource "azurerm_container_registry" "acr" {
  name                = var.acr_name
  resource_group_name = data.azurerm_resource_group.aks-rg.name
  location            = var.location
  sku                 = "Standard"
  admin_enabled       = false
}

resource "azurerm_network_security_group" "pusg" {
  name                = "Public_Security_Group"
  location            = var.location
  resource_group_name = data.azurerm_resource_group.aks-rg.name
}

resource "azurerm_virtual_network" "puvnet" {
  name                = "Public_VNET"
  location            = var.location
  resource_group_name = data.azurerm_resource_group.aks-rg.name
  address_space       = ["10.19.0.0/16"]
  dns_servers         = ["10.19.0.4", "10.19.0.5"]
}

resource "azurerm_subnet" "osubnet" {
  name                 = "Outer_Subnet"
  resource_group_name  = data.azurerm_resource_group.aks-rg.name
  address_prefixes     = ["10.19.1.0/24"]
  virtual_network_name = azurerm_virtual_network.puvnet.name
}

resource "azurerm_subnet" "isubnet" {
  name                 = "Inner_Subnet"
  resource_group_name  = data.azurerm_resource_group.aks-rg.name
  address_prefixes     = ["10.19.2.0/24"]
  virtual_network_name = azurerm_virtual_network.puvnet.name
}

resource "azurerm_subnet" "firewall_subnet" {
  name                 = "AzureFirewallSubnet"
  resource_group_name  = data.azurerm_resource_group.aks-rg.name
  virtual_network_name = azurerm_virtual_network.puvnet.name
  address_prefixes     = ["10.19.3.0/24"]
}

resource "azurerm_user_assigned_identity" "identity" {
  resource_group_name = data.azurerm_resource_group.aks-rg.name
  location            = var.location
  name                = "identityh"
}

resource "azurerm_role_assignment" "networkRole" {
  scope                = data.azurerm_resource_group.aks-rg.id
  role_definition_name = "Network Contributor"
  principal_id         = azurerm_user_assigned_identity.identity.principal_id
}

resource "azurerm_route_table" "routeTable" {
  name                = "rt-FWall"
  location            = var.location
  resource_group_name = data.azurerm_resource_group.aks-rg.name
}

resource "azurerm_route" "route1" {
  name                   = "dg-route1"
  resource_group_name    = data.azurerm_resource_group.aks-rg.name
  route_table_name       = azurerm_route_table.routeTable.name
  address_prefix         = "0.0.0.0/0"
  next_hop_type          = "VirtualAppliance"
  next_hop_in_ip_address = azurerm_firewall.firewall.ip_configuration.0.private_ip_address
}

resource "azurerm_subnet_route_table_association" "base" {
  subnet_id      = azurerm_subnet.osubnet.id
  route_table_id = azurerm_route_table.routeTable.id
}

resource "azurerm_public_ip" "firewall_public_ip" {
  name                = "pip-firewall"
  location            = var.location
  resource_group_name = data.azurerm_resource_group.aks-rg.name
  allocation_method   = "Static"
  sku                 = "Standard"
}

resource "azurerm_firewall" "firewall" {
  name                = "public_firewall"
  location            = var.location
  resource_group_name = data.azurerm_resource_group.aks-rg.name
  sku_name            = "AZFW_VNet"
  sku_tier            = "Standard"

  ip_configuration {
    name                 = "ipconfig"
    subnet_id            = azurerm_subnet.firewall_subnet.id
    public_ip_address_id = azurerm_public_ip.firewall_public_ip.id
  }
}

resource "azurerm_kubernetes_cluster" "aks" {
  name                = var.cluster_name
  kubernetes_version  = var.kubernetes_version
  location            = var.location
  resource_group_name = data.azurerm_resource_group.aks-rg.name
  dns_prefix          = var.cluster_name

  network_profile {
    network_plugin = "azure"
    outbound_type  = "userDefinedRouting"
  }

  default_node_pool {
    name                = "system"
    node_count          = var.system_node_count
    vm_size             = "Standard_DS2_v2"
    vnet_subnet_id = azurerm_subnet.osubnet.id
  }

  identity {
    type                      = "UserAssigned"
    user_assigned_identity_id = azurerm_user_assigned_identity.identity.id
  }
}

部署环境

  • 区域:Germany West Central
  • Kubernetes版本:1.24.3
  • Azurerm Provider版本:3.33
  • Terraform版本:1.3

解决方案

1. 修复身份参数错误

Terraform Azurerm Provider 3.x版本中,azurerm_kubernetes_cluster的identity块参数已变更,原user_assigned_identity_id(单数)不再支持,需替换为user_assigned_identities(复数),格式为键值对,键为用户分配身份的ID,值为空对象。

修改后的identity块代码:

identity {
  type = "UserAssigned"
  user_assigned_identities = {
    azurerm_user_assigned_identity.identity.id = {}
  }
}

2. 解决集群创建超时问题

你的AKS使用了userDefinedRouting出站类型,节点依赖防火墙的路由规则访问外部资源完成初始化,但防火墙创建速度慢于AKS,会导致节点无法正常出站从而超时。需添加依赖关系,确保AKS在防火墙创建完成后再部署:

在azurerm_kubernetes_cluster.aks资源中添加depends_on:

resource "azurerm_kubernetes_cluster" "aks" {
  # 原有代码...

  depends_on = [azurerm_firewall.firewall]
}

3. 验证kubelet身份权限

azurerm_role_assignment.role_acrpull中引用的kubelet_identity在用户分配身份场景下,需确保该身份拥有AcrPull权限。如果集群使用用户分配身份作为kubelet身份,需在default_node_pool中明确指定:

default_node_pool {
  # 原有代码...
  kubelet_identity {
    client_id = azurerm_user_assigned_identity.identity.client_id
    object_id = azurerm_user_assigned_identity.identity.principal_id
  }
}

此时role_acrpull的principal_id可直接引用azurerm_user_assigned_identity.identity.principal_id,避免依赖集群资源的延迟加载。


内容的提问来源于stack exchange,提问作者user19727086

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 09:31:36