【问题标题】:Terraform azurerm_kubernetes_cluster default_node_pool orchestrator_version not updatingTerraform azurerm_kubernetes_cluster default_node_pool orchestrator_version 未更新
【发布时间】:2021-10-16 06:25:46
【问题描述】:

我正在尝试使用 Terraform 的 azurerm_kubernetes_cluster 升级默认节点池 k8s 版本,但它告诉我没有什么可以改变的。以下是相关细节:

tfstate 文件(已编辑,从 Terraform Cloud 中提取):

{
  "version": 4,
  "terraform_version": "1.0.2",
  "resources": [
    {
      "mode": "managed",
      "type": "azurerm_kubernetes_cluster",
      "name": "aks",
      "provider": "provider[\"registry.terraform.io/hashicorp/azurerm\"]",
      "instances": [
        {
          "schema_version": 0,
          "attributes": {
            "default_node_pool": [
              {
                "orchestrator_version": "1.19.7", // tfstate shows 1.19.7
                "type": "VirtualMachineScaleSets"
              }
            ],
            "kubernetes_version": "1.20.7"
          }
        }
      ]
    }
  ]
}

资源定义:

resource "azurerm_kubernetes_cluster" "aks" {
  .
  .
  .
  kubernetes_version  = local.aks.kubernetes_version

  default_node_pool {
    name       = local.aks.default_node_pool.name
    vm_size    = local.aks.default_node_pool.vm_size
    node_count = local.aks.default_node_pool.node_count
    orchestrator_version = local.aks.default_node_pool.orchestrator_version
  }
  .
  .
  .
}

变量:

variable "aks" {
    description = "Kubernetes Service values"
    type = object({
        name = string
        dns_prefix = optional(string)
        kubernetes_version = optional(string)
        default_node_pool = object({
            name = optional(string)
            vm_size = optional(string)
            node_count = optional(number)
            orchestrator_version = optional(string)
        })
        identity_type = optional(string)
    })
}



locals {
    aks = defaults(var.aks, {
        dns_prefix = var.aks.name
        kubernetes_version = "1.20.7"
        default_node_pool = {
            name = "agentpool"
            vm_size = "Standard_D4s_v3"
            node_count = 3
            orchestrator_version = "1.20.7"
        }
    })
}

指定kubernetes_version 有助于升级 Azure 中的 k8s 控制计划,但默认节点池没有更新。经过一番研究,我找到了orchestrator_version,据我了解,这应该升级虚拟机规模集的 k8s 版本。

当我运行terraform plan 时,它告诉我“您的基础架构与配置匹配”,即使 tfstate 清楚地将 orchestrator_version 显示为“1.19.7”,并且我的变量(我也尝试过硬编码)设置为“1.20.7”。

为什么 Terraform / azurerm_kubernetes_cluster 不能识别 orchestrator_version 变化?

【问题讨论】:

  • defaults 函数即使在 1.0 中也是实验性功能的一部分。您是否在任何地方启用了该功能?它不存在于您问题的配置中。
  • 我已经启用了,是的。为了简洁,我没有在这里包含它

标签: terraform terraform-provider-azure azure-rm


【解决方案1】:

您能否使用 Terraform azurerm provider version 2.14.0 进行检查?此版本对此问题进行了修复。 Reference

一种已知的解决方法是在 Kubernetes 版本上使用带有触发器的 null_resource,并使用 local-exec 配置器运行 Bash 脚本。因此,您不必手动升级节点池。

...
resource "null_resource" "aks" {
  triggers = {
    aks_kubernetes_version = azurerm_kubernetes_cluster.aks.kubernetes_version
  }
  provisioner "local-exec" {
    command     = "./cluster-upgrade-fix.sh ${var.name} ${azurerm_resource_group.aks.name}"
    working_dir = path.module
  }
}
...

该脚本比较控制平面和节点池的 Kubernetes 版本。不同的版本会相应地升级集群中的每个节点池。

cluster-upgrade-fix.sh

#!/bin/bash
CLUSTER_NAME=$1
RESOURCE_GROUP=$2
CLUSTER_VERSION=$(az aks show --name $CLUSTER_NAME --resource-group $RESOURCE_GROUP | jq -r .kubernetesVersion)
NODE_POOLS=$(az aks nodepool list --cluster-name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --query '[].name' -o tsv)
for NODE_POOL in $NODE_POOLS; do
    NODE_VERSION=$(az aks nodepool show --cluster-name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --name $NODE_POOL | jq -r .orchestratorVersion)
    if [[ $CLUSTER_VERSION != $NODE_VERSION ]]; then
        az aks nodepool upgrade --kubernetes-version $CLUSTER_VERSION --cluster-name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --name $NODE_POOL --verbose
    fi
done

参考资料:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-03
    • 2019-08-23
    • 2019-05-05
    • 2020-04-06
    • 2021-10-31
    • 2020-05-15
    • 2021-03-03
    • 2023-03-16
    相关资源
    最近更新 更多