K8s前置AWS ALB时如何配置Ingress使流量经过Kong网关
问题核心结论
你写的第二种Ingress配置完全不会经过Kong网关,这个配置的逻辑是让AWS ALB Ingress Controller直接创建ALB规则,把/foo路径的流量直接转发到foo-service的5000端口,完全绕过了Kong代理层,属于配置逻辑错误。
正确的流量链路逻辑
当你选择用ALB作为Kong的前置入口时,整个流量路径应该是:用户请求 → AWS ALB → Kong Proxy服务 → 后端业务服务(foo-service)
这里两层组件的职责完全拆分:
- 第一层(ALB层):只做公网入口、SSL证书卸载、基础流量转发,所有请求不管什么路径,全部统一转发到Kong Proxy的服务端口,不做路径级别的后端业务路由
- 第二层(Kong层):负责所有API网关能力,包括路径路由、认证、限流、日志、插件逻辑,根据配置的Kong Ingress规则把流量转发到对应的后端业务服务
你当前配置的错误点
你给业务写的ALB类型Ingress,相当于跳过了Kong层,让ALB直接对接业务服务,把Kong整个架空,之前给Kong配置的所有插件、路由规则都不会生效。
正确配置步骤
第一步:创建唯一的ALB Ingress,全量流量转发到Kong Proxy
整个集群只需要这一个ALB Ingress对接Kong,不需要给每个业务单独创建ALB Ingress,配置示例:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: kong-alb-entry namespace: kong # 和Kong部署的命名空间保持一致 annotations: kubernetes.io/ingress.class: alb alb.ingress.kubernetes.io/scheme: internet-facing alb.ingress.kubernetes.io/certificate-arn: "你的证书ARN" alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS": 443}]' alb.ingress.kubernetes.io/target-type: ip alb.ingress.kubernetes.io/ssl-redirect: '443' spec: rules: - http: paths: - path: / pathType: Prefix backend: service: # 填写实际的Kong Proxy服务名,默认一般为kong-proxy name: kong-proxy port: # Kong默认代理端口为80,如有自定义修改为对应端口 number: 80
第二步:业务服务的Ingress仍然使用Kong类型
所有业务路由不需要加任何ALB相关注解,和你最开始使用Kong的配置完全一致,指定ingressClassName: kong即可,Kong会自动识别这些规则,处理到对应业务服务的转发逻辑,配置示例:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: foo namespace: default spec: ingressClassName: kong rules: - http: paths: - path: /foo pathType: Prefix backend: service: name: foo-service port: number: 5000
补充注意事项
- 不需要给每个业务服务单独创建ALB Ingress,所有业务都共用前面创建的公网ALB入口,路径路由全部交给Kong处理即可
- 如果需要给ALB加特殊配置(比如WAF、访问日志、安全组规则),全部在第一步的
kong-alb-entry这个Ingress的注解里添加即可,不要修改业务层的Kong Ingress - 这种架构下ALB只做入口层转发,所有网关能力还是由Kong提供,和之前直接用NLB/CLB对接Kong的使用体验没有区别,只是把最外层的负载均衡换成了ALB
内容的提问来源于stack exchange,提问作者VINAY KUMAR RT
相关产品推荐
相关产品推荐

