如何通过HCP完成AKS集群认证以部署Helm及K8s资源?
问题描述
我尝试在AKS集群上部署Helm Chart及K8s资源,采用了Terraform示例中的如下provider配置:
data "azurerm_kubernetes_cluster" "info" { depends_on = [module.aks] name = "${var.app}-${var.environment_prefix}-aks" resource_group_name = module.resource_group.name } provider "helm" { kubernetes { host = data.azurerm_kubernetes_cluster.info.kube_config.0.host client_certificate = base64decode(data.azurerm_kubernetes_cluster.info.kube_config.0.client_certificate) client_key = base64decode(data.azurerm_kubernetes_cluster.info.kube_config.0.client_key) cluster_ca_certificate = base64decode(data.azurerm_kubernetes_cluster.info.kube_config.0.cluster_ca_certificate) } } provider "kubernetes" { host = data.azurerm_kubernetes_cluster.info.kube_config.0.host client_certificate = base64decode(data.azurerm_kubernetes_cluster.info.kube_config.0.client_certificate) client_key = base64decode(data.azurerm_kubernetes_cluster.info.kube_config.0.client_key) cluster_ca_certificate = base64decode(data.azurerm_kubernetes_cluster.info.kube_config.0.cluster_ca_certificate) }
同时使用如下Helm Chart示例配置:
resource "helm_release" "soc_loki" { name = "loki" repository = "https://grafana.github.io/helm-charts" chart = "loki" version = "6.22.0" namespace = "soc-loki" values = [ "${file("./helm_charts_values/loki/values.yaml")}", "${file("./helm_charts_values/loki/env/${var.environment_prefix}.yaml")}" ] }
但在HCP上执行Terraform apply时,持续出现错误:Error: Kubernetes cluster unreachable: the server has asked for the client to provide credentials。我的AKS采用Entra ID authentication with Azure RBAC认证方式,请问该问题是否与AKS认证相关?如何解决?
解决方案
这个问题确实和AKS的Entra ID + Azure RBAC认证方式直接相关。你当前使用的Terraform provider配置基于AKS服务账号证书认证,但启用Entra ID认证的AKS集群已禁用这种证书访问方式,必须改用Azure AD令牌完成身份验证。
具体修复步骤:
- 更新Kubernetes和Helm Provider配置
移除原有证书相关配置,改用Azure AD令牌获取方式,推荐配置如下:
data "azurerm_kubernetes_cluster" "info" { depends_on = [module.aks] name = "${var.app}-${var.environment_prefix}-aks" resource_group_name = module.resource_group.name } # 获取当前Azure AD客户端配置 data "azuread_client_config" "current" {} # 获取AKS集群的用户凭证令牌 data "azurerm_kubernetes_cluster_user_credentials" "aks" { name = data.azurerm_kubernetes_cluster.info.name resource_group_name = data.azurerm_kubernetes_cluster.info.resource_group_name client_id = data.azuread_client_config.current.client_id } provider "kubernetes" { host = data.azurerm_kubernetes_cluster.info.kube_config.0.host cluster_ca_certificate = base64decode(data.azurerm_kubernetes_cluster.info.kube_config.0.cluster_ca_certificate) token = data.azurerm_kubernetes_cluster_user_credentials.aks.kube_config.0.token } provider "helm" { kubernetes { host = data.azurerm_kubernetes_cluster.info.kube_config.0.host cluster_ca_certificate = base64decode(data.azurerm_kubernetes_cluster.info.kube_config.0.cluster_ca_certificate) token = data.azurerm_kubernetes_cluster_user_credentials.aks.kube_config.0.token } }
- 配置HCP执行环境的身份权限
- 运行Terraform的HCP服务主体(或身份)必须拥有AKS集群的Azure RBAC权限,比如
Azure Kubernetes Service Cluster User Role,或自定义权限以允许访问集群资源。 - 确认HCP环境已正确配置Azure身份验证,可通过服务主体密钥、托管身份等方式获取有效的Azure AD令牌。
- 验证权限有效性
在本地使用拥有对应权限的账号执行az aks get-credentials --resource-group <资源组名> --name <AKS集群名> --admin,再运行kubectl get nodes验证权限是否正常,确保HCP使用的身份拥有相同权限。
核心原因说明:
启用Entra ID + Azure RBAC的AKS集群会禁用默认服务账号证书认证,所有集群访问请求必须携带Azure AD签发的有效令牌,且令牌对应的身份必须拥有集群RBAC权限。你之前的配置使用证书,不符合该认证模式要求,因此被集群拒绝访问。
内容的提问来源于stack exchange,提问作者Jatin Mehrotra
相关产品推荐
相关产品推荐

