AWS 本身基础知识点:
首先需了解一下
AWS 几种不同负载均衡服务 Gateway Load Balancer (
GWLB ) / Network Load Balancer (NLB ) / Application Load Balancer ( ALB ) 的术语概念及 主要区别基于 EKS 服务:
有关控制器相关的 AWS Load Balancer Controller 设计实现原理机制(简写为
LBC)其中 AWS Load Balancer Controller (
LBC) 能同时提供 AWS Network Load Balancer (NLB) 和 Application Load Balancer (ALB) 服务资源,他会监听 EKS 集群服务相关 service 或者 ingress 对象资源的创建,根据不同资源创建提供不同类型产品的 Load Balancer 负载均衡服务访问入口;而据个人所见我们目前原先使用的方式其实主要都是
NLB (即 Network Load Balancer 到 Service 方式),每个产品业务服务就都会创建一个 NLB 入口,直接访问到 Service 所对应的 Pod 上;但这种相对更适合临时测试或单一业务服务场景,否则当如果拥有大量业务服务(或命名空间),那么 AWS Load Balancer Controller 默认将为每个业务服务(或命名空间)创建一个 NLB (ALB),不仅增加资源维护成本,更实际问题是会增加浪费金钱费用成本。其实每个 NLB / ALB 都可以轻松处理大量负载的,小业务量完全没必要每个单独创建一个 NLB / ALB 。所以这里建议考虑引入使用
Ingress 资源对象通过不同 rules 来控制根据个不同 hostname / route 等将请求通过同一个 ALB 分别转发到不同 NameSpace 的不同 Service ,其中默认刚开始你可能还是会遇到关于同一个 Ingress 配置 rules 涉及跨不同 NS 的 Service 的问题,以致可能还是会遇到上面括号中提及到情况,即需要为每个命名空间 (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只支持 AWSCertificate Manager(ACM)证书方式管理配置https证书,不支持kubernetessecret管理方式调用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