Terraform 强制替换 AKS 节点池而不进行任何更改

Ang*_*are 5 azure terraform azure-aks

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

\n
resource "azurerm_kubernetes_cluster_node_pool" "extra" {\n  for_each = var.node_pools\n\n  kubernetes_cluster_id   = azurerm_kubernetes_cluster.k8s.id\n  name                    = each.key\n  vm_size                 = each.value["vm_size"]\n  node_count              = each.value["count"]\n  node_labels             = each.value["labels"]\n  vnet_subnet_id          = var.subnet.id\n}\n
Run Code Online (Sandbox Code Playgroud)\n

这是以下的输出terraform plan

\n
Note: Objects have changed outside of Terraform\n\nTerraform detected the following changes made outside of Terraform since the last "terraform apply":\n\n  # module.aks.azurerm_kubernetes_cluster_node_pool.extra["general"] has been changed\n  ~ resource "azurerm_kubernetes_cluster_node_pool" "extra" {\n      + availability_zones     = []\n        id                     = "/subscriptions/3913c9fe-c571-4af9-bc9a-533202d41061/resourcegroups/amic-resources/providers/Microsoft.ContainerService/managedClusters/amic-k8s-01/agentPools/general"\n        name                   = "general"\n      + node_taints            = []\n      + tags                   = {}\n        # (18 unchanged attributes hidden)\n    }\n\nUnless 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.\n\n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n\nTerraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:\n-/+ destroy and then create replacement\n\nTerraform will perform the following actions:\n\n  # module.aks.azurerm_kubernetes_cluster_node_pool.extra["general"] must be replaced\n-/+ resource "azurerm_kubernetes_cluster_node_pool" "extra" {\n      - availability_zones     = [] -> null\n      - enable_auto_scaling    = false -> null\n      - enable_host_encryption = false -> null\n      - enable_node_public_ip  = false -> null\n      ~ id                     = "/subscriptions/3913c9fe-c571-4af9-bc9a-533202d41061/resourcegroups/amic-resources/providers/Microsoft.ContainerService/managedClusters/amic-k8s-01/agentPools/general" -> (known after apply)\n      ~ 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\n      - max_count              = 0 -> null\n      ~ max_pods               = 30 -> (known after apply)\n      - min_count              = 0 -> null\n        name                   = "general"\n      - node_taints            = [] -> null\n      ~ orchestrator_version   = "1.20.7" -> (known after apply)\n      ~ os_disk_size_gb        = 128 -> (known after apply)\n      - tags                   = {} -> null\n        # (9 unchanged attributes hidden)\n    }\n\nPlan: 1 to add, 0 to change, 1 to destroy.\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

那么,为什么 Terraform 在这种情况下发现了变化,而实际上没有变化呢?

\n

小智 1

我通过引入块修复了这个奇怪的错误,lifecycle如下所示:

resource "azurerm_kubernetes_cluster_node_pool" "my-node-pool" {
  name = "mynodepool"
  kubernetes_cluster_id = azurerm_kubernetes_cluster.aks.id

  ...

  lifecycle {
    ignore_changes = [
      kubernetes_cluster_id
    ]
  }
} 
Run Code Online (Sandbox Code Playgroud)

这不是最干净的方法,但它确实有效。除非重新创建整个 AKS 群集,否则不应更改群集 ID,因此它应该是安全的。