1

我已经使用带有块的terraform 资源启动了一个私有 GKE 集群"google_container_cluster"private_cluster_config

我添加master_authorized_networks_config了允许在 GKE 的授权网络中使用我自己的 IP 地址。

我已经使用 terraform resource添加了k8s 命名空间"kubernetes_namespace"

我还正确设置了所有 google、kubernetes 提供程序、k8s 令牌、cluster_ca_certificate 等,并且命名空间确实是由这个 terraform 提供的。


resource "google_container_cluster" "k8s_cluster" {
  # .....
  # .....
  private_cluster_config {
    enable_private_nodes = true
    enable_private_endpoint = false
    master_ipv4_cidr_block = "172.16.0.0/28"
  }
  ip_allocation_policy { } # enables VPC-native
  master_authorized_networks_config {
    cidr_blocks {
      {
        cidr_block = "0.0.0.0/0"
        display_name = "World"
      }
    }
  }
  # .....
  # .....
}
data "google_client_config" "google_client" {}

data "google_container_cluster" "k8s_cluster" {
  name     = google_container_cluster.k8s_cluster.name
  location = var.location
}

provider "kubernetes" {
  # following this example https://www.terraform.io/docs/providers/google/d/datasource_client_config.html#example-usage-configure-kubernetes-provider-with-oauth2-access-token
  version = "1.11.1"
  load_config_file = false
  host = google_container_cluster.k8s_cluster.endpoint
  token = data.google_client_config.google_client.access_token
  cluster_ca_certificate = base64decode(
    data.google_container_cluster.k8s_cluster.master_auth.0.cluster_ca_certificate
  )
}

resource "kubernetes_namespace" "namespaces" {
  depends_on = [google_container_node_pool.node_pool]
  for_each = ["my-ns"]
  metadata {
    name = each.value
  }
}

然后我跑terraform apply了,命名空间创建得很好✅✅✅</p>

kubernetes_namespace.namespaces["my-ns"]: Creating...
kubernetes_namespace.namespaces["my-ns"]: Creation complete after 1s [id=my-ns]

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

但是,当我运行terraform applyterraform plan再次运行并且 terraform 尝试刷新命名空间资源时,

data.google_container_cluster.k8s_cluster: Refreshing state...
kubernetes_namespace.namespaces["my-ns"]: Refreshing state... [id=my-ns]

它间歇性地抛出以下错误。❌❌❌</p>

Error: Get http://localhost/api/v1/namespaces/my-ns: dial tcp 127.0.0.1:80: connect: connection refused

它有时会过去,有时会失败 -间歇性地


你会建议我在哪里解决这个间歇性错误?

4

3 回答 3

1

就我而言,问题的根源是:

Terraform 在读取配置文件时的唯一限制是导入提供程序配置不能依赖于非变量输入

在您的情况下,您的 kubernetesprovider块有几个配置选项是变量:

  host = google_container_cluster.k8s_cluster.endpoint
  token = data.google_client_config.google_client.access_token

我的解决方法是创建一个 kubeconfig.yaml 文件,并将提供程序配置临时替换为以下内容:

provider "kubernetes" {
  config_path = "kubeconfig.yaml"
}

这允许我运行导入,然后我恢复了之前基于变量的配置。

于 2020-09-08T21:17:00.713 回答
0

这可能是 k8s 上下文的问题。您应该创建专用的唯一 k8s 上下文来访问您的 GKE 集群并在 terraform 提供程序中指定它

provider "kubernetes" {
  config_context = var.K8S_CONTEXT
  version        = "1.10"
}

检查kubectl config get-contexts以获取所有您的 k8s 上下文的列表。

Terraform 资源可能有助于自动创建 GKE 的上下文

resource "null_resource" "local_k8s_context" {
  depends_on = [google_container_cluster.gke_cluster_0]
  provisioner "local-exec" {
    command = "gcloud container clusters get-credentials ${var.GKE_CLUSTER_NAME} --project=${var.GCP_PROJECT_ID} --zone=${var.GKE_MASTER_REGION} && ( kubectl config delete-context ${var.K8S_CONTEXT}; kubectl config rename-context gke_${var.GCP_PROJECT_ID}_${var.GKE_MASTER_REGION}_${var.GKE_CLUSTER_NAME} ${var.K8S_CONTEXT} )"
  }
}
于 2020-04-12T09:17:19.670 回答
0

我认为您可以在https://github.com/terraform-providers/terraform-provider-google/issues上报告问题,这是报告 Terraform 和 GPC 问题的好地方。

问候。

于 2020-04-16T21:31:54.263 回答