与依赖提供者进行地形改造

buk*_*zor 2 kubernetes terraform terraform-provider-kubernetes

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

当我更改参数并且不再需要其中一个集群时,terraform 无法将其拆除,因为提供程序和资源都在模块中。然而,我没有看到替代方案,因为我在同一模块中创建了 kubernetes 集群,并且 kubernetes 对象都是每个 kubernetes 集群的。

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


我制作了一个 git 存储库,它准确地显示了我遇到的问题:

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

Que*_*vel 6

长话短说

两种解决方案:

  1. 使用 Terraform 创建两个独立的模块
  2. 在创建 Kubernetes 集群的代码和 kubernetes 资源之间使用插值和 dependent_on:

    resource "kubernetes_service" "example" {
      metadata {
        name = "my-service"
      }
    
      depends_on = ["aws_vpc.kubernetes"]
    }
    
    resource "aws_vpc" "kubernetes" {
      ...
    }
    
    Run Code Online (Sandbox Code Playgroud)

破坏资源时

您遇到依赖生命周期问题

PS:我不知道您用来创建/配置 Kubernetes 集群的代码,但我猜它看起来像这样

  1. 为Kubernetes集群编写代码(创建VPC)
  2. 应用它
  3. 编写用于配置 Kubernetes 的代码(创建一个创建 ELB 的服务)
  4. 应用它
  5. 尝试摧毁一切=>错误

正在发生的事情是,通过创建LoadBalancer 服务,Kubernetes 将在 AWS 上配置 ELB。但 Terraform 不知道这一点,并且创建的 ELB 与 Terraform 管理的任何其他资源之间没有链接。因此,当 terraform 尝试销毁代码中的资源时,它会尝试销毁 VPC。但它不能,因为该 VPC 内有一个 terraform 不知道的 ELB。第一件事是确保 Terraform“取消配置”Kubernetes 集群,然后销毁集群本身。

这里有两个解决方案:

  1. 使用不同的模块,因此不存在依赖生命周期。例如,第一个模块可以是k8s-infra,另一个模块可以是k8s-resources。第一个管理 Kubernetes 的所有 squeleton,并且先应用/最后销毁。第二个管理集群内部的内容,最后应用/先销毁。

  2. 使用depends_on参数显式编写依赖生命周期

创建资源时

terraform apply当即使尚未应用任何内容也无法创建资源时,您可能还会遇到依赖性问题。我将给出另一个带有 postgres 的例子

  1. 编写代码创建 RDS PostgreSQL 服务器
  2. 与 Terraform 一起应用
  3. 在同一模块中编写代码,以使用 postgres terraform 提供程序配置该 RDS 实例
  4. 与 Terraform 一起应用
  5. 摧毁一切
  6. 尝试应用所有内容 => 错误

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

这里的解决方案是使用/命令的target 参数。Terraform 将仅初始化与所应用的资源相关的提供程序。planapply

  1. 向 AWS 提供商应用 RDS 代码:terraform apply -target=aws_db_instance
  2. 应用一切terraform apply。由于 RDS 实例已经可达,因此 PostgreSQL 提供程序也可以自行启动