如何在EKS中复用CloudFormation创建的AWS负载均衡器?
方案一:通过AWS Load Balancer Controller关联已有资源(推荐)
即便你用CloudFormation创建了ALB、TargetGroup等资源,依然可以借助aws-load-balancer-controller关联EKS Pod,且不会覆盖或重建已有CF资源,只需通过Kubernetes注解指定已有资源的ARN即可:
确认Controller部署与权限
确保aws-load-balancer-controller已安装到EKS集群,且其IAM角色拥有读取、操作你CF创建的ALB、TargetGroup的权限(如elasticloadbalancing:DescribeLoadBalancers、elasticloadbalancing:RegisterTargets等)。创建Ingress资源绑定已有资源
编写Ingress YAML,通过注解指定已有ALB和TargetGroup的ARN,示例如下:apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: existing-alb-ingress annotations: alb.ingress.kubernetes.io/load-balancer-arn: arn:aws:elasticloadbalancing:us-west-2:123456789012:loadbalancer/app/my-existing-alb/abc123 alb.ingress.kubernetes.io/target-group-arn: arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-existing-tg/def456 alb.ingress.kubernetes.io/healthcheck-path: /healthz # 需与TargetGroup配置一致 spec: rules: - http: paths: - path: / pathType: Prefix backend: service: name: your-pod-service port: number: 80其中
your-pod-service是指向Pod的ClusterIP类型Service,Controller会自动将Service关联的Pod IP注册到指定的TargetGroup,并将Ingress规则映射到已有Listener。验证关联效果
部署Ingress后,检查TargetGroup的注册目标列表,应能看到Pod IP已自动注册;访问Route53指向的域名,流量会通过已有ALB转发到EKS Pod。
方案二:手动关联(无需Controller)
若不想使用aws-load-balancer-controller,可手动维护Pod与TargetGroup的关联,但需自行处理动态扩缩容:
调整TargetGroup配置
确保CF创建的TargetGroup的TargetType为ip,支持直接注册Pod的IP地址(Pod IP需属于EKS集群所在VPC的子网)。创建ClusterIP Service
生成指向Pod的ClusterIP Service,作为Pod的统一访问入口。手动注册Pod IP到TargetGroup
使用AWS CLI将Pod IP注册到TargetGroup,示例命令:aws elbv2 register-targets --target-group-arn <你的TargetGroup ARN> --targets Id=<PodIP1> Id=<PodIP2>需自行编写脚本或自定义控制器,在Pod创建/销毁时自动更新TargetGroup的注册目标,否则无法适配Pod动态扩缩容。
确认流量规则与安全组
确保已有Listener规则将流量转发到该TargetGroup,且安全组配置允许ALB与Pod互通:ALB安全组出方向开放Pod监听端口,Pod安全组入方向允许ALB安全组的流量。
注意事项
- CloudFormation资源与EKS集群必须处于同一VPC,否则无法实现网络互通。
- 使用方案一时,不要修改CF中ALB、TargetGroup的核心配置(如VPC、TargetType),避免关联失效。
内容的提问来源于stack exchange,提问作者Mateus Amorim Silva

