在我的terraform基础架构中,我根据参数启动了多个Kubernetes集群,然后使用kubernetes提供程序将标准内容安装到这些Kubernetes集群。

当我更改参数并且不再需要集群之一时,terraform无法将其拆除,因为提供程序和资源都在模块中。但是,我没有其他选择,因为我在同一模块中创建了kubernetes集群,并且kubernetes对象全部是每个kubernetes集群。

我能想到的所有解决方案都涉及在我的terraform配置中添加一堆样板。我应该考虑从脚本生成我的Terraform配置吗?

我制作了一个git repo来确切显示我遇到的问题:

https://github.com/bukzor/terraform-gke-k8s-demo

最佳答案

TL; DR

两种解决方案:

  • 使用Terraform
  • 创建两个单独的模块
  • 在创建您的Kubernetes集群的代码和kubernetes资源之间使用插值和depends_on:
    resource "kubernetes_service" "example" {
      metadata {
        name = "my-service"
      }
    
      depends_on = ["aws_vpc.kubernetes"]
    }
    
    resource "aws_vpc" "kubernetes" {
      ...
    }
    

  • 破坏资源时

    您遇到依赖项生命周期问题

    PS:我不知道您用来创建/配置Kubernetes集群的代码,但我想它看起来像这样
  • 为Kubernetes集群编写代码(创建VPC)
  • 应用
  • 编写代码以配置Kubernetes(创建可创建ELB的服务)
  • 应用它
  • 尝试破坏一切=>错误

  • 发生的事情是,通过创建LoadBalancer Service,Kubernetes将在AWS上预配置ELB。但是Terraform不知道,在创建的ELB和Terraform管理的任何其他资源之间没有链接。
    因此,当terraform尝试销毁代码中的资源时,它将尝试销毁VPC。但这不能,因为在VPC中有一个TerraB不知道的ELB。
    首先是要确保Terraform“取消配置” Kubernetes集群,然后销毁集群本身。

    这里有两个解决方案:
  • 使用不同的模块,因此没有依赖项生命周期。例如,第一个模块可以是k8s-infra,另一个可以是k8s-resources。第一个管理Kubernetes的所有squeleton,第一个应用/最后一个销毁。第二个管理集群中的内容,最后应用/销毁。
  • 使用 depends_on 参数显式编写依赖项生命周期

  • 创建资源时

    terraform apply即使没有执行任何操作都无法创建资源时,您也可能遇到依赖项问题。我将用postgres给出另一个示例
  • 编写代码以创建RDS PostgreSQL服务器
  • 与Terraform一起应用
  • 在同一模块中编写代码,以将RDS实例与postgres terraform提供程序
  • 一起提供。
  • 与Terraform一起应用
  • 销毁一切
  • 尝试应用所有内容=>错误

  • 通过稍微调试Terraform,我了解到所有提供程序都是在plan / apply的开头初始化的,因此,如果一个配置无效(API密钥错误/端点不可达),则Terraform将失败。

    这里的解决方案是使用plan / apply命令的target parameter
    Terraform将仅初始化与所应用资源相关的提供程序。
  • 通过AWS提供程序应用RDS代码:terraform apply -target=aws_db_instance
  • 应用所有terraform apply。由于RDS实例已经可以访问,因此PostgreSQL提供程序也可以自行启动
  • 关于kubernetes - 与依赖提供者进行地形改造,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54165344/

    10-16 02:22