如何通过Terraform彻底删除EKS集群及Kubernetes在AWS中创建的关联资源?
我来给你梳理几个更优雅的方案,帮你摆脱繁琐的Shell脚本,让terraform destroy自动清理这些EKS关联资源:
方案1:用Terraform的EKS + Kubernetes Provider联动管理
其实你可以直接用Terraform的Kubernetes Provider来管理集群内的Ingress、PVC等资源,同时让这些资源和AWS云资源形成完整的依赖链:
- 当你用Kubernetes Provider定义Ingress并配置好AWS Load Balancer Controller的注解时,Terraform会追踪到这个Ingress对应的ALB资源。执行
terraform destroy时,Terraform会先删除Ingress资源,AWS Load Balancer Controller会自动同步删除对应的ALB、目标组、关联安全组等AWS资源。 - 对于PVC,只要你使用的StorageClass
reclaimPolicy设为Delete(这是默认值),当Terraform删除PVC时,对应的EBS存储卷会被自动清理。 - 关键是要确保Kubernetes Provider正确关联到你的EKS集群,并且AWS Load Balancer Controller也是通过Terraform部署的,这样整个依赖关系会被Terraform自动识别。
方案2:利用Terraform生命周期配置与数据源追踪未直接管理的资源
如果有些关联资源是EKS自动创建但没被Terraform直接定义的,你可以这样处理:
- 用
data数据源引用这些AWS资源(比如通过标签查询自动生成的ALB),然后在EKS集群资源中配置depends_on,确保这些关联资源在集群销毁前被清理。 - 借助
lifecycle块的destroy_before_create等配置,调整资源的销毁顺序——比如先删除所有K8s命名空间(命名空间删除会自动清理内部所有资源),再销毁EKS集群,这样关联的AWS资源会被同步清理。
方案3:封装EKS环境为Terraform模块
把整个EKS环境(集群、节点组、Load Balancer Controller、StorageClass、业务K8s资源等)封装成一个Terraform模块,在模块内部定义好所有资源的依赖顺序:
- 模块内先定义EKS集群,再部署Load Balancer Controller和StorageClass,最后定义业务相关的Ingress、PVC等资源。
- 当执行
terraform destroy时,Terraform会自动按照反向依赖顺序销毁资源:先删业务K8s资源→再删Load Balancer Controller→再删节点组→最后删EKS集群,所有关联的AWS资源都会被自动清理,完全不需要额外脚本。
额外注意事项
- 确保所有K8s资源都是通过Terraform管理的,手动创建的资源Terraform无法追踪,需要先通过
terraform import导入到状态中。 - 检查StorageClass的
reclaimPolicy,如果设为Retain的话,PVC删除后EBS卷会保留,需要手动调整为Delete才能自动清理。 - 对于Route 53记录,如果是Ingress自动创建的,确保AWS Load Balancer Controller配置了对应的注解,这样Ingress删除时记录会被同步删除。
内容的提问来源于stack exchange,提问作者michas
相关产品推荐
相关产品推荐

