Terraform force 在 "terraform plan" 期间替换了 AKS 集群

Terraform force replaces AKS cluster during "terraform plan"

我已经创建了一个集群,我正在尝试测试几个用例。每当我尝试更新现有的 terraform 并提供 terraform apply 时,它会强制替换我的 AKS 集群。

有什么和kube_admin_config相关的吗?

我的 terraform 计划(第二个计划)returns 如下所示

module.aks.azurerm_kubernetes_cluster.k8s must be replaced
-/+ resource "azurerm_kubernetes_cluster" "k8s" {
      - api_server_authorized_ip_ranges = [] -> null
      - enable_pod_security_policy      = false -> null
      + fqdn                            = (known after apply)
      ~ id                              = "/subscriptions/*****/providers/Microsoft.ContainerService/managedClusters/aks-cluster-destroy" -> (known after apply)
      ~ kube_admin_config               = [
          - {
              - client_certificate     = "----*************************************************----"
              - client_key             = "----*************************************************----"
              - cluster_ca_certificate = "----*************************************************----"
              - host                   = "----*************************************************----"
              - password               = "----*************************************************----"
              - username               = "clusterAdmin_rg-aks-cluster-destroy_ask-cluster-destroy"
            },
        ] -> (known after apply)
      ~ kube_admin_config_raw           = (sensitive value)
      ~ kube_config                     = [
          - {
              - client_certificate     = ""
              - client_key             = ""
              - cluster_ca_certificate = ""
              - host                   = ""
              - password               = "----*************************************************----"
              - username               = "clusterUser_rg-aks-cluster-destroy_ask-cluster-destroy"
            },
        ] -> (known after apply)

在 Terraform 计划中使用适当的生命周期配置在 Terraform 中忽略 kube_admin_configkube_config 部分。

只需将这段代码添加到模块代码内的资源“k8s”声明中:

  lifecycle {
    ignore_changes = [
      "kube_admin_config",
      "kube_config"
    ]
  }

一般来说,这是一种安全的做法,因为这些值无论如何都不可更新(事实上,您需要重新生成主节点才能更改它们,也就是重建集群)。

您还可以通过将其他更改值设置为一个值而不是将它们排除在外来消除错误的“更改”:

api_server_authorized_ip_ranges = []
enable_pod_security_policy = false

就我而言,子网是强制替换网络及其依赖项的问题。

在“azurerm_subnet”资源中添加以下行解决了我的问题。

enforce_private_link_endpoint_network_policies = true

更新后我的子网块如下所示。

resource "azurerm_subnet" "subnet" {
  name                  = "${var.subnetname}"
  resource_group_name   = var.resource_group_name
  virtual_network_name  = azurerm_virtual_network.vnet.name
  address_prefixes      = var.akssubnet_address
  depends_on            = [azurerm_virtual_network.vnet] 
  enforce_private_link_service_network_policies = true
  enforce_private_link_endpoint_network_policies = true
}

如果您正在测试并希望 Terraform 忽略对您的资源所做的手动更改,您可以选择忽略对资源所有属性的更改,方法是将以下代码添加到资源块

lifecycle {
   ignore_changes = all
 }

https://www.terraform.io/docs/language/meta-arguments/lifecycle.html#ignore_changes