如何在 terraform 中导入生成的 Kubernetes 集群的命名空间
Posted
技术标签:
【中文标题】如何在 terraform 中导入生成的 Kubernetes 集群的命名空间【英文标题】:How to import a generated Kubernetes cluster's namespace in terraform 【发布时间】:2020-01-11 21:46:42 【问题描述】:在我的 terraform 配置文件中,我在 GKE 上创建了一个 Kubernetes 集群,创建后,设置一个 Kubernetes 提供程序以访问所述集群并执行各种操作,例如设置命名空间。
问题是在没有 terraform 的集群中创建了一些新的命名空间,现在我尝试将这些命名空间导入我的状态似乎由于无法连接到集群而失败,我认为这是由于以下原因(取自导入命令的 Terraform 官方文档):
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"
导入命令的结果如下:
错误:获取http://localhost/api/v1/namespaces/my_new_namespace:拨号tcp [::1]:80:连接:连接被拒绝
很明显,它注定要失败,因为它试图访问localhost
,而不是实际的集群 IP 和配置。
这个用例有什么解决方法吗?
提前致谢。
【问题讨论】:
您可以在导入资源时从已知输出中临时硬编码提供程序配置,然后在完成后恢复您的更改。 你可以通过 api 访问你的集群吗? kubectl getgcloud container clusters get-credentials
来生成本地kubeconfig,我相信terraform import
命令将使用您的本地kubeconfig/context 我猜module.gke.endpoint
不会与localhost
一起返回,所以它是从某处……
【参考方案1】:
(1) 在您的 kubeconfig 文件中为您的 GKE 集群创建一个条目。
gcloud container clusters get-credentials cluster-name
见:https://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"
【讨论】:
这不起作用,因为导入在计划或应用的上下文之外运行以上是关于如何在 terraform 中导入生成的 Kubernetes 集群的命名空间的主要内容,如果未能解决你的问题,请参考以下文章
在 Unity 中导入 Blender,如何生成正确的网格对撞机?
如何使用 Terraform 创建没有代入角色策略的 AWS IAM 角色?