私有Azure AKS集群无法访问:Terraform执行Helm命令报错求助
解决私有K8s集群(AKS)Terraform Helm访问问题
你的错误源于本地环境无法解析AKS私有集群的私有链接域名——私有集群的API端点仅在所属VNet内可解析和访问。无需修改集群私有属性,可通过以下方案解决:
方案1:在集群所属VNet内的虚拟机执行Terraform
这是最直接的方式,VNet内的机器可正常解析私有DNS并访问集群API:
- 在AKS所在VNet中创建一台虚拟机(确保子网有权限访问集群API)
- 在虚拟机上安装Terraform、Helm和Azure CLI
- 登录Azure CLI并获取AKS的kubeconfig:
az aks get-credentials --name <集群名> --resource-group <资源组名> - 将你的Terraform配置和values文件上传到虚拟机
- 执行
terraform init和terraform apply
方案2:通过VPN/专线打通本地与集群VNet
建立本地网络和AKS所属VNet的私有连接,让本地环境能访问VNet内资源:
- 配置Azure VPN Gateway(或ExpressRoute专线),将本地网络与AKS VNet连接
- 确保本地DNS设置将AKS私有域名的解析请求转发到VNet的DNS服务器(Azure私有DNS区域的DNS地址)
- 本地获取AKS的kubeconfig:
az aks get-credentials --name <集群名> --resource-group <资源组名> - 直接在本地执行Terraform命令即可
方案3:使用Azure Bastion端口转发访问集群
通过Bastion建立到AKS控制平面的隧道,实现本地间接访问:
- 获取AKS控制平面的资源ID:
az aks show --name <集群名> --resource-group <资源组名> --query id -o tsv
- 启动Bastion隧道,将本地端口8443转发到集群API的443端口:
az network bastion tunnel --name <Bastion名称> --resource-group <Bastion资源组名> --target-resource-id <AKS控制平面ID> --port 443 --local-port 8443
- 修改本地kubeconfig中的
server字段为https://localhost:8443 - 执行Terraform命令,此时Helm Provider会通过隧道访问集群
方案4:配置Terraform远程执行环境
借助远程执行功能,让部署操作在VNet内的节点上完成:
- 在VNet内创建一台虚拟机作为执行节点
- 配置Terraform使用远程执行模式,或借助Azure DevOps等流水线,将执行环境部署在VNet内的代理节点上
- 由代理节点直接访问集群并执行Terraform部署
补充:Helm Provider的正确配置
无论采用哪种方案,都需确保Terraform的Helm Provider能正确获取集群凭证。可直接引用Azure Provider的集群数据配置:
data "azurerm_kubernetes_cluster" "aks_cluster" { name = "your-aks-cluster-name" resource_group_name = "your-resource-group-name" } provider "helm" { kubernetes { host = data.azurerm_kubernetes_cluster.aks_cluster.kube_config.0.host client_certificate = base64decode(data.azurerm_kubernetes_cluster.aks_cluster.kube_config.0.client_certificate) client_key = base64decode(data.azurerm_kubernetes_cluster.aks_cluster.kube_config.0.client_key) cluster_ca_certificate = base64decode(data.azurerm_kubernetes_cluster.aks_cluster.kube_config.0.cluster_ca_certificate) } } resource "helm_release" "ingress-nginx" { name = "ingress-nginx" namespace = "ingress-nginx" create_namespace = true repository = "https://kubernetes.github.io/ingress-nginx" chart = "ingress-nginx" values = [ file("ingress-nginx-values.yaml") ] }
内容的提问来源于stack exchange,提问作者The Engineer
相关产品推荐
相关产品推荐

