You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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类型,参考截图如下:
NLB创建结果截图

问题成因

该问题绝大多数场景由以下两个原因导致:

  1. 私有子网缺少ELB自动发现必需的标签。AWS负载均衡控制器(无论in-tree云提供商还是独立的AWS Load Balancer Controller)创建internal NLB时,只会选择带有kubernetes.io/role/internal-elb=1标签的子网,若找不到符合标签规则的私有子网,会自动降级选择公有子网创建公网NLB,直接忽略已配置的internal注解。
  2. 注解兼容性问题。部分旧版本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存在默认公网配置覆盖自定义注解的已知问题。
修复步骤
  1. 标记私有子网
    找到所有承载EKS节点的私有子网,为其添加标签kubernetes.io/role/internal-elb=1,若需要限定NLB部署的子网范围,可额外给目标子网添加kubernetes.io/cluster/<你的EKS集群名称>=owned标签,避免控制器自动发现公有子网。
  2. 更新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
    
  3. 校验发布结果
    执行helm upgrade命令更新Ingress Nginx发布版本后,运行如下命令校验Service注解是否正确注入:
    kubectl get svc -n <ingress-nginx所在命名空间> <ingress-nginx-controller服务名> -o yaml
    
    确认返回结果的metadata.annotations字段包含上述两个内部NLB注解,无其他冲突注解覆盖配置。
  4. EKS 1.24+版本额外校验
    EKS 1.24及以上版本已移除in-tree AWS云提供商,需确认集群已安装正确版本的AWS Load Balancer Controller,避免因控制器缺失导致注解不生效。

内容的提问来源于stack exchange,提问作者Vitor Falcão

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 23:09:59