You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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时,流程会严格按照以下顺序执行:

  1. 先创建全新的EKS节点组实例
  2. 等待新节点组创建完成、就绪校验通过
  3. 触发旧节点组的销毁时置备器,运行你的迁移脚本
  4. 脚本执行成功后,才会正式删除旧的节点组资源

内容的提问来源于stack exchange,提问作者Zachary Delano

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 06:15:04