📖

Why / How to Apply a Single AWS ALB to Multiple Service / NS on EKS

Created
Jul 15, 2024 08:59 AM
Tags
EKS
ALB
Ingress

AWS 本身基础知识点:

首先需了解一下 AWS 几种不同负载均衡服务
Gateway Load Balancer (GWLB ) / Network Load Balancer (NLB ) / Application Load Balancer ( ALB ) 的术语概念及 主要区别
 

基于 EKS 服务:

有关控制器相关的 AWS Load Balancer Controller 设计实现原理机制(简写为 LBC
notion image
其中 AWS Load Balancer Controller (LBC) 能同时提供 AWS Network Load Balancer (NLB) 和 Application Load Balancer (ALB) 服务资源,他会监听 EKS 集群服务相关 service 或者 ingress 对象资源的创建,根据不同资源创建提供不同类型产品的 Load Balancer 负载均衡服务访问入口;
而据个人所见我们目前原先使用的方式其实主要都是 NLB (即 Network Load BalancerService 方式),每个产品业务服务就都会创建一个 NLB 入口,直接访问到 Service 所对应的 Pod 上;但这种相对更适合临时测试或单一业务服务场景,否则当如果拥有大量业务服务(或命名空间),那么 AWS Load Balancer Controller 默认将为每个业务服务(或命名空间)创建一个 NLB (ALB),不仅增加资源维护成本,更实际问题是会增加浪费金钱费用成本。其实每个 NLB / ALB 都可以轻松处理大量负载的,小业务量完全没必要每个单独创建一个 NLB / ALB
所以这里建议考虑引入使用 Ingress 资源对象通过不同 rules 来控制根据个不同 hostname / route 等将请求通过同一个 ALB 分别转发到不同 NameSpace 的不同 Service ,其中默认刚开始你可能还是会遇到关于同一个 Ingress 配置 rules 涉及跨不同 NSService 的问题,以致可能还是会遇到上面括号中提及到情况,即需要为每个命名空间 (NameSpace) 配置一个 ALB 服务;
查看有关 AWS LBC 关于 Ingress 的 注释 Annotations 参数发现 v2.1.0 版本之后可以利用 alb.ingress.kubernetes.io/group.name 注解来指定将多个 NameSpace 里多个 Ingress 资源分组到同一个 ALB 中,可以有效减少 ALB 的数量,从而降低成本。
 

关于 Ingress 资源对象配置注意点

  • 建议使用 alb.ingress.kubernetes.io/load-balancer-name 定义一下 LB 名,方便辨别;
  • 希望多个 Ingress 资源配置到同一个 ALB 中的,记得将 alb.ingress.kubernetes.io/group.name 注释配置为同一个名字,实现使用同一个 ALB
  • AWS Load Balancer Controller 只支持 AWS Certificate Manager (ACM)证书方式管理配置 https 证书,不支持 kubernetes secret 管理方式调用 spec.tls ;所以配置支持 https 需要使用添加 alb.ingress.kubernetes.io/certificate-arn 注释方式;
  • 更多相关 注释 Annotations 参考这里
 
示例配置参考:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: alb-gateway-ingress namespace: default annotations: alb.ingress.kubernetes.io/scheme: internet-facing alb.ingress.kubernetes.io/target-type: ip alb.ingress.kubernetes.io/load-balancer-name: alb-gateway-ingress alb.ingress.kubernetes.io/group.name: alb-gateway-ingress spec: ingressClassName: alb rules: - host: gateway.yousri.org http: paths: - path: / pathType: Prefix backend: service: name: nginx-service port: number: 80 ------- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-app-name namespace: app-namespace annotations: alb.ingress.kubernetes.io/scheme: internet-facing alb.ingress.kubernetes.io/target-type: ip alb.ingress.kubernetes.io/group.name: alb-gateway-ingress # 这里使用同一个 group.name 可以实现 跨不同 命名空间 namespache 的 service 配置不同 ingress 对象共用同一个 ALB 的负载均衡入口地址及 cname 域名。 alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS": 443}]' alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:us-west-2:****** # 其中 aws load balancer controller 对于 https 域名证书管理只支持 certificate-arn 方式,并不支持 kubernetes secret 方式的 spec.tls 方式 spec: ingressClassName: alb rules: - host: httpbin.yousri.org http: paths: - path: / pathType: Prefix backend: service: name: httpbin port: number: 80

参考文档:

关于 AWS 对于 ELB 几款不同产品的功能比较