Terraform kubernetes命令在专用GKE集群中失败



我已经使用地形资源"google_container_cluster"启动了一个私有GKE集群,其中包含private_cluster_config块。

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

我使用地形资源"kubernetes_namespace"添加了k8s命名空间。

我还正确设置了所有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,命名空间创建得很好✅✅✅

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]

它间歇性地抛出以下错误。❌ ❌ ❌

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

它有时通过,有时失败-间歇性


您建议我应该在哪里查找以修复此间歇性错误?

在我的案例中,问题的来源是:

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"
}

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

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

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} )"
}
}

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

谨致问候。

相关内容

  • 没有找到相关文章

最新更新