如何在terraform中导入生成的Kubernetes集群的名称空间

iswrvxsc  于 2023-01-12  发布在  Kubernetes
关注(0)|答案(2)|浏览(121)

在我的terraform配置文件中,我在GKE上创建了一个Kubernetes集群,创建后,设置一个Kubernetes提供程序来访问所述集群并执行各种操作,如设置名称空间。
问题是一些新的命名空间是在集群中创建的,而没有使用Terraform,现在我尝试将这些命名空间导入到我的状态中似乎失败了,因为无法连接到集群,我认为这是由于以下原因(摘自Terraform的import命令的官方文档):
Terraform在读取配置文件时的唯一限制是导入提供程序配置不能依赖于非变量输入,例如,提供程序配置不能依赖于数据源。
我用来导入名称空间的命令非常简单:
terraform import kubernetes_namespace.my_new_namespace my_new_namespace
我也试过使用-provdier=""-config="",但无济于事。
我的Kubernetes提供程序配置如下:

provider "kubernetes" {
  version = "~> 1.8"

  host  = module.gke.endpoint
  token = data.google_client_config.current.access_token

  cluster_ca_certificate = base64decode(module.gke.cluster_ca_certificate)
}

下面是我尝试导入的命名空间资源的一个示例:

resource "kubernetes_namespace" "my_new_namespace" {
  metadata {
    name = "my_new_namespace"
  }
}

import命令将导致以下结果:
错误:获取http://localhost/api/v1/namespaces/my_new_namespace:拨号tcp [::1]:80:连接:连接被拒绝
很明显,它注定要失败,因为它试图访问localhost,而不是实际的群集IP和配置。
此使用情形是否有变通方法?
先谢了。

f3temu5u

f3temu5u1#

问题出在动态数据提供程序上。import语句没有访问它的权限。
对于导入过程,必须对提供程序值进行硬编码。
更改此内容:

provider "kubernetes" {
  version                = "~> 1.8"
  host                   = module.gke.endpoint
  token                  = data.google_client_config.current.access_token
  cluster_ca_certificate = base64decode(module.gke.cluster_ca_certificate)
}

致:

provider "kubernetes" {
  version                = "~> 1.8"
  host                   = "https://<ip-of-cluster>"
  token                  = "<token>"
  cluster_ca_certificate = base64decode(<cert>)
  load_config_file       = false
}
  • 可以从gcloud auth print-access-token检索令牌。
  • 可以通过使用terraform state show module.gke.google_container_cluster.your_cluster_resource_name_here检查创建的容器资源来检索IP和证书

对于提供程序版本2+,必须删除load_config_file
就位后,导入并还原对提供程序的更改。

mwecs4sa

mwecs4sa2#

(1)在kubeconfig文件中为GKE集群创建一个条目。

gcloud container clusters get-credentials cluster-name

参见:www.example.comhttps://cloud.google.com/kubernetes-engine/docs/how-to/cluster-access-for-kubectl#generate_kubeconfig_entry
(2)将Terraform Kubernetes提供程序指向您的kubeconfig:

provider "kubernetes" {
  config_path = "~/.kube/config"
}

相关问题