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 代码开发技巧总结