删除AWS EKS Ingress资源时如何保留ALB仅删除监听器与目标组
EKS ALB 保留配置方案
AWS Load Balancer Controller(ALB Ingress控制器)默认会将自己自动创建的ALB生命周期与Ingress组绑定,当Ingress组下所有Ingress资源被删除时,会同步删除ALB实例。可以通过以下配置实现删除Ingress时仅清理监听器、目标组、转发规则,保留ALB实例,无需重复修改Hosted Zone路由配置。
核心实现逻辑
控制器仅会删除自身标记为持有的资源,只要让控制器判定目标ALB不属于自己全生命周期管理的资源,就不会在Ingress删除时回收ALB。
操作步骤
- 如果你还没有固定要使用的ALB,先手动在AWS控制台/通过AWS CLI创建符合需求的ALB(配置对应VPC、子网、安全组、内外网属性),命名为
EKS-ALB即可;如果已经有现存的正在使用的ALB,跳过这一步。 - 给目标ALB添加以下标签,确保控制器能识别该ALB对应你的Ingress组:
- 标签键:
ingress.k8s.aws/resource,标签值:LoadBalancer - 标签键:
ingress.k8s.aws/stack,标签值:与Ingress注解中alb.ingress.kubernetes.io/group.name的值完全一致,你当前配置为test-alb,保持一致即可 - 标签键:
elbv2.k8s.aws/cluster,标签值:你的EKS集群实际名称,当前配置为EKS如果匹配实际集群名无需修改
- 标签键:
- 移除ALB上的
ingress.k8s.aws/owned: "true"标签:这个标签是控制器标记自己创建、需要全生命周期管理的资源的标识,删掉之后控制器就不会再尝试删除该ALB。如果是你手动新建的ALB本来就没有这个标签,跳过这步。 - 原有Ingress资源的注解不需要做额外修改,保持现有
group.name: test-alb的配置即可,控制器部署时会自动识别到现存的匹配标签的ALB,在其上创建监听器、转发规则,绑定目标组。
配置效果
后续删除Ingress资源时,控制器只会清理自己生成的监听器、目标组、转发规则,不会删除保留的ALB实例。下次重新部署同组的Ingress资源时,控制器会自动复用这个留存的ALB重新创建关联资源,Hosted Zone上已经配置的指向该ALB的路由规则完全不需要调整。
注意事项
- 不要通过给ALB开启原生删除保护的方式规避删除:这种方式会导致控制器删除资源时持续调用ALB删除接口报错,在控制器日志中持续刷错误事件,属于非正规方案。
- 保留的ALB所在VPC、子网、安全组配置需要和EKS集群的Ingress流量规划一致,避免出现流量不通的问题。
- 如果后续需要让控制器重新接管ALB的生命周期,给ALB加回
ingress.k8s.aws/owned: "true"标签即可。
修正后可直接使用的资源清单
(移除了原Deployment配置中无效的顶层restartPolicy字段,其余配置保持原有逻辑不变)
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: test-nginx-rule namespace: test annotations: alb.ingress.kubernetes.io/group.name: test-alb alb.ingress.kubernetes.io/scheme: internal alb.ingress.kubernetes.io/target-type: instance alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS": 443}]' alb.ingress.kubernetes.io/ssl-redirect: '443' alb.ingress.kubernetes.io/healthcheck-port: traffic-port alb.ingress.kubernetes.io/healthcheck-path: /index.html alb.ingress.kubernetes.io/success-codes: 200-399 alb.ingress.kubernetes.io/security-groups: eks-test-alb-sg spec: ingressClassName: alb rules: - host: test.eks.abc.com http: paths: - pathType: Prefix path: "/" backend: service: name: test-svc port: number: 5005 --- apiVersion: apps/v1 kind: Deployment metadata: name: test-dep namespace: test labels: app: test spec: replicas: 1 selector: matchLabels: app: test template: metadata: labels: app: test spec: containers: - name: test image: Imagepath imagePullPolicy: IfNotPresent ports: - containerPort: 5005 resources: requests: memory: "256Mi" cpu: "500m" --- apiVersion: v1 kind: Service metadata: name: test-svc namespace: test labels: app: test spec: type: NodePort ports: - port: 5005 targetPort: 80 protocol: TCP selector: app: test --- apiVersion: autoscaling/v1 kind: HorizontalPodAutoscaler metadata: name: test-scaler namespace: test spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: test-dep minReplicas: 1 maxReplicas: 5 targetCPUUtilizationPercentage: 60
内容的提问来源于stack exchange,提问作者Deepakvg
相关产品推荐
相关产品推荐

