【问题标题】:Terraform force replaces AKS cluster during "terraform plan"Terraform force 在“terraform plan”期间替换 AKS 集群
【发布时间】:2021-08-29 05:51:18
【问题描述】:

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

有什么与 kube_admin_config 相关的吗?

我的 terraform 计划(第二个计划)返回如下内容

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)

【问题讨论】:

  • 我已经经历了这个 GitHub 问题以及类似的问题,但没有得到正确的解决方案。如果您在此处提到的同一问题中看到,最后用户提供了所有 terraform 计划日志。但是之后没有任何回应,问题被自动关闭而没有回应。
  • 我 99% 确定这是因为证书。每次应用这都会创建另一个证书,如果集群具有新颁发的证书,这就是触发重新创建的原因。如果您评论证书块,您可以看到它不会重新创建集群。
  • 我的 terraform 代码中没有任何证书块。

标签: azure kubernetes terraform azure-aks terraform-provider-azure


【解决方案1】:

使用 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

【讨论】:

  • 我试图在我的 k8s 模块中添加忽略部分,但我仍然面临同样的问题(替换集群)
【解决方案2】:

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

在“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
}

【讨论】:

    【解决方案3】:

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

    lifecycle {
       ignore_changes = all
     }
    

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

    【讨论】:

      猜你喜欢
      • 2021-01-27
      • 2021-12-08
      • 1970-01-01
      • 2020-12-24
      • 2020-07-05
      • 2022-01-15
      • 2021-01-21
      • 2023-04-07
      • 2021-07-22
      相关资源
      最近更新 更多