基于AWS EKS与ELB的Spring Boot微服务通用负载均衡配置问询
问题描述
我正基于Spring Boot、Hibernate、Docker及Kubernetes技术栈,将单体应用迁移至微服务架构。后端包含10个项目,共120个微服务端点,每个Spring Boot项目平均含10-12个端点,计划部署于AWS EKS集群并使用ELB负载均衡。
存在以下困惑:
- 若需通过
loadbalancer-ip/domain/module/end-point访问所有微服务,如何在EKS集群中配置通用负载均衡? - 我尝试通过在部署yml文件中添加
ingress实现应用负载均衡,是否需要为10个Spring Boot项目分别配置Ingress,还是可直接在AWS控制台的ELB配置中添加target组?
补充说明:Asset、Communications、Admin为三个独立Spring Boot项目,各含不同端点,期望实现如下访问格式:Loadbalancer-ip:port1/asset/loadassetLoadbalancer-ip:port2/communication/loademailsLoadbalancer-ip:port3/admin/loadadmin
即所有项目通过同一负载均衡访问,URL按业务域区分,恳请提供相关配置指导。
问题解答
1. 通用负载均衡配置方案
在EKS中实现统一负载均衡按路径/端口区分微服务,核心是使用AWS Load Balancer Controller(官方适配AWS ELB/NLB的Ingress Controller)配合单个Ingress资源,而非直接手动操作ELB控制台。具体步骤如下:
方案A:按URL路径区分(单端口)
这种方案用同一端口,通过路径前缀区分不同业务域,符合loadbalancer-ip/asset/loadasset格式:
- 为每个Spring Boot项目部署Kubernetes Deployment,并暴露为ClusterIP类型的Service(无需单独创建LoadBalancer Service,避免每个服务生成独立ELB)。
- 创建统一Ingress资源,通过
path规则路由到对应Service:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: unified-microservices-ingress annotations: alb.ingress.kubernetes.io/scheme: internet-facing alb.ingress.kubernetes.io/target-type: ip # 若需路径重写(比如服务本身无/asset前缀),添加: # alb.ingress.kubernetes.io/rewrite-target: /$2 # alb.ingress.kubernetes.io/conditions.asset: "path-prefix('/asset')" spec: ingressClassName: alb rules: - http: paths: - path: /asset/* pathType: Prefix backend: service: name: asset-service port: number: 8080 - path: /communication/* pathType: Prefix backend: service: name: communication-service port: number: 8080 - path: /admin/* pathType: Prefix backend: service: name: admin-service port: number: 8080
注:如果你的Spring Boot服务本身未配置server.servlet.context-path=/asset,需要添加路径重写注解,确保请求能正确转发到服务端点。
方案B:按端口区分(多端口)
对应你补充说明的loadbalancer-ip:port1/asset/loadasset格式,通过ALB多监听端口区分业务域:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: unified-microservices-ingress annotations: alb.ingress.kubernetes.io/scheme: internet-facing alb.ingress.kubernetes.io/target-type: ip spec: ingressClassName: alb rules: - http: port: number: 8081 paths: - path: /* pathType: Prefix backend: service: name: asset-service port: number: 8080 - http: port: number: 8082 paths: - path: /* pathType: Prefix backend: service: name: communication-service port: number: 8080 - http: port: number: 8083 paths: - path: /* pathType: Prefix backend: service: name: admin-service port: number: 8080
此时ALB会自动创建3个监听端口,分别对应三个微服务,访问时直接通过端口区分业务域。
2. Ingress配置方式选择
不需要为10个项目分别配置Ingress,推荐用单个Ingress资源统一管理所有路由规则,原因如下:
- 符合Kubernetes声明式管理理念,路由规则集中维护,便于修改和排查问题。
- AWS Load Balancer Controller会自动同步Ingress规则到ALB和对应的target组,无需手动在控制台操作,避免集群扩缩容、服务变更时的配置不一致。
直接在AWS控制台操作ELB target组虽然可行,但脱离了Kubernetes的资源管理体系,后续维护成本极高,不推荐。
关键注意事项
- 确保AWS Load Balancer Controller已正确部署到EKS集群,且集群节点拥有足够IAM权限创建、管理ALB和target组。
- 若使用路径重写,需验证路径规则与Spring Boot服务的上下文路径匹配,避免404错误。
内容的提问来源于stack exchange,提问作者Mr.DevEng

