【发布时间】: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 的引用并强制替换。