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
相关产品推荐
相关产品推荐

