AWS EKS中Service部署后旧负载均衡未删除问题求助
在AWS EKS中自动清理旧负载均衡的方案
当你直接修改现有Service的注解(从ELB切换到NLB)时,Kubernetes会为同一个Service创建新的NLB资源,但不会自动删除原来的ELB。这是因为Kubernetes的Service更新逻辑中,没有绑定「替换LB类型时清理旧LB」的规则,新旧LB属于AWS层面的独立资源,K8s只会管理当前Service关联的LB。
下面是几种可行的解决办法:
方案一:先删旧Service再部署新Service(简单直接)
这是最通用的方式,先删除关联旧ELB的Service,再部署新的NLB Service:# 删除旧Service kubectl delete service ignite-service -n ignite # 部署新的NLB Service kubectl apply -f your-nlb-service.yaml注意:这个操作会导致服务短暂中断,适合能接受 downtime 的场景,或者提前做好流量切换准备。
方案二:自动化脚本批量处理(适合CI/CD流程)
如果需要在CI/CD中自动完成,可以写脚本先获取旧ELB信息,删除Service后清理旧ELB,再部署新配置:# 获取旧ELB的主机名(对应AWS ELB名称) OLD_ELB_HOSTNAME=$(kubectl get service ignite-service -n ignite -o jsonpath='{.status.loadBalancer.ingress[0].hostname}') OLD_ELB_NAME=$(echo $OLD_ELB_HOSTNAME | cut -d'-' -f1) # 删除旧Service kubectl delete service ignite-service -n ignite # 直接用AWS CLI删除旧ELB(确保CLI有对应权限) aws elb delete-load-balancer --load-balancer-name $OLD_ELB_NAME # 部署新的NLB Service kubectl apply -f your-nlb-service.yaml提示:如果用的是应用负载均衡(ALB),需要替换成
aws elbv2 delete-load-balancer命令,对应ARN参数。方案三:无中断切换(适合生产环境)
若不能接受服务中断,可以先创建一个临时的NLB Service,将流量逐步切换到新LB,再删除旧的ELB Service和对应的ELB:- 部署新的临时NLB Service(比如命名为
ignite-service-temp) - 调整DNS或流量入口,将用户流量切换到新NLB
- 确认流量完全切换后,删除旧的
ignite-service和对应的ELB - 将临时Service重命名为原名称(可选)
- 部署新的临时NLB Service(比如命名为
额外注意事项
- 无论用哪种方案,都要确认旧ELB没有关联其他服务或资源,避免误删。
- 如果使用AWS Load Balancer Controller(而非K8s原生的in-tree控制器),逻辑一致:只有当Service被删除时,控制器才会清理对应的LB资源。
内容的提问来源于stack exchange,提问作者deagleshot
相关产品推荐
相关产品推荐

