EKS部署Nginx Ingress指定internal NLB被创建为internet-facing如何解决
问题背景
核心需求:实现EKS Pod仅可通过VPN访问。
当前架构配置:
- 采用NLB转发请求至EKS Ingress
- 所有EKS节点均部署在仅支持VPN连接访问的私有子网中
- 通过如下
Chart.yaml配置完成Helm依赖安装:
dependencies: - name: ingress-nginx version: ~4.1.4 repository: https://kubernetes.github.io/ingress-nginx
- 通过如下values配置安装Nginx Ingress Controller:
ingress-nginx: controller: ingressClassResource: default: true service: annotations: service.beta.kubernetes.io/aws-load-balancer-backend-protocol: tcp service.beta.kubernetes.io/aws-load-balancer-type: nlb service.beta.kubernetes.io/aws-load-balancer-scheme: internal
异常现象:已显式配置NLB scheme注解为internal,最终创建的NLB仍为internet-facing类型,参考截图如下:
问题成因
该问题绝大多数场景由以下两个原因导致:
- 私有子网缺少ELB自动发现必需的标签。AWS负载均衡控制器(无论in-tree云提供商还是独立的AWS Load Balancer Controller)创建internal NLB时,只会选择带有
kubernetes.io/role/internal-elb=1标签的子网,若找不到符合标签规则的私有子网,会自动降级选择公有子网创建公网NLB,直接忽略已配置的internal注解。 - 注解兼容性问题。部分旧版本EKS集群的in-tree云提供商不识别
service.beta.kubernetes.io/aws-load-balancer-scheme注解,仅识别旧版的service.beta.kubernetes.io/aws-load-balancer-internal: "true"注解;同时ingress-nginx 4.1.x版本的Helm Chart存在默认公网配置覆盖自定义注解的已知问题。
修复步骤
- 标记私有子网
找到所有承载EKS节点的私有子网,为其添加标签kubernetes.io/role/internal-elb=1,若需要限定NLB部署的子网范围,可额外给目标子网添加kubernetes.io/cluster/<你的EKS集群名称>=owned标签,避免控制器自动发现公有子网。 - 更新Helm Values配置
替换原有values配置为如下内容,同时兼容新旧注解、显式关闭Chart默认的公网暴露配置、强制指定NLB部署的私有子网:ingress-nginx: controller: ingressClassResource: default: true service: annotations: service.beta.kubernetes.io/aws-load-balancer-backend-protocol: tcp service.beta.kubernetes.io/aws-load-balancer-type: nlb # 同时配置新旧两个内部LB注解,兼容不同版本控制器 service.beta.kubernetes.io/aws-load-balancer-scheme: internal service.beta.kubernetes.io/aws-load-balancer-internal: "true" # 显式指定NLB绑定的私有子网ID,多个ID用逗号分隔,彻底避免自动选到公有子网 service.beta.kubernetes.io/aws-load-balancer-subnets: "subnet-xxxxxx,subnet-xxxxxx,subnet-xxxxxx" # 显式关闭Chart默认的公网访问配置 external: enabled: false - 校验发布结果
执行helm upgrade命令更新Ingress Nginx发布版本后,运行如下命令校验Service注解是否正确注入:
确认返回结果的kubectl get svc -n <ingress-nginx所在命名空间> <ingress-nginx-controller服务名> -o yamlmetadata.annotations字段包含上述两个内部NLB注解,无其他冲突注解覆盖配置。 - EKS 1.24+版本额外校验
EKS 1.24及以上版本已移除in-tree AWS云提供商,需确认集群已安装正确版本的AWS Load Balancer Controller,避免因控制器缺失导致注解不生效。
内容的提问来源于stack exchange,提问作者Vitor Falcão
相关产品推荐
相关产品推荐

