Terraform azurerm_kubernetes_cluster default_node_pool orchestrator_version 未更新

Posted

技术标签:

【中文标题】Terraform azurerm_kubernetes_cluster default_node_pool orchestrator_version 未更新【英文标题】:Terraform azurerm_kubernetes_cluster default_node_pool orchestrator_version not updating 【发布时间】: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 中也是实验性功能的一部分。您是否在任何地方启用了该功能?它不存在于您问题的配置中。 我已经启用了,是的。为了简洁,我没有在这里包含它 【参考方案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

参考资料:

https://www.danielstechblog.io/terraform-upgrading-aks-kubernetes-version-does-not-upgrade-node-pools/ https://dennis-riemenschneider.medium.com/how-to-upgrade-the-kubernetes-version-of-your-aks-default-node-pool-with-terraform-b7311d76041b

【讨论】:

以上是关于Terraform azurerm_kubernetes_cluster default_node_pool orchestrator_version 未更新的主要内容,如果未能解决你的问题,请参考以下文章

Terraform 学习总结——Terraform 命令详解

Terraform 学习总结(10)—— 阿里云平台 Terraform 代码开发技巧总结

Terraform 学习总结(10)—— 阿里云平台 Terraform 代码开发技巧总结

Terraform 学习总结(10)—— 阿里云平台 Terraform 代码开发技巧总结

terraform如何创建数据盘

Terraform 学习总结—— Terraform 常用命令再总结