Istio Ingress默认创建私有子网NLB的原因及公网访问内部负载均衡应用的方法咨询
Istio Ingress默认创建私有子网NLB的原因及公网访问内部负载均衡应用的方法咨询
一、为什么默认部署会创建私有子网的NLB?
我帮你梳理几个EKS+Istio环境里最常见的原因:
- EKS子网标签的自动选择逻辑:AWS的负载均衡控制器会依据子网标签来挑选创建LB的子网。如果你的EKS集群私有子网带有
kubernetes.io/role/internal-elb: "1"标签,而公网子网没有对应的kubernetes.io/role/elb: "1"标签,控制器会自动选用私有子网部署NLB,这是AWS LB控制器的默认行为。 - Istio Helm Chart的默认配置:部分版本的Istio Ingress Gateway Helm Chart,针对AWS EKS环境默认内置了创建内部NLB的注解。你可以查看该Chart的默认
values.yaml,大概率能找到类似serviceAnnotations.service.beta.kubernetes.io/aws-load-balancer-internal: "true"的配置项——你没覆盖这个默认值,所以生成了内部NLB。 - 集群级LB配置的影响:虽然少见,但如果你的EKS集群中AWS Load Balancer Controller有全局配置默认创建内部LB,也会导致这个结果,不过这种情况通常是人为配置过的,你可以检查下控制器的部署参数。
二、如何从公网访问内部LB暴露的应用?
给你几个实用的解决方案,按需选择:
- 直接将内部NLB改为公网NLB:这是最直接的方式。你可以在重新部署Istio Ingress Helm Chart时覆盖注解:
如果已经部署完成,也可以直接编辑Ingress Gateway的Service资源,添加/修改这两个注解,AWS LB控制器会自动把NLB切换为公开的。helm upgrade --install istio-ingress istio/gateway \ --set serviceAnnotations."service\.beta\.kubernetes\.io/aws-load-balancer-internal"="false" \ --set serviceAnnotations."service\.beta\.kubernetes\.io/aws-load-balancer-scheme"="internet-facing" - 通过NAT网关中转流量:如果想保留内部NLB的架构,你可以在VPC的公有子网部署NAT网关,然后配置安全组允许公网流量通过NAT网关访问内部NLB的IP,同时调整VPC路由表让流量能正确转发。不过这种方式需要额外的网络配置,复杂度较高。
- 用CloudFront做前端代理:如果需要CDN加速或者额外的安全防护,可以配置CloudFront分发,将源设置为内部NLB的DNS名称,同时通过VPC端点让CloudFront能访问到内部NLB。这种方式适合有全球访问需求或者需要WAF防护的场景。
备注:内容来源于stack exchange,提问作者Rad4
相关产品推荐
相关产品推荐

