如何让Terraform在deposed EKS节点组删除前执行迁移脚本
实现方案
你可以通过Terraform的销毁时置备器、本地执行逻辑结合生命周期配置,完成旧节点组删除前的脚本触发,具体实现步骤如下:
步骤1:修改节点组资源配置,添加销毁时置备器
销毁时置备器(when = destroy)会在资源被销毁之前执行,正好匹配你要在旧节点组删除前运行迁移脚本的需求,修改后的节点组配置参考如下:
resource "aws_eks_cluster" "default" {} resource "aws_eks_node_group" "default" { # 保留原有配置 lifecycle { create_before_destroy = true # 忽略置备器变更,避免每次修改置备器逻辑触发节点组不必要的重建 ignore_changes = [provisioner] } # 销毁旧节点组前执行迁移脚本 provisioner "local-exec" { when = destroy # 直接将当前待销毁的旧节点组名称作为参数传入迁移脚本 command = "./your-migration-script.sh ${self.node_group_name}" # 可按需传入脚本需要的其他环境变量 environment = { EKS_CLUSTER_NAME = aws_eks_cluster.default.name AWS_REGION = data.aws_region.current.name } } }
注意:配置中
self关键字可以直接引用当前待销毁的旧节点组的所有属性,包括节点组名称、ARN等,不需要额外识别deposed资源标识。
步骤2:适配迁移脚本逻辑
你的迁移脚本只需接收传入的旧节点组名称,即可完成所有迁移操作:
- 调用AWS CLI执行
aws eks list-nodes --cluster-name $EKS_CLUSTER_NAME --nodegroup-name $1获取旧节点组下的所有EKS节点列表 - 对所有旧节点执行
kubectl cordon禁止新Pod调度 - 执行
kubectl drain驱逐旧节点上的所有业务Pod - 校验所有被驱逐的Pod已经在新节点组上正常启动、服务可用
- 脚本执行成功返回退出码0,Terraform才会继续执行旧节点组的删除操作;如果脚本执行失败(比如Pod未正常启动),Terraform会终止删除流程,避免业务中断。
步骤3:可选的可靠性增强配置
你可以额外添加空资源做新节点组就绪校验,确保新节点组可用后才触发旧节点的销毁逻辑:
data "aws_region" "current" {} resource "null_resource" "check_new_node_ready" { triggers = { node_group_id = aws_eks_node_group.default.id } # 校验新节点组所有节点已加入集群、处于Ready状态 provisioner "local-exec" { command = "./check-new-node-ready.sh ${aws_eks_node_group.default.node_group_name}" } depends_on = [aws_eks_node_group.default] }
整体执行顺序说明
当你修改节点组配置执行terraform apply时,流程会严格按照以下顺序执行:
- 先创建全新的EKS节点组实例
- 等待新节点组创建完成、就绪校验通过
- 触发旧节点组的销毁时置备器,运行你的迁移脚本
- 脚本执行成功后,才会正式删除旧的节点组资源
内容的提问来源于stack exchange,提问作者Zachary Delano
相关产品推荐
相关产品推荐

