Terraform脚本在创建新名称空间之前销毁先前创建的kubernetes名称空间



我创建了这个脚本:

provider "kubernetes" {
host = "https://${var.cluster_url}:8443"
client_certificate     = file("./admin.crt")
client_key             = file(".admin.key")
cluster_ca_certificate = file("./ca.crt")
}
resource "kubernetes_namespace" "resource" {
metadata {
annotations = {
name = "exampleannotation"
}
labels = {
mylabel = "labelvalue"
}
name = "${var.namespace_name}"
}
}

如果我运行它两次,在运行第二次之前,它会删除前一个资源(见下文)。

我知道,在底层,terraform正在跟踪它之前在状态文件中为脚本创建的资源。但是,我想知道是否有任何方法可以避免移除?

FIRST RUN:
terraform apply  -var="namespace_name=pippo" -var="cluster_url=xxx.yyyy.zzz"
kubernetes_namespace.resource: Creating...
kubernetes_namespace.resource: Creation complete after 0s [id=pippo]
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
SECOND RUN:
terraform apply  -var="namespace_name=pluto" -var="cluster_url=xxx.yyyy.zzz"
kubernetes_namespace.resource: Destroying... [id=pippo]
kubernetes_namespace.resource: Destruction complete after 6s
kubernetes_namespace.resource: Creating...
kubernetes_namespace.resource: Creation complete after 0s [id=pluto]

Apply complete! Resources: 1 added, 0 changed, 1 destroyed.

在这种情况下,您已经有了正确的直觉:Terraform资源(称为"resource"在您的示例中)更改了名称。如果一个名称在Kubernetes中唯一地标识一个命名空间,那么更改名称的唯一方法就是删除旧的命名空间并创建一个新的命名空间。

如果要保留两个名称空间,则需要在Terraform中使用两个资源。例如:

resource "kubernetes_namespace" "resource" {
for_each = toset(["pippo", "pluto"])
metadata {
annotations = {
name = "exampleannotation"
}
labels = {
mylabel = "labelvalue"
}
name = each.key
}
}

注意for_each仅在Terraform 0.12之后可用。

Terraform在这里的行为与预期一致。它意味着是有状态的和确定性的,所以如果您更改输入,受影响的资源将会更改。

Terraform不是设计来做你正在谈论的事情的。正如上面的注释所指出的,要创建多个名称空间,您可以创建多个单独的"名称空间"资源,或者使用for_each语法。使用for_each,您可以传入一个名称空间名称列表作为参数,以控制创建的数量。

最新更新