在我的terraform基础架构中,我根据参数启动了多个Kubernetes集群,然后使用kubernetes提供程序将标准内容安装到这些Kubernetes集群。
当我更改参数并且不再需要集群之一时,terraform无法将其拆除,因为提供程序和资源都在模块中。但是,我没有其他选择,因为我在同一模块中创建了kubernetes集群,并且kubernetes对象全部是每个kubernetes集群。
我能想到的所有解决方案都涉及在我的terraform配置中添加一堆样板。我应该考虑从脚本生成我的Terraform配置吗?
我制作了一个git repo来确切显示我遇到的问题:
https://github.com/bukzor/terraform-gke-k8s-demo
最佳答案
TL; DR
两种解决方案:
resource "kubernetes_service" "example" {
metadata {
name = "my-service"
}
depends_on = ["aws_vpc.kubernetes"]
}
resource "aws_vpc" "kubernetes" {
...
}
破坏资源时
您遇到依赖项生命周期问题
PS:我不知道您用来创建/配置Kubernetes集群的代码,但我想它看起来像这样
发生的事情是,通过创建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给出另一个示例通过稍微调试Terraform,我了解到所有提供程序都是在
plan
/ apply
的开头初始化的,因此,如果一个配置无效(API密钥错误/端点不可达),则Terraform将失败。这里的解决方案是使用
plan
/ apply
命令的target parameter。Terraform将仅初始化与所应用资源相关的提供程序。
terraform apply -target=aws_db_instance
terraform apply
。由于RDS实例已经可以访问,因此PostgreSQL提供程序也可以自行启动关于kubernetes - 与依赖提供者进行地形改造,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54165344/