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

Terraform配置AKS访问ACR角色分配时kubelet_identity为空错误如何解决

问题根因

报错的核心原因是你当前AKS配置使用**服务主体(Service Principal)**进行身份认证,没有启用kubelet托管标识,所以azurerm_kubernetes_cluster.aks.kubelet_identity属性返回空列表,访问索引[0]自然会抛出无效索引错误。

可行解决方案

方案1:直接使用服务主体ID配置角色分配(适配当前配置,改动最小)

你只需要修改azurerm_role_assignment资源的principal_id参数,替换为AKS所用服务主体的客户端ID即可:

resource "azurerm_role_assignment" "aks_to_acr_role" {
  scope                = data.azurerm_container_registry.acr_name.id
  role_definition_name = "AcrPull"
  # 替换原有principal_id配置即可
  principal_id         = azurerm_kubernetes_cluster.aks.service_principal[0].client_id
  skip_service_principal_aad_check = true
}

方案2:改用托管身份部署AKS(Azure推荐最佳实践)

删除AKS资源中的service_principal块,添加identity配置启用系统托管身份,此时kubelet_identity属性会自动填充,原有角色分配代码无需修改:

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

  # 删除原有service_principal块,新增identity配置
  identity {
    type = "SystemAssigned"
  }

  default_node_pool {
    name                = "system"
    node_count          = var.system_node_count
    vm_size             = "Standard_B2ms"
    type                = "VirtualMachineScaleSets"
    availability_zones  = [1, 2, 3]
    enable_auto_scaling = false
  }
}

# 原有角色分配代码不需要改动
resource "azurerm_role_assignment" "aks_to_acr_role" {
  scope                = data.azurerm_container_registry.acr_name.id
  role_definition_name = "AcrPull"
  principal_id         = azurerm_kubernetes_cluster.aks.kubelet_identity[0].object_id
  skip_service_principal_aad_check = true
}

方案3:直接使用AKS原生ACR绑定参数(无需手动配置角色分配,最省事)

azurerm provider的AKS资源内置了ACR绑定参数attach_acr_id,配置后会自动完成权限配置,不需要单独写角色分配资源:

resource "azurerm_kubernetes_cluster" "aks" {
  name                = var.cluster_name
  kubernetes_version  = var.kubernetes_version
  location            = var.location
  resource_group_name = azurerm_resource_group.rg.name
  dns_prefix          = var.cluster_name
  # 新增ACR绑定配置,不需要单独创建角色分配资源
  attach_acr_id = data.azurerm_container_registry.acr_name.id

  service_principal {
    client_id     = var.appId
    client_secret = var.password
  }

  default_node_pool {
    name                = "system"
    node_count          = var.system_node_count
    vm_size             = "Standard_B2ms"
    type                = "VirtualMachineScaleSets"
    availability_zones  = [1, 2, 3]
    enable_auto_scaling = false
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 16:45:04