【问题标题】:Terraform script destroying previously created kubernetes namespace before creating a new oneTerraform 脚本在创建新命名空间之前破坏先前创建的 kubernetes 命名空间
【发布时间】:2021-05-22 08:04:06
【问题描述】:

我创建了这个脚本:

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.

【问题讨论】:

    标签: kubernetes terraform


    【解决方案1】:

    在这种情况下,您已经有了正确的直觉:Terraform 资源(在您的示例中称为“资源”)发生了名称更改。鉴于名称唯一标识 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 apply -var="namespace_name=pluto" -var="cluster_url=xxx.yyyy.zzz"") 离开命名空间 pippo它创建了一个新的命名空间 pluto,第三次运行将 pippo 和 pluto 保持原样,并创建了一个新的命名空间,依此类推。这可能吗?吉安·菲利波
    • 上述方法可以实现,您只需在每次运行时为for_each 添加另一个名称。
    【解决方案2】:

    Terraform 在此处的行为与预期一致。它是有状态和确定性的,所以如果你改变输入,受影响的资源就会改变。

    Terraform 并非旨在完成您所说的工作。正如上面的评论所指出的,要创建多个命名空间,您可以创建多个单独的“命名空间”资源,或者使用for_each 语法。使用 for_each,您可以传入命名空间名称列表作为参数来控制创建的数量。

    【讨论】:

      猜你喜欢
      • 2021-12-06
      • 2020-06-04
      • 1970-01-01
      • 2021-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-04
      • 2019-03-24
      相关资源
      最近更新 更多