如何将现有GKE集群纳入Terraform状态管理以避免资源冲突
解决方案说明
完全不需要为Terraform部署的新项目单独创建集群,你遇到的两个问题都有成熟的落地方案:
问题1:Terraform无集群信息无法交互的解决方法
你不需要将整个GKE集群导入Terraform状态,只需通过数据源关联现有集群的认证信息即可,Terraform会直接调用集群的API交互,不会管理集群本身的生命周期,配置参考如下:
# 配置GCP provider,关联集群所属的项目和区域 provider "google" { project = "你的GCP项目ID" region = "集群所属区域" } # 用数据源读取现有GKE集群的信息,不需要定义集群resource data "google_container_cluster" "existing_cluster" { name = "你的GKE集群名称" location = "集群所属区域" } # 配置Kubernetes provider,用上面读取的集群信息做认证 provider "kubernetes" { host = data.google_container_cluster.existing_cluster.endpoint token = data.google_client_config.current.access_token cluster_ca_certificate = base64decode(data.google_container_cluster.existing_cluster.master_auth[0].cluster_ca_certificate) } data "google_client_config" "current" {}
问题2:避免和集群已有资源冲突的解决方法
你也不需要导入集群内所有已有的资源,只要做好资源隔离就能完全规避冲突:
- 给Terraform管理的资源单独划分专属命名空间,所有新增的Terraform资源都部署在该命名空间下,和原有业务资源物理隔离,从根源上避免同名冲突
- 统一给Terraform管理的资源加专属标签,比如
managed-by=terraform,方便后续做资源归属的区分 - 每次执行
terraform apply前先跑terraform plan确认变更,plan中只会显示Terraform要新增/修改/删除的资源,确认没有意外操作再执行apply即可 - 如果确实需要用Terraform接管个别已有的存量资源,单独导入对应资源即可,不需要批量导入全集群资源,导入单资源的命令参考:
terraform import kubernetes_config_map.my_cm <对应命名空间>/<configmap名称>
最佳实践:如果只是要往集群里新增资源,不需要接管任何存量资源,直接用专属命名空间部署Terraform资源即可,操作成本最低,也不会对现有业务造成任何影响。
内容的提问来源于stack exchange,提问作者SyntioBen
相关产品推荐
相关产品推荐

