【问题标题】:Terraform forces AKS node pool replacement without any changesTerraform 强制 AKS 节点池替换而不进行任何更改
【发布时间】:2021-08-21 20:05:04
【问题描述】:

我的 k8s 集群中的其他节点池具有以下资源定义:

resource "azurerm_kubernetes_cluster_node_pool" "extra" {
  for_each = var.node_pools

  kubernetes_cluster_id   = azurerm_kubernetes_cluster.k8s.id
  name                    = each.key
  vm_size                 = each.value["vm_size"]
  node_count              = each.value["count"]
  node_labels             = each.value["labels"]
  vnet_subnet_id          = var.subnet.id
}

这是terraform plan的输出:

Note: Objects have changed outside of Terraform

Terraform detected the following changes made outside of Terraform since the last "terraform apply":

  # module.aks.azurerm_kubernetes_cluster_node_pool.extra["general"] has been changed
  ~ resource "azurerm_kubernetes_cluster_node_pool" "extra" {
      + availability_zones     = []
        id                     = "/subscriptions/3913c9fe-c571-4af9-bc9a-533202d41061/resourcegroups/amic-resources/providers/Microsoft.ContainerService/managedClusters/amic-k8s-01/agentPools/general"
        name                   = "general"
      + node_taints            = []
      + tags                   = {}
        # (18 unchanged attributes hidden)
    }

Unless you have made equivalent changes to your configuration, or ignored the relevant attributes using ignore_changes, the following plan may include actions to undo or respond to these changes.

──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
-/+ destroy and then create replacement

Terraform will perform the following actions:

  # module.aks.azurerm_kubernetes_cluster_node_pool.extra["general"] must be replaced
-/+ resource "azurerm_kubernetes_cluster_node_pool" "extra" {
      - availability_zones     = [] -> null
      - enable_auto_scaling    = false -> null
      - enable_host_encryption = false -> null
      - enable_node_public_ip  = false -> null
      ~ id                     = "/subscriptions/3913c9fe-c571-4af9-bc9a-533202d41061/resourcegroups/amic-resources/providers/Microsoft.ContainerService/managedClusters/amic-k8s-01/agentPools/general" -> (known after apply)
      ~ kubernetes_cluster_id  = "/subscriptions/3913c9fe-c571-4af9-bc9a-533202d41061/resourcegroups/amic-resources/providers/Microsoft.ContainerService/managedClusters/amic-k8s-01" -> "/subscriptions/3913c9fe-c571-4af9-bc9a-533202d41061/resourceGroups/amic-resources/providers/Microsoft.ContainerService/managedClusters/amic-k8s-01" # forces replacement
      - max_count              = 0 -> null
      ~ max_pods               = 30 -> (known after apply)
      - min_count              = 0 -> null
        name                   = "general"
      - node_taints            = [] -> null
      ~ orchestrator_version   = "1.20.7" -> (known after apply)
      ~ os_disk_size_gb        = 128 -> (known after apply)
      - tags                   = {} -> null
        # (9 unchanged attributes hidden)
    }

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

如您所见,由于kubernetes_cluster_id 的更改,terraform 尝试强制替换我的节点池,即使此值实际上根本没有更改。 我已经能够通过忽略 lifecycle 块中的 kubernetes_cluster_id 更改来解决此问题,但我仍然对 terraform 为什么检测到那里的更改感到困惑。

那么为什么 Terraform 会在这种情况下发现没有变化呢?

【问题讨论】:

  • 根据您的计划输出,kubernetes_cluster_id 实际上正在发生变化,因此 Terraform 的行为正确。进一步分析该计划,似乎resourcegroups 正在更改为resourceGroups,这听起来像是错误的kubernetes_cluster_id 在创建时被读取,或者其他一些相关的提供程序代码问题。这听起来很像您应该向 Azure 提供程序提交的错误。
  • 非常感谢您了解这一点,我没有意识到这两个字符串之间实际上存在差异。我会尽量花时间隔离一个最小的测试用例来重现问题并提交错误。
  • 从状态中删除 azurerm_kubernetes_cluster_node_pool 并再次导入它不起作用。删除节点池和集群,然后导入集群(在导入链接中使用大写 R),然后是节点池,结果相同:节点池具有小写 R 的引用并强制替换。

标签: azure terraform azure-aks


【解决方案1】:

我并不自豪,但我设法通过使用“replace”terraform 字符串函数解决了这个错误。

resource "azurerm_kubernetes_cluster_node_pool" "extra" {
  [...]
  # Use this once the bug gets fixed in the provider, and delete the workaround.
  # kubernetes_cluster_id   = azurerm_kubernetes_cluster.k8s.id 
  kubernetes_cluster_id   = replace(azurerm_kubernetes_cluster.k8s.id, "resourceGroups", "resourcegroups")

  [...]
}

注意:我不会用/resourcegroups/ 替换/resourceGroups/,因为replace 函数将默认认为这是一个正则表达式替换,这最终可能会复制你的正斜杠。 (我自己没有测试过)

【讨论】:

  • 也许你已经解决了这个问题?我有同样的问题:(
  • 在我的情况下,此答案中的代码仍在生产中使用
  • ok 我的问题是在node_pool中使用spot实例时,我需要设置node_taint参数,该值只能在azure docs中找到。在 terraform 文档中有关于这一点的注释,它们非常模糊。我结束了这个资源娱乐。因此,只需将 node_taint 设置为 terraform 想要更改的值即可解决问题
猜你喜欢
  • 2022-01-24
  • 2022-11-21
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
  • 2021-08-03
  • 2015-08-17
  • 2021-10-12
  • 2021-03-08
相关资源
最近更新 更多