私有EKS集群中Istio安装后的公网流量接入问题
解决方案
方案1:修改Istio IngressGateway为公网NLB
Istio默认在私有子网部署时会创建Internal NLB,你可以直接修改IngressGateway的Service配置,将其改为公网可访问的NLB:
- 编辑IngressGateway的Service资源:
kubectl edit service istio-ingressgateway -n istio-system - 找到
annotations中的service.beta.kubernetes.io/aws-load-balancer-internal字段,将值从"true"改为"false";如果没有该字段则直接添加:annotations: service.beta.kubernetes.io/aws-load-balancer-internal: "false" - 保存退出后,Kubernetes会重新创建公网NLB。同时确保:
- IngressGateway所在子网关联了**公网网关(IGW)**的路由表
- 子网安全组允许公网来源的80/443端口入站流量
- Istio IngressGateway的Listener已配置80/443端口监听(默认已配置)
方案2:用ALB直接对接Istio IngressGateway Pod
跳过中间的Internal NLB,让ALB直接将流量转发到IngressGateway的Pod,避免转发层级的问题:
- 创建公网ALB,配置时选择IP类型的目标组(支持Pod IP动态发现)
- 目标组配置:
- 目标端口设为Istio网关对外提供服务的端口(如80或443)
- 健康检查配置:端口设为
15021,路径设为/healthz/ready,协议选HTTP(这是Istio标准就绪检查端点)
- 配置ALB监听器:将80/443端口流量转发到上述目标组
- 确保:
- ALB安全组允许公网来源的80/443端口入站
- IngressGateway Pod的安全组允许ALB所在安全组访问80/443和15021端口
方案3:用CloudFront代理Internal NLB
如果必须保留Internal NLB(如合规要求),可使用CloudFront作为公网入口代理流量:
- 创建CloudFront分发,源设置为Internal NLB的DNS域名,源类型选
Custom Origin - 配置源访问控制(OAC),生成仅允许CloudFront访问NLB的政策,避免未授权访问
- 更新Internal NLB的安全组,允许CloudFront官方IP段访问80/443端口
- 配置CloudFront监听器,将80/443端口流量转发到NLB,动态内容建议禁用缓存
排查要点
之前ALB转NLB方案失败的常见原因:
- Internal NLB的安全组未允许ALB所在安全组访问80端口
- Istio网关的80端口未配置健康检查端点(默认健康检查在15021端口)
- 目标组转发规则未正确映射端口,导致业务流量无法到达Istio网关
内容的提问来源于stack exchange,提问作者tamjidul islam
相关产品推荐
相关产品推荐

