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

Terraform操作Azure Kubernetes服务时出现localhost连接拒绝错误

问题分析与解决方法

你的核心问题是Terraform的Kubernetes Provider没有正确加载Azure AKS集群的API地址, fallback到了默认的localhost:80,导致连接拒绝。以下是具体排查方向和解决步骤:

可能原因及对应解决方法

1. 验证data.azurerm_kubernetes_cluster.cluster的kube_config有效性

首先确认Terraform的data资源是否正确获取到了AKS集群的配置:

  • 执行terraform console,输入以下命令查看data资源的输出:
    data.azurerm_kubernetes_cluster.cluster.kube_config
    
  • 如果输出的host字段为空或指向localhost,说明data资源没有正确关联到你的AKS集群。检查data "azurerm_kubernetes_cluster" "cluster"的定义,确保name和resource_group_name参数完全匹配Azure门户中的集群名称和资源组名称。

2. 强制Provider依赖data资源

Kubernetes Provider初始化可能早于data资源获取集群信息,导致配置未生效。在Kubernetes Provider块中添加依赖声明:

provider "kubernetes" {
  host                   = data.azurerm_kubernetes_cluster.cluster.kube_config.0.host
  client_certificate     = base64decode(data.azurerm_kubernetes_cluster.cluster.kube_config.0.client_certificate)
  client_key             = base64decode(data.azurerm_kubernetes_cluster.cluster.kube_config.0.client_key)
  cluster_ca_certificate = base64decode(data.azurerm_kubernetes_cluster.cluster.kube_config.0.cluster_ca_certificate)
  depends_on = [data.azurerm_kubernetes_cluster.cluster] # 强制依赖data资源
}

3. 重置Terraform Provider配置

如果之前的Provider配置被缓存,可能导致错误的localhost地址残留:

  • 执行terraform init -reconfigure,重新初始化Provider,清除旧的缓存配置。
  • 检查.terraform/terraform.tfstate文件中Kubernetes Provider的host字段,确认是否为AKS集群的正确API地址。

4. 排查多Provider实例冲突

如果代码中存在多个provider "kubernetes"块,或者部分Kubernetes资源未指定Provider,可能会使用默认的空配置(指向localhost):

  • 确保所有kubernetes_service等资源都明确关联到正确的Provider,例如:
    resource "kubernetes_service" "<service name>" {
      provider = kubernetes # 指定使用配置好的Kubernetes Provider
      # ... 其他配置
    }
    
  • 检查代码中是否有未配置的Kubernetes Provider实例,避免默认行为干扰。

5. 验证AKS集群的kubeconfig可用性

通过Azure CLI直接获取集群配置,对比Terraform返回的信息:

  • 执行命令:
    az aks get-credentials --name <cluster-name> --resource-group <rg-name> --admin --file -
    
  • 对比输出中的server字段(对应Terraform的host)、证书信息是否与Terraform data资源返回的一致。如果不一致,检查AKS集群是否有API地址变更,或者Terraform使用的服务主体是否有足够权限读取集群配置。

错误信息回顾

╷
│ Error: Get "http://localhost/api/v1/namespaces/default/services/<service name>": dial tcp [::1]:80: connect: connection refused
│ 
│   with kubernetes_service.<service name>,
│   on main.tf line 132, in resource "kubernetes_service" "<service name>":
│  132: resource "kubernetes_service" "<service name>" {
│ 
╵

你的Provider配置

terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "3.72.0"
    }
    kubernetes = {
      source  = "hashicorp/kubernetes"
      version = "2.23.0"
    }
    cloudflare = {
      source  = "cloudflare/cloudflare"
      version = "4.15.0"
    }
    random = {
      source = "hashicorp/random"
    }
  }
}

provider "azurerm" {
  features {}
}

provider "cloudflare" {
  api_token = var.CLOUDFLARE_API_TOKEN
}

...

provider "kubernetes" {
  host                   = data.azurerm_kubernetes_cluster.cluster.kube_config.0.host
  client_certificate     = base64decode(data.azurerm_kubernetes_cluster.cluster.kube_config.0.client_certificate)
  client_key             = base64decode(data.azurerm_kubernetes_cluster.cluster.kube_config.0.client_key)
  cluster_ca_certificate = base64decode(data.azurerm_kubernetes_cluster.cluster.kube_config.0.cluster_ca_certificate)
}

...

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 00:16:01