【问题标题】:After EKS cluster is created by Terraform, next plan sees subnet changes to tags在 Terraform 创建 EKS 集群后,下一个计划会看到子网对标签的更改
【发布时间】:2019-02-16 20:23:55
【问题描述】:

我打算使用 Terraform 来支持我在 AWS 中的整个监控基础设施。 到目前为止,在我的 terraform 项目中已经创建了 VPC、子网、适当的安全组。我尽可能使用 Terraform 注册表:

我看到的问题是,在部署 EKS 集群后,它会向 VPC 和子网引入 Terraform 似乎不知道的标签。因此,下次运行 terraform plan 时,它会识别它无法管理的标签并打算删除它们:

------------------------------------------------------------------------

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  ~ update in-place

Terraform will perform the following actions:

  ~ module.vpc.aws_subnet.private[0]
      tags.%:                                "4" => "3"
      tags.kubernetes.io/cluster/monitoring: "shared" => ""

  ~ module.vpc.aws_subnet.private[1]
      tags.%:                                "4" => "3"
      tags.kubernetes.io/cluster/monitoring: "shared" => ""

  ~ module.vpc.aws_vpc.this
      tags.%:                                "4" => "3"
      tags.kubernetes.io/cluster/monitoring: "shared" => ""


Plan: 0 to add, 3 to change, 0 to destroy.

------------------------------------------------------------------------

terraform-provider-aws 和local workaround using bash 存在一个问题,但有谁知道如何让 Terraform 意识到这些标签或让它们以稳健的方式被后续计划忽略?

【问题讨论】:

    标签: terraform amazon-eks


    【解决方案1】:

    只需在调用模块时添加标签,请注意在https://registry.terraform.io/modules/terraform-aws-modules/vpc/aws/1.41.0 的示例中它在那里显示标签,并且在文档中它说“要添加到所有资源的标签映射”,因此您可以将其添加到该映射.

    【讨论】:

    • 我想到了,但我不想标记所有资源,例如我只想标记激活 EKS 的子网,而不是全部。在 all vpc 资源中包含标签可能会破坏 EKS 的资源发现机制。见docs.aws.amazon.com/eks/latest/userguide/…
    • 您应该只根据 EKS 稍后将如何标记子网来标记子网。
    • @Spangen 就是说,将kubernetes.io/cluster/monitoring: "shared" 添加到 Terraform 的标签中
    • 标签将应用于 VPC 创建的每个资源,包括所有子网。假设我有 2 个私有子网和 2 个公有子网,并且 EKS 集群只为两个私有子网定义,如何阻止公共子网被 Terraform 标记?
    • 您可以在运行 EKS 的 VPC 中专门添加标签,如果您的 VPC 中有不希望 eks 使用的子网,那么您不必标记这些。
    【解决方案2】:

    如果您控制了模块,您可以尝试在lifecycle 块中使用ignore_changes 子句。类似的东西

        lifecycle {
          ignore_changes = [
            "tags"
        ]
    }
    

    如果使用一个不受您控制的模块,这将变得更加棘手。

    【讨论】:

      【解决方案3】:

      所以最后我们选择完全不使用 terraform 来部署集群, 相反,我们使用来自 Weaveworks 的基于社区的工具 eksctl。

      https://eksctl.io/

      当我们在伦敦的 AWS 办事处进行一些培训时,这是 AWS 解决方案架构师推荐的。

      如果需要,配置可以存储在源代码管理中。

      eksctl create cluster -f cluster.yaml
      

      由于 EKS 对基础设施进行了大量标记,我们的生活现在好多了,现在状态文件不再抱怨标记。

      【讨论】:

        猜你喜欢
        • 2020-09-22
        • 2019-02-04
        • 2020-12-09
        • 2019-07-08
        • 2020-04-13
        • 2021-10-19
        • 2022-01-13
        • 2021-03-25
        • 2020-10-26
        相关资源
        最近更新 更多