使用Terraform销毁EKS集群时无法删除ALB Ingress的问题
解决Terraform销毁EKS集群时无法删除ALB Ingress的问题
问题背景
使用AWS Provider 5.17.0 + terraform-aws-modules/eks/aws 19.16.0部署EKS集群、Ingress及相关资源,执行terraform destroy时,ALB Ingress资源长时间卡在销毁状态,最终报错Ingress (test/test-alb-ingress) still exists,需手动删除Ingress才能继续销毁流程。
临时应急方案
- 移除Ingress Finalizer:执行kubectl命令移除Ingress的Finalizer,让K8s允许删除资源:
之后重新运行kubectl patch ingress -n test test-alb-ingress -p '{"metadata":{"finalizers":[]}}' --type=mergeterraform destroy。 - 直接删除Ingress:手动删除Ingress资源后继续销毁:
kubectl delete ingress -n test test-alb-ingress
长期修复方案
1. 调整资源销毁顺序
确保Ingress资源在Ingress Controller之前完成销毁。在Ingress Controller的Terraform资源块中添加依赖:
# 示例:假设Ingress Controller是模块内的资源 module "ingress_controller" { # 其他配置... depends_on = [module.eks.module.ingress.kubernetes_ingress_v1.test_ingress] }
这样Terraform会先销毁Ingress,再处理Ingress Controller,避免因Controller提前销毁导致Ingress无法清理。
2. 配置Ingress生命周期规则
在Ingress的Terraform定义中,添加超时设置或忽略Finalizer变更,避免销毁时卡住:
resource "kubernetes_ingress_v1" "test_ingress" { metadata { name = "test-alb-ingress" namespace = "test" # 其他元数据配置... } # 其他Ingress配置... lifecycle { ignore_changes = [metadata.finalizers] } timeouts { delete = "5m" # 缩短删除超时时间,避免长时间等待 } }
3. 升级模块与Provider
旧版本的eks模块(v19.16.0)和AWS Provider(5.17.0)可能存在销毁逻辑的兼容性bug。建议:
- 将
terraform-aws-modules/eks/aws升级到v20.x及以上版本 - 同步升级AWS Provider到与eks模块兼容的最新版本(可参考模块文档的版本兼容说明)
4. 用null_resource强制清理Ingress
添加null_resource,在销毁阶段自动执行kubectl命令删除Ingress,提前清理资源:
resource "null_resource" "ingress_cleanup" { triggers = { ingress_name = kubernetes_ingress_v1.test_ingress.metadata[0].name namespace = kubernetes_ingress_v1.test_ingress.metadata[0].namespace } provisioner "local-exec" { when = destroy command = "kubectl delete ingress -n ${self.triggers.namespace} ${self.triggers.ingress_name} --wait=false || true" interpreter = ["bash", "-c"] } depends_on = [kubernetes_ingress_v1.test_ingress] }
可能的根因
- Ingress的Finalizer(如
alb.ingress.kubernetes.io/resource-cleanup)未被Ingress Controller正常处理,导致Ingress长期处于Terminating状态 - Terraform的Kubernetes Provider与AWS Provider销毁顺序不匹配:AWS Provider提前删除了ALB资源,导致Ingress Controller无法完成Ingress的清理流程
- 旧版本eks模块或AWS Provider存在资源销毁依赖的逻辑bug
内容的提问来源于stack exchange,提问作者Roronoa Zoro
相关产品推荐
相关产品推荐

