我是在做一个可以做到以下事情的例子:
-
通过Terraform的google_container_cluster在GKE上创建Kubernetes集群
-
...并继续在其中创建名称空间,我想通过kubernetes_namespace
我不确定的是如何连接新创建的集群和命名空间定义 . 例如,当添加 google_container_node_pool
时,我可以执行类似 cluster = "${google_container_cluster.hosting.name}"
的操作,但我看不到 kubernetes_namespace
的任何类似内容 .
1 回答
从理论上讲,可以像在单个提供程序的上下文中引用资源或数据源一样,从K8S(或任何其他)提供程序中的GCP提供程序引用资源 .
但是在实践中,由于已知的核心错误会破坏跨提供程序依赖性,它可能无法按预期工作,请分别参见https://github.com/hashicorp/terraform/issues/12393和https://github.com/hashicorp/terraform/issues/4149 .
替代解决方案是:
首先使用2阶段申请和target GKE集群,然后使用依赖于它的任何其他东西,即
terraform apply -target=google_container_cluster.primary
然后terraform apply
从K8S配置中分离出GKE集群配置,为它们提供完全隔离的工作流程并通过remote state连接它们 .
/terraform-gke/main.tf
这里我们通过
output
暴露所有必要的配置,并使用后端存储状态,以及这些输出在远程位置,在这种情况下GCS . 这使我们能够在下面的配置中引用它 ./terraform-k8s/main.tf
这里可能或不显而易见的是,在创建/更新任何K8S资源之前必须创建/更新集群(如果此类更新依赖于集群的更新) .
采用第二种方法通常是可取的(即使当/如果错误不是因素并且交叉提供者参考有效),因为它减少了爆炸半径并且定义了更明确的责任 . 这种部署通常是(IMO)让1个人/团队负责管理集群,而另一个人/团队负责管理K8S资源 .
可能肯定会有重叠 - 例如ops希望在新的GKE集群之上部署日志记录和监控基础架构,因此跨供应商依赖性旨在满足此类用例 . 出于这个原因,我建议订阅上面提到的GH问题 .