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

Terraform创建GKE NEG类型Service遇NEG注解无效报错求助

GKE NEG注解无效问题排查修复方案

核心报错原因

你遇到的webhook拒绝请求问题,核心是cloud.google.com/neg注解的值格式不符合GKE NEG准入控制器的校验规则,同时配置中还存在端口映射写反、语法缺失两个隐性问题,会导致资源创建或运行异常。


具体修复点

1. 修正NEG注解格式

GKE要求cloud.google.com/neg的注解值必须是标准JSON序列化字符串,你当前写的"ingress: true"是类YAML格式,不属于合法JSON,会直接被准入webhook拦截。

  • 供Ingress使用的NEG基础配置注解合法格式为:{"ingress": true}
  • 如果需要为指定端口自定义NEG配置,可以按端口声明,例如:{"ingress": true, "exposed_ports": {"80": {"name": "nginx-http"}}}
    建议在Terraform中直接使用内置jsonencode()函数生成注解值,完全避免手写JSON的转义、格式错误问题。

2. 修正Service端口映射逻辑

你当前Service的端口参数写反了对应关系:

  • port字段:Service在集群内暴露的访问端口,对应你定义的ext_port
  • target_port字段:后端Pod实际监听的容器端口,对应你定义的int_port
    参数写反会导致NEG创建成功后,后端端口探测失败、流量无法正常转发。

3. 补全Terraform语法缺失

你提供的代码中locals.service配置块末尾缺少1个闭合大括号,执行terraform validate时会直接报语法错误,需要补上。


修正后可直接运行的配置参考

## 命名空间 ##
resource "kubernetes_namespace" "test" {
  metadata {
    name = "nginx"
  }
}

### Deployment ###
resource "kubernetes_deployment" "test" {
  for_each = local.deployment
  metadata {
    name      = each.key
    namespace = kubernetes_namespace.test.metadata.0.name
  }
  spec {
    replicas = each.value.replicas
    selector {
      match_labels = each.value.selector
    }
    template {
      metadata {
        labels = each.value.selector
      }
      spec {
        container {
          image = each.value.image
          name  = each.key
          port {
            container_port = each.value.int_port
          }
        }
      }
    }
  }
}

### Service ###
resource "kubernetes_service" "test" {
  for_each = local.service
  metadata {
    name      = each.key
    namespace = kubernetes_namespace.test.metadata.0.name
    annotations = {
      "cloud.google.com/neg" = jsonencode({
        ingress = true
      })
    }
  }
  spec {
    selector = each.value.selector
    type     = each.value.type
    port {
      port        = each.value.ext_port
      target_port = each.value.int_port
    }
  }
}

locals {
  deployment = {
    nginx = {
      selector = {
        app = "nginx"
      }
      image    = "nginx"
      replicas = 2
      int_port = 80
    }
  }
}

locals {
  service = {
    nginx-svc = {
      selector = {
        app = "nginx"
      }
      type     = "ClusterIP"
      int_port = 80
      ext_port = 80
    }
  } # 补全原配置缺失的闭合括号
}

验证步骤

  1. 配置修改后先执行terraform validate确认无语法错误,再执行terraform plan核对参数变更符合预期
  2. 执行terraform apply完成资源创建
  3. 资源创建完成后执行如下命令校验NEG状态:
    kubectl get svc nginx-svc -n nginx -o yaml
    
    如果返回结果的注解中存在cloud.google.com/neg-status字段,且字段值中包含生成的NEG名称、端口映射信息,就代表NEG配置生效。

内容的提问来源于stack exchange,提问作者이병준Byungjun Lee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 17:54:30